BeautifulSoup」の組み合わせです。一般的はWebページであれば、大抵はスクレイピングできます。この方法で読み取れないWebページに遭遇することがあります。Yahoo!やTwitterなど頻繁に更新されるサイトによくあります。その原因は、「ダウンロードしたHTMLファイル」と「ブラウザに表示されるHTML」が異なるからです。そのため、requestsでサーバーから直接ダウンロードしたHTMLファイルをBeautifulSoupで解読してもブラウザで見ている内容と違うのでスクレイピングできません。BeautifulSoupではスクレイピングできません。今回はこのページを題材にスクレイピングする方法を説明します。ダウンロードしたHTMLファイルと内容が異なるのか従来からの一般的なWebページの配信方法は、Webサーバーで最終的なHTMLを生成してからクライアントにレスポンスします。ページ全部をサーバーで生成するため、頻繁に更新するページではサーバーのコストがかかります。そこで、ページの生成はブラウザで行いサーバーの負担を減らす方法が考えられました。ある仕組みは、テンプレートだけのHTMLをダウンロードしておき、内容を別個にダウンロードしながらブラウザのエンジンで最終的なHTMLを構築する方法です。このような方法を採用しているWebページでは、requestsで取得されるのはテンプレートのHTMLファイルであり、最後に表示されるHTMLとは別物です。最初にダウンロードされるHTMLファイルには、Javasciptというブラウザで実行可能なプログラミング言語で記述されたコードが含まれています。このコードがブラウザで実行されてページが組み上げられます。ブラウザの表示内容を取得するには?この問題を解決するには、ブラウザのエンジンでHTMLを生成させる必要があります。WebDriverでブラウザを操作する方法です。WebDriverを使ってChromeを自動操作する方法をわかりやすく説明します。Pythonで出来ることは実に多様ですが、なかでもスクレイピングや今回のブラウ...Gammasoft.jp2019-06-12実際にChromeなどのブラウザをPythonで操作するので、ブラウザと同じ表示内容を取得できます。専用のドライバーを準備する必要があるなど少し面倒なところがあります。いうライブラリを使用します。以下のようにpipを用いてインストールできます。requests-html最新のpipを使用しないとエラーになることがあるので、先にpip自体をアップグレードします。requests-htmlは以下のように、requestやBeautifulSoup(bs4)に依存したライブラリです。内部でこれらのライブラリを利用しています。より「インターフェースなしのブラウザ(ヘッドレス)」を使うことでブラウザの表示内容を取得できます。実際にrequests-htmlを用いてプログラミングしてみます。1〜5位までをスクレイピングで取得します。ranking_list.append(item.text[2:])print(ranking_list)実行すると以下のように、1〜5位がリストで出力されます。'ノーサイド']コードのポイントは、r.html.render()を実行しているところです。これにより、ブラウザで表示される内容を生成させています。HTMLの構文解析は、BeautifulSoupでは以下のようにselect()メソッドを利用しましたが、requests-htmlではfind()メソッドで同様にCSSセレクタを指定して要素を検索できます。WebスクレイピングのためのCSSセレクタの基本Webスクレイピングでは、HTMLファイルをダウンロードし、そこからHTML要素を検索して情報を取得します。HTML要素を検索するには「CSSセレクタ」という表記方法を用います。上記でも少し触れましたが、requests-htmlはpyppeteerというライブラリにより内部でヘッドレスブラウザを起動させてスクレイピングを行います。ヘッドレスブラウザとしてオープンソースのChromiumブラウザを利用しますが、以下のようにいくつか注意点があります。初回実行時にタイムアウトエラーになることがあります初回実行時には、以下のようにpyppeteerライブラリがChromiumブラウザをダウンロードします。ここで以下のようにタイムアウトエラーになることがあります。ダウンロードは初回だけで、一度済めば次回はダウンロードしませんので、ここでエラーになる場合は何度かプログラムを実行し直してみてください。exceeded.Chromiumブラウザがダウンロードできない場合(手動ダウンロードの方法)この初回のChromiumブラウザのダウンロードがプロキシサーバーでブロックされてしまう場合は、以下の手順で手動でダウンロードします。以下のアドレスからChromium(Windows32bit用)のzipファイルをダウンロードします。https://storage.googleapis.com/chromium-browser-snapshots/Win/575458/chrome-win32.zip解凍した中の「chrome-win32」フォルダを以下のフォルダにコピーします。C:\Users\ユーザー名\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\「chrome-win32」フォルダ内のchrome.exeが以下のようなパスになっているか確認します。C:\Users\ユーザー名\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\chrome-win32\chrome.exeここで575458はChromiumのバージョンです。今回使用しているpyppeteerはversion=0.0.25ですが、今後バージョンアップに伴いChromiumが新しいバージョンに置き換えられた場合は、以下の場所にある__init__.pyファイルの中身でChromiumのバージョンを確認できます。listを実行すると確認できます。listChromiumブラウザにプロキシサーバーを指定する方法プロキシサーバーを経由する場合は、プロキシサーバーのアドレスを以下のようにHTMLSession()に指定します。同時に、session.get()でリクエストする方にも指定しておきます。"https://proxy.example.co.jp:8080"})...このようにbrowser_args=に、Chromiumブラウザ(chrome.exe)の起動オプションを指定できます。どのように使い分けるかrequests-htmlは、ブラウザと同じ内容を取得でき、BeautifulSoupを呼び出さなくてもHTMLの構文解析もできます。オールインワンのライブラリです。ChromiumというChromeのベースになっているオープンソースのブラウザを内部で稼働させるので、少し動作が重いです。BeautifulSoup」、それでスクレイピングできないWebページは「requests-html」と使い分けて利用するのがオススメです。UnlimitedでPythonを学習する3つのコツ仕事自動化におすすめの本Pythonの初歩からステップを踏みながら仕事自動化のプログラミングを学べます。弊社の中嶋が執筆しました。手書きのためのコード用ノート手書きでコーティングするためのノートをアマゾンで販売しています。ガンマソフト株式会社ガンマソフトについてお問い合わせ利用規約プライバシーポリシ。