Pythonのスクレイピング案件に使えるライブラリ3選
スクレイピングのライブラリは選択に迷う程あります。その中でも、業務で使うのにふさわしいものをピックアップしました。クライアントさんからの要求は開発中に変化するものなので、できるだけ対応しやすいものだけにしています。
Python スクレイピングライブラリの比較
業務で求められるものは、3つ位です。
- JavaScriptで表示制御されたWEBページを拾えること
- 動作途中の画面が目で確認できること
- リンク先をクリックできること
Twitterのようにスクロールすると、何かしらの表示がされるサイトが増えました。そのため、JavaScriptでページを表示した後、つまりonload()イベント後にデータ取得しなければなりません。それと、完璧な納品物には、開発しやすさも大事です。WEBページのデザインは、年に数回変わることもあります。そのため、タグを正規表現で調べながらデータを取得するのではなく、XPath又はCSSセレクターによって得られる必要があります。
さらに、人が操作しているように動作させる都合上、リンク先のURLを呼び出すのではなく、スクレイピングするページへの移動は、タグのクリックが前提です。そして、収集先サイトに迷惑を掛けないように、時間をおいてリクエストするようにするため、ページ遷移の時間は10秒と遅くする必要があります。
ライブラリ | Selenium | Pypeteer | Request-HTML |
---|---|---|---|
JavaScript使用ページ | 〇 | 〇 | 〇 |
ブラウザ表示 | 〇 | 〇 | 〇 |
スリーンショット | 〇 | 〇 | 〇 |
Seleniumの特徴
最もメジャーで、情報が入手しやすいライブラリです。本来、WEBアプリケーションの自動テストツールとして作成されたもので、ブラウザーのベンダーが提供しているWebDriver APIを経由して、ブラウザを外部から操作することでスクレイピングしています。Chrome FireFox Edgeに対応しています。
Pyppeteerの特徴
Seleniumと同様にブラウザを制御してスクレイピングしますが、Chrome限定です。また、非同期処理が前提になっており、await/asyncを使ってPyppeteerを呼びます。同時に複数のサイトにアクセスする案件に向きています。
Requsts-HTML
JavaScriptに対応していないRequstsを拡張したライブラリで、内部で他のライブラリを利用することでJavaScriptを使用したページを解析可能にしています。サイトから取得したデータをPyppeteerでレンダリングします。その結果生成されたHTMLをスクレイピングをする作りになっています。HTMLの解析に高速なlxml/pyqueryを使用するため、慣れていれば使い勝手がいいでしょう。
Selenium 画面外要素のclick()で例外が発生する場合の対処法
WEBページ内のリンク先にページ遷移したい時があります。
<p>あれやこれや</p> <a class="hogehoge" href="..." >Python 書籍</a><!-- 画面外 -->
aタグにhrefを取得して、そこへ直接したいところですが、イベントを設定しているかもしれません。そんな時は、次のようにしてclick()でリンク先に飛ばします。
import sys import time from selenium import webdriver tag = webdriver.find_element_by_css_selector("a.hogehoge") tag.click()
しかし、ブラウザの画面外にaタグがあると、例外が発生します。
Selenium-Debugging: Element is not clickable at point (x,y)
こんな時は、スクロールしてclick()します。
import sys import time from selenium import webdriver tag = webdriver.find_element_by_css_selector("a.hogehoge") webdriver.execute_script("scroll(0, y)") time.sleep(2) tag.click()
しかし、スクロールせずにclick()する方法もあります。
import sys from selenium import webdriver tag.find_element_by_css_selector("a.hogehoge") webdriver.execute_script("arguments[0].click();",tag)
コメント
[…] 【Python】スクレイピング案件に使えるライブラリ3選Pythonのスクレイピング… […]