Seleniumでブラウザを操作してHTMLを取得し、BeautifulSoup4に情報を渡すまでの手順です。
準備
・BeautifulSoup4(bs4)
・Selenium
・WebDriver(配布先: //chromedriver.chromium.org/downloads)
bs4やSeleniumはpipなど使ってインストールしてください。
$ pip install beautifulsoup4
$ pip install selenium
WebDriverは使用しているChromeと同じバージョンのものをダウンロードして、「C:\driver」など自身でわかる場所に配置してください。今回は「C:\driver」で指定してSeleniumを操作します。
処理の手順
使用するライブラリをインポートしてWebドライバの設定をします。Webドライバの設定においてブラウザを非表示にするヘッドレスモードに設定するため、optionsの指定をしています。ブラウザを非表示にする必要がない場合には、「 driver = webdriver.Chrome("c:\\driver\\chromedriver.exe") 」の1行のみの記述で問題はありません。
driverの設定をしたのちにdriver.get(URL) でブラウザを立ち上げ指定のURLを開きます。WebDriverのバージョンが自身の環境に合ったものでない場合にはこの時点でエラーがでますので、エラーが出た場合にはバージョンや記述内容などの確認をしてください。
「driver.page_source 」と記述するとHTMLソースの取得が可能です。ソースをBeautifulsoupの中に入れ、"lxml"や"html5lib"などパーサーを指定するとSeleniumからBS4へHTMLソースを渡すことができます。HTMLソースを渡したらBS4側でHTMLファイルから必要なデータを抽出する処理を記述します。
サンプル
おまけ程度にBS4にHTMLファイルを渡したあとの処理も記述しました。当Webページのトップページにあるaタグを全て抽出して、href内に"http"が含まれる場合には、URLを出力するといった内容です。BS4にHTMLファイルを渡した後は基本的にはBS4による操作がメインかと思いますので、詳細は割愛します。
所見
SeleniumだけでもHTMLから情報を抜き出すことができますが、フォームに情報を記載したり、ボタンをクリックしたりなどブラウザの操作がシンプルな印象があります。BS4はSeleniumと異なり単体でインターネット上のHTML情報を取得することはできませんが、ツール等で取得したHTMLから必要な情報を抜き出すメソッドが整っている印象があります。
JavaScript により動作しているページのスクレイピングもしやすく、かつログインページの対応できます。自由にクローリングしつつ必要な情報にシンプルにアクセスできる点がSeleniumとBS4の組み合わせのメリットかと思います。
ただし、クローリングやスクレイピングが複雑になってくると、それぞれの操作の手法を調べて覚えるなど学習の手間も多少かかるかと思います。より簡単に情報を集める用途であれば、urllibやrequestsなどでHTMLを取得して、BS4で解析をする方が楽に情報を収集するのもありかもしれません。簡単にですがSeleniumとBS4を使ったスクレイピングを紹介しました。