![見出し画像](https://assets.st-note.com/production/uploads/images/35375661/rectangle_large_type_2_4afdd4699d7b064f882921255b626e3d.png?width=1200)
Photo by
xikazu
【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とします。
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() #ウィンドウを表示