#コーディング
PythonでWebスクレイピングデビューしてみた

あるサイトに含まれるリンク一覧を取得したいという要望があった。最初PHPでやろうとしたのだが、スクレイピングでググるとPythonの記事ばかり出てきてPython書けって言われてる気がしたのでPythonで書くことにした。

Pythonをインストール

以下Windows10環境
https://www.python.org/
のトップからポチッとダウンロードすればいいと思いきや、ここからだとどうも32bit版っぽい上に環境変数がうまく通らなかった。ので
https://www.python.org/downloads/release/python-365/
からWindows x86-64 executable installerをダウンロードしてインストールすればよさげ。インストールする際は環境変数を通すオプションに忘れずにチェックしておこう。
インストールできたら通例通り

とか打ってインストールできているか確認しておく

 ライブラリの選定

で、スクレイピングってどうやるんだ?って考えると要するにcurl的なコマンドでgetしてある条件に合致したものを出力すればよい。条件は頑張って正規表現書けばいいのだろうが、どう考えても非効率的なのでスクレイピングに適したライブラリを探して使うべきだ。
「Python スクレイピング」とかって調べるとすぐにBeautifulSoupを使えって言われる。
BeautifulSoup
なるほど、多機能そうだしPythonでスクレイピングするならこれ!といった感じはする。が、複雑なことするわけじゃないしもっと簡単なライブラリはないかと思って調べたところpyqueryに行き着いた。
pyquery
名前からお察しの通りjQueryライクな書き方ができるので、Web系の人間にはとっつきやすそう。

でインストールする。
下準備はこれでOK。コードを書いていこう。

とりあえずprintしてみる

適当にscraping.pyなどというファイルを作成し、コードを書いていこう。
とりあえずpyqueryを読み込む

で、取得したいURLを指定してpyqueryで拾ってくる。

今回はサンプルとして弊社コーポレートサイトのフッターにあるリンクを全て取得する。フッターに全ページへのリンクが貼られている場合が多いので、応用すればサイトマップを作成するなどにも役立つだろう。
「フッターのリンク」を指定するためにDOM構造を解読する。デベロッパーツールを用いて眺めてみると”nav.l-footer-navi”の中のリンクを取れば良さそうだということが分かる。今回は単純なDOM構造なので使う必要はないが、より詳細な指定をしたい場合はデベロッパーツールのセレクタをコピーする機能を用いるといいだろう。

こんな感じの詳細なセレクタを取得できる。
要素を取得したら、for文で回してリンクテキストとリンク先を出力してみる。

これだけ、超簡単。実行してみよう。

って打って

のように一覧が出力されれば成功。
なのだが、このままだと黒い画面上で結果が見れるだけなのでイマイチ使い道がない。これらをcsvなりjsonに吐き出しておけばあとでなにかしたい時便利そう。
今回はjsonに出力してみる。

jsonに書き込む

先立ってゴールを示すと

こんな感じのものを吐き出したい。
htmlを取得してその中の任意の要素を取り出すところまではさっきと同じ。
PythonではPHPでいうところの連想配列のことを辞書(ディクショナリ)と呼ぶ。つまり、先程取得できたタイトルとURLを辞書に突っ込んでjsonに書き込めばいいのだろうというアタリはすぐにつく。
で、連番振りたいんだけどどうすりゃいいの?ってところで出てくるのがenumerate関数。これを使えばインデックス番号(連番)と要素をスマートに出力できる。

こんな感じ。’i’にインデックスが入り、’link’に要素が入る。printしてjsonっぽいものが吐き出されていることを確認しよう。
あとはjsonに書き込むだけなのだが、やっぱり日本語の文字化け問題が起こった。文字化けを回避するにはcodecsライブラリを用ればよさそう。jsonライブラリと併せてインポートしておこう。

そして適当なファイルに書き込む。

忘れちゃいけないのがensure_ascii=Falseオプション。これを忘れるとありがたいことに日本語がエスケープされてしまう。また、indentオプションをつけることで可読性が保てる。人間が読む必要なくて機械的に処理するだけなら不要かも知れない。
まとめるとできあがったコードは

こんな感じで先に示したjsonを無事出力できた。

注意事項

Webスクレイピングはサーバーに負荷がかかるので、よそ様から何かを引っ張ってくる際は迷惑にならないようにマナーを守ろう。そもそもあまりに負荷をかけると弾かれてしまう場合もある。
Webスクレイピングの注意事項一覧
法的な話は逐一チェックするとして、コーディングする側の人間はできるだけサーバーへのアクセスが減るよう設計しよう。
また、連続してアクセスする際は数秒の間隔が空くようにsleepを挟むようにしないとダメ。筆者はこれを忘れて怒られた。

一言

Webスクレイピングは覚えておくと色々できそうな気がしていたので着手するきっかけがあってよかった。どんなデータをどのように扱うかアイデア次第でいくらでも活用できる。
あとPython書こう書こうと思ってなかなか機会がなかったのでいいきっかけとなった。インデントを遵守しないと動かない系の言語に抵抗があったのだが、書いてみると実に綺麗。もうちょっと踏み込んで学習したいところだ。

CONTACT

この度は当社へご興味お持ちいただき
ありがとうございます。
Webに関するお悩みございましたら、
是非一度お気軽にご相談ください。
平日10:00~19:00