見出し画像

【Python】Webサイトからデータ取得する「スクレイピング」のやり方

今回も伊沢剛さんの著書「めんどうな作業が秒速で終わる! Excel×Python自動化の超基本」を参考にさせていただきました。https://youtu.be/5QenNX78OoY

※スクレイピングするサイトの利用規約を確認してからご自身の判断でスクレイピングを行ってください。

1.スクレイピングに必要なライブラリをインストール

【1-1】スクレイピングに必要なライブラリをインストール

各ライブラリをインストールする

C:¥Users¥xxx> pip install tkinter
C:¥Users¥xxx> pip install beautifulsoup4
C:¥Users¥xxx> pip install pyperclip

・tkinter

・beautifulsoup4

・pyperclip

2.取得したいURLを準備 ※今回はAmazonを例としています

【2-1】取得したいURLを準備

※今回はAmazonを例としています

3.出力するエクセルを準備

【3-1】出力するエクセルを準備

※今回は日付、商品名、価格、URLを取得

エクセルのファイル名はAmazon.xlsxとします。

画像1

4.コードを実行し、エクセルに出力

【4-1】コードを実行し、エクセルに出力

コードを実行するとメッセージボックスが表示され、そこにURLを入力することでAmazon.xlsxにWeb情報が出力される

import requests
import datetime
import pandas as pd 
import pyperclip
from bs4 import BeautifulSoup 
import tkinter as tk
from tkinter import messagebox
def pasteUrl(e): #テキストボックスがクリックされた時にURLを貼り付ける
   urlText.delete("1.0","end")
   urlText.insert("1.0",pyperclip.paste())
def getData(): #データを取得してExcelブックに追加する
   url = urlText.get("1.0","end") #入力したURLを1文字目から最後まで取得
   html_contents = requests.get(url,headers = {'User-agent': 'Mozilla/5.0'}).text 
   html_soup = BeautifulSoup(html_contents,"html.parser")
   prices = html_soup.find_all("span",{"class":"a-color-price"})  #価格の取得    price = None
   for p in prices:
       if "¥" in p.text: #通貨記号がある情報をpriceとして取得
           price = p.text
           break
   item_name = html_soup.find("",{"id":"productTitle"}).text  #商品名の取得    item_name = item_name.replace("\n","") #改行を削除する
    #エクセルに書き出し    df = pd.read_excel("Amazon.xlsx")
   data = [datetime.datetime.now(),item_name,price,url]
   df2 = pd.DataFrame([data],columns= df.columns)
   df = df.append(df2)
   with pd.ExcelWriter("Amazon.xlsx") as writer:
       df.to_excel(writer,index=False,columns=df.columns)  #シートを書き出し    messagebox.showinfo("完了", "エクセルの書き出しが完了しました。")
#GUIの用意
root = tk.Tk()
root.title("エクセル書き出し") #タイトルの設定
root.geometry("700x55") #サイズの設定
root.grid()
urlLabel = tk.Label(root,text="URL")
urlText = tk.Text(root,borderwidth = 3,height =3,relief="ridge")
urlText.bind("<Button-1>",pasteUrl)
getButton = tk.Button(root,text="データ取得",command=getData)  #データ取得ボタン urlLabel.grid(row=1,column=1)
urlText.grid(row=1,column=2)
getButton.grid(row=1,column=3) 
root.mainloop() #ウィンドウを表示

この記事が気に入ったらサポートをしてみませんか?