SeleniumとBeatifulSoupでヘッドレスChromeのスクレイピングをする方法

Python, Programming09 November 2020

スクレイピング(ウェブサイトの解析)をするために、コピペで使えるラッパークラスを作ったので紹介します。

ちなみにスクレイピングを行うことに関しては、完全に自己責任でお願いいたします。

サイトごとの規約を守って正しくスクレイピングしましょう。

実際のコード

まずは、スクリプトだけ見たいんだという方のためにコードを貼ります。

# 必要モジュールをインポート
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のバージョンを合わせればエラーが出なくなります。