スクレイピング(ウェブサイトの解析)をするために、コピペで使えるラッパークラスを作ったので紹介します。
ちなみにスクレイピングを行うことに関しては、完全に自己責任でお願いいたします。
サイトごとの規約を守って正しくスクレイピングしましょう。
実際のコード
まずは、スクリプトだけ見たいんだという方のためにコードを貼ります。
# 必要モジュールをインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import chromedriver_binary
class HeadlessScraping:
# コンストラクタの引数にはスクレイピングしたいURLを指定
def __init__(self, *, url):
# ヘッドレスブラウザにする
options = Options()
options.add_argument('--headless')
self.__driver = webdriver.Chrome(options=options)
self.__url = url
self.__soup = None
self.__data = {}
# BeautifulSoupのインスタンスを返すメソッド
def beatifulsoup(self):
#指定したURLのページを開く
self.__driver.get(self.__url)
#BeautifulSoupに読み込ませる、パーサーはlxmlで基本的にはトライして、ダメならhtml5libを指定
try:
self.__soup = BeautifulSoup(self.__driver.page_source, "lxml")
except:
self.__soup = BeautifulSoup(self.__driver.page_source, "html5lib")
# ブラウザ終了
self.__driver.close()
return self.__soup
使用している物の用語解説
今更ですが一応コード内で使っている物の用語解説を一言で。
- Selenium:自動でブラウザを操作できるモジュール
- BeatifulSorp:読み込んだHTML文書をパースして使い易くするモジュール
- ヘッドレス:ブラウザアプリを立ち上げずに、スクリプトだけでブラウザを操作する(スクレイピングやテストの時に有効)
- Chrome:みんな大好きGoogle Chrome
準備
必要なモジュールのインストールをします。
$ pip install selenium bs4 chromedriver_binary lxml html5lib
使い方
実際にクラスを使っていきます。
ここでは、Yahooのトップページを例にとります。
コピペしたソースコードの下に下記を追加してください
if __name__ == "__main__":
# 引数にYahooのURLを指定
hs = HeadlessScraping(url='https://www.yahoo.co.jp')
# 解析結果を受け取る
soup = hs.beatifulsoup()
#通常のBeautifulSoup同様に扱う
print(soup.title.string)
これでファイルを実行し、以下のような出力となれば成功!
$ python main.py
> Yahoo! Japan
ここでもし、chromedriver_binaryに関するエラーが出た場合は 大抵がお使いのChromeとのバージョンの違いによるエラーなので、 エラーメッセージに従って、 chromedriver_binaryのバージョンを合わせればエラーが出なくなります。