スクレイピング内容をスプレッドシートに自動で入力する
クラウドソーシングに絶えず投稿されている業務内容に、「指定のWEBサイトの情報を取得し表計算ソフトにデータを入力する」というものがあります。今回行う流れは、このような形になります。
用意するもの
まだインストールしていない方は pipなどを利用して すべてインストールしてください。
$ pip install requests
$ pip install beautifulsoup4
$ pip install google
$ pip install gspread
$ pip install oauth2client
- ・Python3
- すべてのプログラムで動作します。
- ・Requests
- pythonでWebサイトにアクセスするために利用するライブラリです。
- ・Beautiful Soup 4 (bs4)
- WebサイトのHTMLをパースし、要素を取得するライブラリです。
- ・gspread
- pythonからスプレッドシートにアクセスするためのモジュールです。
- ・oauth2client
- スプレッドシートにアクセスする際の認証モジュールです。
1.実際にスクレイピングをする
今回は業務でありそうな内容を考えてみました。
「alibabaで検索して出た商品の商品情報を取得し、スプレッドシートにデータ入力」
という感じで行きたいと思います。
少なからずプログラミングができなければいけないので、できない人はpaizaラーニングの動画を見まくってください。
URLを解析
まずは、Alibabaの検索結果のリンクを解析します。
Alibabaの検索バーに「アイス」と入力し、検索します。
すると、リンクは以下のようになります。
https://japanese.alibaba.com/trade/search?IndexArea=product_en&CatId=&fsb=y&viewtype=&tab=all&SearchScene=&SearchText=%E3%82%A2%E3%82%A4%E3%82%B9
どうやら、 searchText= 以下が検索したワードになっているようです。
詳しくは長くなるのでここでは省略しますが、一般的には日本語をHTML内に表記する際には「URLエンコーディング、デコーディング」が利用されています。今回はWeb上のツールでデコードしてみましょう。
UTF-8 規格でデコードされていることがわかりました。
では実際に、作業フォルダを作り、pythonファイルに「指定したワードで検索した結果のURL」を生成するプログラムを記述していきます。
from urllib.parse import quote
# URLエンコードするワード
keyword = "アイス"
# URLエンコード
encoded_keyword = quote(keyword, encoding='utf-8')
# URL生成
url = "https://japanese.alibaba.com/trade/search?tab=all&searchText=" + encoded_keyword
HTMLを取得しパース
では、検索したいワードからアクセス先のページのURLを生成することができたので、次は実際にアクセス先のHTMLを取得します。
今回は、RequestsとBeautiful Soupを利用します。
import requests
from bs4 import BeautifulSoup
# URLにアクセスしてHTMLを取得
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
要素から取得したい情報を取得
Webページを開き、F12キーから開発者ツールを開き商品名が隠れているタグを探します。
商品名が、h2 タグに含まれていることがわかりました。
この要領で、商品名と値段を取得し並べて出力されるコードを記述します。
for product in soup.find_all("div", class_="list-no-v2-main"):
title_element = product.find("h2")
title = title_element["title"]
price = product.find("span", class_="elements-offer-price-normal__price").text
print("商品名: "+title)
print("値段: "+price)
2.スプレッドシートに入力
欲しい情報を取得することに成功したので、それをスプレッドシートに自動入力する作業に入ります。
gspreadのセットアップ方法については、以下の記事を御覧ください。
https://qiita.com/akabei/items/0eac37cb852ad476c6b9
セットアップするコード
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('<JSONファイル名>.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open('gspreadサンプル').sheet1
リストを作成し、内容をスプレッドシートに自動入力
sheet_name = 'alibaba'
worksheet_name = 'test'
sheet = gc.open(sheet_name).worksheet(worksheet_name)
for product in soup.find_all("div", class_="list-no-v2-main"):
title_element = product.find("h2")
title = title_element["title"]
price = product.find("span", class_="elements-offer-price-normal__price").text
print("商品名: "+title)
print("値段: "+price)
header = ["title", "price"]
data_list = [header]
data_list.append([title,price])
values = [title,price]
sheet.append_row(values)
タイトルと価格を取得した後、それぞれを表示します。その後、Googleスプレッドシートにデータを追加するための行を作成します。最初に、ヘッダー(列の名前)を追加します。それから、タイトルと価格を含むリストを作成し、データリストに追加します。