Pythonで自動化しよう・・・(続編)
なんとかできました。
悩みに悩みましたがなんとかできました。
指定した文字に関する検索結果のタイトル、URLを指定した個数だけ抜き取ることができました。
これでEWI USBに関する記事を効率的に収集することができます。
今回も同じお題で悩んだと思われる先人たちのお仕事の内容に感謝です。
そういうものが無かったら、短期間で作ることは到底できるものではないですね。
それでは、いつものように今後、僕と同じお題で悩む可能性のある人たちや自分自身の備忘録としてやったことを記録しておきます。
お題の確認
お題は、広く言えばWebスクレイピングになります。
もう少し具体的に書くと、大きくは以下に示す2つです。
1)指定した単語に関係する動画をYoutubeの中で検索しリスト化する。
2)指定した単語に関する情報をWebで検索し結果をリスト化する。
それでは、これをやるための作業を、事前準備から順をおって記載します。
事前準備
今回もMac上に仮想環境を構築して、そこにPythonの必要なライブラリをインストールして動かしました。
今回使用したライブラリは、以下
・Requests:HTTP通信ライブラリです。Webサイトの情報取得や画像収集ができます。
・BeautifulSoup:HTMLやXMLからデータを引き出すことができるライブラリです。
・lxml:HTMLを解析するためのライブラリです。
・gspread:スプレッドシートを操作するためのライブラリです。
また、今回は処理結果をGoogleスプレッドシートに記載するようにしましたので、Google CloudでのAPIの有効化も行いました。
Pythonコードの構成
それでは、悩みに悩んだWeb検索結果のリスト化のためのPythonコードの構成について記載します。
1)ライブラリーの読み込み
import requests
import bs4import re
import json
import lxml.html as lx
from lxml.html import fromstring
import gspread
from oauth2client.service_account import ServiceAccountCredentials
2)ブラウザを模擬する
なんのこと?と思われると思いますが、これが今回の悩みの種のところです。
Webから情報を収集するためにはWebのHTMLタグのClassに関する情報を
把握しておく必要があります。
例えば、class='r'のaタグ、とか、class's'のstタグ、とか。
これが昔の内容と違っており(管理元が変えたようです)、ネットに流れている
情報(Pythonコード)では目的とする情報を入手できませんでした。
同じ悩みにぶち当たった人がいたようで、その人のやり方としては、Pythonプログラム
上でブラウザを模擬する、というものでした。
そのためのコードがコチラ。 おまじないのようで意味はよく判りまっせんでした。
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
3)Googleスプレッドシートの準備
検索結果を記載するGoogleスプレッドシートの準備をします。
このためには、 Google Cloudにおけるクレデンシャルの秘密キーとGooglesスプレッド
シートキーの準備が必要です。
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('クレデンシャルの秘密キーのファイル名称を記載します', scope)
gc = gspread.authorize(credentials)#用意したスプレッドシートキーを指定する
SPREADSHEET_KEY = 'スプレッドシートキー名称を記載します'
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
4)キーワード使って検索してHTMLを取得します。
keyword = 'EWI USB'
response = requests.get('https://www.google.co.jp/search?hl=jp&gl=JP&num=30&q=' + keyword, headers=headers )
上は、EWI USBというキーワードをプログラムの中に書いていますが、
Googleスプレッドシートに書いたキーワードを使っても検索できます。
そうする場合には、コチラ。(B3セルにキーワードを記載します)
#B3セルの値を検索クエリとして受け取る
search_query=worksheet.acell('B3').value
print(search_query)
5)取得したHTMLからタイトル、リンク、説明文を取得する。
タイトルとリンクはclass='r'のaタグから、説明文はclass's'のspanタグから取得します。
# 取得したHTMLをパースする
bs = bs4.BeautifulSoup(response.text, 'html.parser')# 検索結果のタイトルとリンクを取得
element = bs.select('.r > a')
title_list =
url_list =for i in range(len(element)):
# タイトルのテキスト部分のみ取得
title = element[i].get_text()
# リンクのみを取得し、余分な部分を削除する
url = element[i].get('href').replace('/url?q=','')
title_list.append(title)
url_list.append(url)
6)画面(ターミナル内)出力とGoogleスプレッドシートへの出力
for i in range(len(title_list)):
#画面(ターミナル内)出力
print(title_list[i])
print('['+ url_list[i] +']')
print('')
#Googleスプレッドシートへの出力
worksheet.update_cell(i+6,3, title_list[i]) #update_cell(行,列,上書きする値)
worksheet.update_cell(i+6,4, '['+ url_list[i] +']')
長くなりましたが以上です。
処理結果
EWI USBを検索してみました。 結果はコチラ。 29件抽出しました。
製品情報:EWI USB:AKAI professsionalewi.akai-pro.jp › ewiusb
http://ewi.akai-pro.jp/ewiusb/
Akai EWI USB - アマゾンwww.amazon.co.jp › AKAI-EWI-USB-ウィンドシンセ...
AKAI EWI USB 価格比較 - 価格.comkakaku.com › ... › その他デジタル楽器 › AKAI(アカイ)
https://kakaku.com/item/K0000004949/
AKAI ( アカイ ) >EWI USB 送料無料 | サウンドハウスwww.soundhouse.co.jp › ... › AKAI ( アカイ )
https://www.soundhouse.co.jp/products/detail/item/132544/
AKAIのウインドUSBコントローラ「EWI USB」が復活!専用ソフト ...info.shimamura.co.jp › digital › newitem › 2015/01
https://info.shimamura.co.jp/digital/newitem/2015/01/38287
(途中省略)
ウインドコントローラー、AKAI Professional『EWI USB』をDTMに ...kohrogi.com › レビュー › 楽器・ハードウエア
EWI-USBの中古/新品通販【メルカリ】No.1フリマアプリ - Mercariwww.mercari.com › search › keyword=EWI-USB
https://www.mercari.com/jp/search/?keyword=EWI-USB
AKAI EWI5000、EWI4000S、EWI-USB(Aria音源)の吹き比べewifan.com › ewi5000-2
注意事項
スクレイピングを禁止しているサイトやスクレイピング用のAPIを提供しているサイトがあります。
スクレイピングを行う際にはそのサイトでスクレイピング が禁止されているかどうかをよくチェックする必要があります。
また、膨大な量の情報検索はサーバーの負荷を上げてしまいますので避ける必要があります。
つつましやかに活用すべきですね。
(参考図書)
今回はスクレイピングのさわりを勉強しました。
利用には注意が必要ですが、YoutubeはAPIを提供していたりと活用シーンは色々とありそうです。
より上手に使うためには、もっと基礎的かつ体系的な知識が必要であることを今回の件で痛感した次第です。
Amazonで探してみるとありました。
これを手配しようと思います。