1. 動的ページへのイントロダクション
サイトからデータをスクレイピングしようとしたとき、JavaScriptを使ってリアルタイムでコンテンツを更新するサイトに当たったことがあるなら、これは本当にパズルのように思えることがあるよね。でも、心配しないで!よく言う通り、どんなに複雑なコードでも、設定次第で魔法のように見えるようにできるんだ。では、ライブラリrequests_html
がこうしたコンテンツとどう付き合うのか見ていこう。
よく知られているように、すべてのウェブページが同じくらい有用ってわけじゃないんだ。一部のページはすぐにコンテンツをロードするけど、他のページはJavaScriptを使って動的に生成したり更新したりすることがある。これがデータを取り出したい人にとっては少しばかり面倒なことになる。というのも、開発者ツールを使って見えるHTMLと、普通のリクエストで取得するHTMLが違うことがあるからなんだ。
動的コンテンツをスクレイピングする際の問題
多くのウェブ用ライブラリ(例えばrequestsみたいなやつね)は、サーバーのレスポンスだけに依存して動作するから、JavaScriptを実行できないんだ。つまり、コンテンツがJavaScriptを使ってロードまたは変更されている場合、普通のリクエストではそれを全く見ることができないことがあるんだ。
2. ライブラリrequests_html
の使用
ここで登場するのがrequests_html
だ。これはライブラリrequestsの簡潔さとブラウザのJavaScript実行性能を融合させたものなんだ。これを使えば、まるで本当にブラウザを使っているみたいに動的なウェブページとやりとりすることができるよ。
ライブラリのインストールと設定
まずはじめにrequests_html
をインストールしよう。お気に入りのターミナルを開いて次のコマンドを実行してみて:
pip install requests-html
これでライブラリがインストールされたよ!さぁ、これを使ってみよう。
requests_html
を使ったJavaScriptコンテンツの取得の基本
requests_html
は私たちの生活をもっと簡単にしてくれるんだ。じゃあ実際にこれがどう動くのか見てみよう。例えば、JavaScriptを通じてデータを生成するページがあるとするよね。
from requests_html import HTMLSession
# HTMLセッションを作成する
session = HTMLSession()
# ウェブページにリクエストを送る
response = session.get('https://example-dynamic-page.com')
# JavaScriptをレンダリングする
response.html.render()
# データを抽出する
data = response.html.find('#dynamic-content', first=True)
print(data.text)
これぞ魔法!普通のrequestsと違って、requests_html
は.render()
メソッドを提供してくれるんだ。これを使うことでページを「実行」し、JavaScriptを処理できるようになる。ページが「動き出す」と、以前学んだセレクターを使って必要なデータを抽出することが簡単にできるんだ。
3. データ抽出の例
それでは、もっと深掘りしていくつかの例を見てみよう。これでrequests_html
がどんなシチュエーションでも役に立つことが分かるはずだよ。
動的ページからデータを抽出する実践例
例えば、スクロール後に最新ニュースが読み込まれるページを考えてみよう。requests_html
なら、ユーザーの動作を模倣することができるんだ。
url = 'https://example-news-site.com'
# ページを読み込む
response = session.get(url)
# 必要に応じてタイムアウトを延ばしてレンダリングを実行する
response.html.render(timeout=20)
# ニュース項目を見つける
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
こんな感じで、以前は捉えにくかったコンテンツに楽々アクセスできるようになるんだ!
requests_html
を使ったJavaScriptコンテンツの処理
requests_html
と、前の講義で学んだCSSセレクターを使えば、ウェブページ上のコンテンツをまるでスクレイピングの達人のように扱えるよ!
# ニュース見出しの最初の要素を選択する
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# 要素からリンクを抽出する
link = headline.find('a', first=True).attrs['href']
print(link)
4. 実践的なアドバイスとテクニック
requests_html
は強力なツールだけど、それを使う際に覚えておくべきいくつかのことがあるんだ:
- タイムアウトと遅延: より複雑なページの場合、レンダリングタイムアウトを設定するのを忘れないでね。これで遅いダウンロードによるエラーを避けやすくなるよ。
-
レンダリングのリソース:
requests_html
はJavaScriptをレンダリングするため、多くのリソースを消費することがある。特に大規模なデータや複雑なページの場合、プロセスが遅くなる可能性があるんだ。 -
CAPTCHAとボット防止対策:
requests_html
はアンチボット保護やCAPTCHAを回避する機能を持っていないよ。だから、もっと難しいケースではSeleniumを使ったほうがいいかもね。
GO TO FULL VERSION