【Python】スクレイピング案件に使えるライブラリ3選

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)

コメント

  1. […] 【Python】スクレイピング案件に使えるライブラリ3選Pythonのスクレイピング… […]

タイトルとURLをコピーしました