Python
HTML

pyQueryでAlexaのWebランクをスクレイピングする

More than 3 years have passed since last update.


やりたいこと


  • アクセス統計サイトAlexaで各国TOPアクセスランクが公開されている。(1ページ25位分のHTMLx20ページで500位まで。)

  • HTMLページをスクレイピングしてアクセスランクのURLリストを作る。

pyQueryを使ってみた。

Scrapyというライブラリも見つけたけどクローラ込みになっていて面倒そうなので敬遠。

beautifulsoupも良さそうだけど今回はpyQueryを試す。


インストール

$ yum install libxml2-devel libxslt-devel

$ pip install pyquery

pyQueryはlibxml2を使っているので先にインストールしておく。

pipが無ければそれもインストールしておく。


参考にしたもの(pyQueryのサンプルを試す)

試しにここのサンプルコードで地震情報サイトをスクレイピングしてみた。


pqsample.py

import pyquery

query = pyquery.PyQuery("http://www.jma.go.jp/jp/quake/quake_local_index.html", parser='html')
for tr in query('.infotable')('tr'):
print query(tr).text()

このコードでclass="infotable"の下層の<tr>タグの中身をforループでprintしている訳ですね。

chromeのデベロッパツールでhtmlの方の構成を調べてみると以下の通りでした。

image

python pqsample.pyで素直に以下の地震情報が取れた。確かに簡単。


情報発表日時 発生日時 震央地名 マグニチュード 最大震度

平成26年12月03日14時38分 3日14時32分頃 長野県北部 M1.6 震度1

平成26年12月03日06時03分 3日06時00分頃 長野県北部 M2.0 震度1



Alexaランキング解析

動くことが判ったので本命のサイトのスクレイピングに着手。

chromeで目的のページを開き、デベロッパーツール(CTRL-Shift-I)のウィンドウから虫眼鏡マークを押して、調べたい要素をクリック。下記の様にDOMツリーが表示される。(firefoxな方はインスペクタで調べられます。)

image

このツリー構成ならclass="site-listing"をキーに<li>タグをリストアップすればいけそう。countに順位が、desc-paragraph下の<a>タグにドメインが入っている。これらをforを回してcsvに出力するコードを書いてみた。


alexa.py

import pyquery

for page in range(20):
query = pyquery.PyQuery("http://www.alexa.com/topsites/countries;" + str(page) + "/PE", parser='html')
for li in query('.site-listing')('li'):
print query(li)('.count').text() + ", " + query(li)('.desc-paragraph')('a').text()


今回はペルーのランクが欲しかったので国コード/PEのページを指定。ここに好きな国コードを指定すればその国のページが取得できる。コードではHTMLページを20ページ分ループさせる。

という訳でpython alexa.pyを実行。

image

csvが出来た。大成功。

後はこれを使ってexcelで表を作るなり、curlで接続テストをするなりに役立ちます。


まとめ

・chrome+pyQueryのコンボで、カット&ペーストで取得していた情報を簡単にスクレイピングできて快適。

・AWSからはAlexaのAPIが使えますが、TOPリストは取得出来ない様なのでこちらが良い。

・curlでお手軽接続テストの巻をそのうち書くかも。


参考サイト

Python でスクレイピング (pyquery)