Pythonでウェブスクレイピング
この記事のまとめ:
Pythonでウェブスクレイピング(ウェブクローリング)する上で基本的な処理として下記を紹介しています。
- Refequestsライブラリを使ったHTMLの取得方法
- Seleniumを使ったJavaScript対応ページのHTMLの取得方法
- robots.txtの確認方法
- Beautiful Soupを使ったHTML解析方法
- ウェブスクレイピングの利用例
背景:
仕事や趣味でウェブページから手早く取得するためにウェブスクレイピングをやってみようと思った次第で、意外と簡単にできたのでその作業をまとめております。
もくじ
- Refequestsライブラリを使ったHTMLの取得
- Seleniumを使ったJavaScript対応ページのHTMLの取得
- robots.txtの確認
- Beautiful Soupを使ったHTML解析
- ウェブスクレイピングの利用例
1. Requestsライブラリを使ったHTMLの取得
Requestsとは
Requestsとは、本家のホームページの説明を参照すると、
Requestsは、人が使いやすいように設計されていて、Pythonで書かれている Apache2 Licensed ベースのHTTPライブラリです。
とのことです。Python用のHTTPライブラリとしては、httplib2などがありますが、確かに必要な手順が多いので使いにくいです。
Requestsのインストール
pipがインストールされていれば下記でインストールできます。
Condaでインストールする場合には下記でインストールできます。
Requestsの使い方
例えば、HTTP GETコマンドで指定したURLからHTMLを取得する場合には下記のコード(ここではYahoo!Japanのホームページを対象にしています)だけで取得できます。
スクレイピングするだけであれば基本的にはHTTP GETコマンドが使えれば十分だと思いますが、Requestsライブラリを使えばHTTP GETコマンドだけでなく、POST、PUTなどのコマンドも容易に使えますし、コマンドと一緒にcookieやheader、proxy、パラメーターなども使うことができますので、特殊なサイトにも対応できます。
2. Seleniumを使ったJavaScript対応ページのHTMLの取得
Requestsではだめなのか?
上記のRequestsを使って大体のページのHTMLを取得することはできると思いますが、一部JavaScriptでHTMLを生成するページがあります。
例えば、Amazonの検索結果をRequestsで取得しようとしても取得できません。試しにやってみます。下記ではpythonというキーワードをAmazonで検索するURLからGETコマンドを行っています。
ブラウザなどJavaScriptが動いている状態での検索結果は、<div id="atfResults">
というタグで囲われた中にリスト上になって表示されているはずですが、JavaScriptが動いていないとこのタグ自体見当たらないはずです。
そこで、Seleniumの出番です。
Seleniumとは
ウェブブラウザを自動操作するツールです。スクレイピング用というわけではありませんが、ウェブブラウザを操作できるのでウェブブラウザがJavaScriptを動かしてその結果取得したHTMLも取得可能なわけです。
Seleniumのインストール
pipでインストールする場合には下記でインストールできます。
Condaでインストールする場合には下記でインストールできます。
FirefoxをSeleniumで使う
今回はFirefoxをヘッドレス(画面を表示させずに使用する)モードで使用することを前提に進めますので、Firefoxをまずはインストールしておきます。
また、Firefoxはgeckodriverが提供するHTTP APIで操作されるので、geckodriverをインストールしなければなりません。
geckodriverはこちらからダウンロードできますので、動作環境に適したファイルをダウンロード、解凍を行い、実行ファイルを任意のディレクトリに保存しておきます。また、Linux系の場合は実行権限も与えておく必要があります。
PythonでSeleniumを使ってFirefoxをヘッドレスモードで動かす
Requestsの時と比べるとだいぶコードは増えますが、下記でFirefoxを使ってウェブページのHTMLを取得できます。Firefoxとgeckodriverのパスは環境に応じて変更してください。
上記のコードでは、Requestsのときには取得できなかったAmazonの検索結果が取得できているはずです。
(2019.1.13追記) Seleniumでブラウザを使うときは必ずdriver.close()
でブラウザを閉じるように実装します。エラー終了した場合でもブラウザのプロセスは生き続けるためです。エラーはWebサーバー側の問題でも起こることがありますので、try
文でエラー処理をすることをお勧めします。
3. robots.txtの確認
robots.txtとは
ウェブサイトによってはスクレイピングのようにロボットによるクローリングを禁止しているサイトがあります。これを守らないと利用規定違反にもなりますし、技術者としての倫理的にも反しますので必ず守りましょう。そしてその情報が書かれているファイルが robots.txt です。スクレイピングする場合にはスクレイピング先のサイトのrobots.txtに記述されている内容に従いましょう。robots.txtの見方などは他の解説記事など参照していただくとして、ここではPythonでのrobots.txt用のparserライブラリであるreppyを使ったrobots.txtの扱い方を紹介します。
reppyのインストール
pipでインストールする場合には下記でインストールできます。
Windowsの場合は、reppyのインストール時にVC++ 14.0を使ったコンパイルを伴うため、Visual Studio 2015 (Communityで可)をインストール(Windows 10 SDKとC++が必須)しておく必要があります。Visual Studio 2015 Communityはこちらからダウンロードできます。なお、適切なVC++ 14.0がインストールされていないと下記のようなエラーが表示されると思います。
reppyを使う
サンプルとして下記のコードではツイッターのrobots.txtを読み込み、任意のツイッターページ(今回は私のツイッターアカウント)に対してクローリング可能かどうかと、Crawl_delayの値を取得しています。クローリング可能であれば、result
の中にはTrue
が返され、delay
の中には小数点でCrawl_delayの値が返されます。robots.txtにCrawl_delayが設定されていない場合にはNone
が返されます。
4. Beautiful Soupを使ったHTML解析
Beautiful Soupとは
公式ドキュメントの日本語訳のページから引用させていただくと下記の通りです。
Beautiful Soup はHTMLやXMLファイルからデータを取得するPythonのライブラリです。あなたの好きなパーサー(構文解析器)を使って、パースツリー(構文木)の探索、検索、修正を行います。 これはプログラマーの作業時間を大幅に短縮してくれます。
Beautiful Soupを使うことで任意のタグのパラメーターやタグの中身の取得等が容易にできます。
Beautiful Soupのインストール
pipでインストールする場合には下記でインストールできます。
Condaでインストールする場合には下記でインストールできます。
Beautiful Soupを使う
ここでは一例としてAmazon.co.jpのプレスリリースのタイトルを取得してみます。
プレスリリースの一覧は<section class="element_newslist" >
タグの中に<ul>
タグによってリスト状になっており、<h3>
タグにプレスリリースのそれぞれのタイトルが書かれています。それを一括して取得するサンプルを下記に記します。
こうやってかなり簡単に書けることがわかります。スクレイピングする場合、ウェブサイトに応じてタグのIDやClassが異なりますので、ウェブサイトごとに調整が必要ですが、慣れれば比較的簡単に対応ができます。なお、スクレイピングしたい個所を特定するのには、Google Chromeブラウザの開発者向けツールを使ってHTMLを分析するのがおすすめです。
5. ウェブスクレイピングの利用例
ウェブスクレイピングしていると画像をダウンロードしたいというときも出てくるのではないかと思います。その際は、下記の記事が参考になるかもしれません。
これをウェブスクレイピングと組み合わせると下記のようなものもできたりします。
また、ウェブスクレイピングすると自然言語解析をしたくなることもあります。その際は、下記の記事が参考になるかもしれません。
今回は以上です。 最後まで読んでいただき、ありがとうございます。
コメント
コメントを投稿