【Python3】ウェブスクレイピング(Requests-HTMLライブラリを利用して動的ページをパース)

[スポンサーリンク]


Python3で動的ページをウェブスクレイピング


Python3でjavescript等が使用されている動的ページをウェブスクレイピングをしてみたいと思います
Requests-HTMLライブラリで、ウェブから最終的に表示されるHTMLを取得します


requestsライブラリでは動的ページがスクレイピング出来ない


以前、気象庁様のサイトから天気用法を取得するウェブスクレイピングをする方法をpythonで試してみました
requestsライブラリでウェブからHTMLを取得し、Beautiful SoupライブラリでそのTHMLをパースしています

【Python3】ウェブスクレイピング(BeautifulSoupライブラリを利用してパース)
Python3でウェブスクレイピングPython3でウェブスクレイピングをしてみたいと思います下記の2ステップで、ウェブから必要な情報を取得します①reauestsライブラリで、ウェブからHTMLを取得②...

しかし2021/03/01時点ではこの方法では、気象庁様のサイトから天気予報が取得出来なくなっています
気象庁様のサイトが更新され、ブラウザ側で処理する作りに変わっていることが原因です


requestsライブラリでHTMLを取得


大阪府の天気予報を取得してみようと思います
現在の気象庁様のサイトで大阪府の天気予報は以下のサイトで発表されています

気象庁|天気予報

以前と同じくrequestsライブラリでHTMLを取得してmi ます
【Webスクレイピング対象URL】を”https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=270000″にして実行します

取得結果が以下です
以前と違って、scriptが実行されるコードが返ってきています
ブラウザで表示されている天気予報や気温などの数値が取得出来ていないことが分かります

[スポンサーリンク]


Requests-HTMLライブラリで動的ページをスクレイピング



Requests-HTMLライブラリとは


PythonでHTMLをパースすることが出来るライブラリです

requestsライブラリとの大きな違いの1つが、JavaScriptを完全サポートしていることです
このライブラリを使用することで、JavaScriptが生成したHTMLコードを取得することが出来ます

また、Beautiful Soupライブラリと同様にパースも行うことが出来ます

requests-HTML v0.3.4 documentation

Requests-HTMLライブラリのインストール


Requests-HTMLライブラリはpipコマンドでインストールすることが出来ます

インストールした時点では0.10.0がインストールされました


pyppeteerライブラリのインストール


次にpyppeteerライブラリをインストールします
pyppeteerライブラリはChromeのヘッドレスモードを操作するライブラリです

ヘッドレスブラウザと呼ばれるもので、よく使っているEdgeやChromeのアプリでの画面表示ではことなり描写は行いません
JavaScriptのテスト等の為に、グラフィック描写をせずにScriptの実行などのみを行う為に使用します

Requests-HTMLライブラリを初回に実行した際に、自動でインストールされますが、今回は事前にインストールを行います
Requests-HTMLライブラリと同様にpipコマンドでインストール出来ます

Pyppeteer’s documentation — Pyppeteer 0.0.25 documentation

<class ‘pyppeteer.errors.browsererror’> Browser closed unexpectedly:


この後に実際にスクレイピングした際に、pyppeteer.errors.BrowserErrorが発生しました

調べていると下段のページに辿り着きました(非常に助かる情報でした)
pip install pyppeteerだけでは必要なライブラリが全てインストールされないようです

こちらの情報を元に、必要と記載されているライブラリをインストールするとエラーが発生しなくなりました
ヘッドレストモードで起動する場合でも、X Window System等が必要なのかもしれません

CentOS7でPuppeteerを使う - Qiita
JavaScriptでDOM操作をして要素を出力しているページに対してスクレイピングを行うためにPuppeteerが必要になりそうでしたのでさわりだけ試しました。 とりあえず動かしてみたい とりあえずREADME.mdの最初のス...
can't run puppeteer in centos7 · Issue #391 · puppeteer/puppeteer
Server Info: CUP: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz MemTotal: 1016396 kB OS:CentOS Linux release 7.3.1611 (Core) Node:v8.4.0 when I try to run my app...

[スポンサーリンク]


Requests-HTMLライブラリで動的ページの表示されるHTMLを取得


Requests-HTMLライブラリを使用して動的ページの表示されているHTMLを取得していきます


Requests-HTMLライブラリ 動的ページHTML取得 サンプルコード


・HTMLを取得するURLを設定

・Requests-HTMLのセッションを作成しソースコードを取得

・JavaScriptをレンダリング
 render()でレンダリングをしてJavaScriptの実行結果を取得
 asyncの場合は、arender()を使用
 ※timeout、sleepは後述


Requests-HTMLライブラリを使用してもJavaScriptの実行結果が取得出来ない場合


サンプルコードの【Webスクレイピング対象URL】に、気象庁様の大阪府の天気予報のサイトをして実行しました
しかし、取得されたのはrequestsライブラリと同じくJavaScritptが含まれたコードでした

こちらは、下記のサイト様の情報を基に、render()にtimeoutとsleepを設定することで解消することが出来ました
レンダリングが未完了でも後続処理が進むようです

timeout=0(無制限)、sleep=10を設定することでレンダリング後のHTMLを取得出来ました

pythonでスクレイピングする際に利用するライブラリ比較 – rinoguchiブログ

「くもり 時々 晴れ」のように、JavaScriptの実行結果が取得出来ていることが分かります
これでJavaScriptを使用した動的なページも、実行結果として生成されたHTMLが取得することが出来ます

[スポンサーリンク]


Requests-HTMLライブラリでパース


Requests-HTMLライブラリはパースライブラリです
取得したHTMLをパースしてみます
HTMLタグやCSSセレクタでのパースに対応しています


Requests-HTMLライブラリでパース サンプルコード


・CSSセレクタを指定して要素を取得
 #でCSSセレクタを指定して要素を取得

・HTMLタグを指定して要素を取得

・取得した要素のHTMLを取得

・取得した要素のTEXTを取得


Requests-HTMLライブラリでコードを取得してBeautiful Soupライブラリでパース サンプルコード


Requests-HTMLライブラリを使ってHTMLコードを取得することが出来ます
HTMLコードが取得出来ているので、Beautiful Soupライブラリでパースすることも可能です
下段のサンプルコードと実行結果の様に、上述のRequests-HTMLライブラリのパースと同じ様な値を取得することも出来ます

・Requests-HTMLで取得した結果をBeautiful SoupでHTML形式でパース