python と xpath で ウェブからデータをあつめる

10
Python Xpath ウェブからデータをあつめる @tushuhei

Upload: shuhei-iitsuka

Post on 19-Jun-2015

1.255 views

Category:

Technology


1 download

DESCRIPTION

Python と Xpath を使ってウェブから情報を収集するための、プログラミング初心者向け紹介資料です。 シェアハウス内でのハッカソンのために作りました。

TRANSCRIPT

Page 1: Python と Xpath で ウェブからデータをあつめる

Python と Xpath で!ウェブからデータをあつめる

@tushuhei

Page 2: Python と Xpath で ウェブからデータをあつめる

問題意識

• 自社製品に対する口コミを収集して分析したい・・・

• ブログ記事を集めて市場の動きを予測できないか?

• 私、オープンデータに興味あるんです!

• でもまずは女の子の水着画像集めたい※。

• というかもう本能の赴くままに集めたい※※。

目的はともあれウェブブラウジングを自動化したいときはある。

※http://d.hatena.ne.jp/utgym/20121212/1355277764 ※※http://yusukebe.com/archives/20120229/072808.html

Page 3: Python と Xpath で ウェブからデータをあつめる

全体の流れ

そんなときに威力を発揮するクローリング技術について紹介します。

HTML を取ってくる Xpath で要素を指定する 指定部分を切り取る

今回前提とするスキル • Python で書かれたプログラムの編集、実行ができる • HTML の構造についてはある程度理解している

Page 4: Python と Xpath で ウェブからデータをあつめる

HTML を取ってくる

# coding: utf8     # このコードは utf8 というエンコードで書かれていますimport urllib2     # ウェブから情報を取るためのライブラリ urllib2 を読み込みますurl = 'http://www.livedoor.com' # 今回扱う url は livedoor のアドレスですresponse = urllib2.urlopen(url) # その url を open しますprint response.read() # 返ってきた HTML を read します

<!DOCTYPE html><html lang="ja"><head><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" /><meta charset="utf-8" /><title>livedoor</title><meta name="description" content="LINE株式会社が運営するポータルサイト。速報性に加え独自の切り口を誇る「ライブドアニュース」、日本最大のブログサービス「ライブドアブログ」ほか、厳選した情報をお届けします。" /><meta name="keywords" content="ライブドア,ポータル,ニュース,ブログ,livedoor,portal,LINE,LD" /><meta property="og:site_name" content="livedoor" /><meta property="og:image" content="http://image.livedoor.com/img/top/17/livedoor_small.png" /><meta name="verify-v1" content="1bivxaxGrLBSoWSu7qAOa0M36HWHyewW+8YqCFDlBZQ=" />!<link rel="shortcut icon" href="/img/ie9/favicon.ico" />

実行

ためしに livedoor のトップページを取得してみる

Page 5: Python と Xpath で ウェブからデータをあつめる

HTML を取ってくる

# coding: utf8import urllib2headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30'}url = 'http://www.livedoor.com'request = urllib2.Request(url, None, headers)response = urllib2.urlopen(url)print response.read()

サイトによってはプログラムからのアクセスを受け付けないために、 ブラウザのふりをしなければならないときもあります。 (ブラウザを示す部分は User Agent と呼びます。)

Page 6: Python と Xpath で ウェブからデータをあつめる

Xpath で要素を指定するソースコードを見ながら、取得したい部分を探します。 ソースコードを見るには、Google Chrome の開発者ツールがおすすめです。 Xpath はソースコードから特定の要素を指定するための問い合わせ言語です。

今回は livedoor ニュースの見出しを!取り出してみましょう。

Page 7: Python と Xpath で ウェブからデータをあつめる

Xpath で要素を指定する

1.対象となる部分から木構造を上にたどっていき、id を持った要素を見つけます。 2.そこから、対象の部分に向かって、HTML タグをスラッシュ区切りで書いていきます。これが Xpath の記法にあたります。

この場合、ニュースの見出しのテキストは //div[@id='newstopicsbox']/ol/li/a!と指定できます。

取りたい部分

Page 8: Python と Xpath で ウェブからデータをあつめる

指定部分を切り取る

# coding: utf8import urllib2import lxml.htmlurl = 'http://www.livedoor.com'response = urllib2.urlopen(url)html = lxml.html.fromstring(response.read()) # 木構造になった HTML を生成するheadings = html.xpath("//div[@id='newstopicsbox']/ol/li/a")for heading in headings: print heading.text

閉店の100円ラーメン店に大行列オバマ氏断った天ぷら屋の心意気韓国の反日は嘘? 週刊朝日に反発夫にしたくない男性の特徴 1位は女性の裸に対する恐ろしい本音子どもの自閉症チェックリスト日本のフィギュアを外国人が絶賛熱愛報道のG坂本に不穏な情報香里奈ベッド写真にノーパン疑惑深キョン、ひざ上20cmミニで登場

実行

最後に、lxml モジュールと Xpath を使って切り取ります。

lxml モジュールがない場合は、ImportError が起きます。pip や easy_install を使ってインストールしましょう。

Page 9: Python と Xpath で ウェブからデータをあつめる

うまくいかないときは

• エラーはないが、何もデータが取れない

• Xpath が間違っている可能性があります。Xpath を要素が確実に取れそうなところまで削ってみて、要素がとれるか print して確認しましょう。

• それでも取れない場合は、プログラムから取れる HTML とブラウザで見ている HTML が異なっている可能性があります。プログラムから取得した HTML を見て Xpath を書きましょう。

• それでもダメな場合は Selenuim を使った上級編へ。

• href など、タグの属性部分を取りたい

• Xpath でググると、記法のバリエーションが見つかります。たとえばアンカータグの href 属性を取りたい場合は、末尾を a/@href とします。

Page 10: Python と Xpath で ウェブからデータをあつめる

参考文献

• ウェブから情報をあつめる UT Startup Gym | SlideShare http://www.slideshare.net/tushuhei/ut-startup-gym-15588813

• たった10行のコードでひたすらアイドル水着画像をあつめる | UT Startup Gymhttp://d.hatena.ne.jp/utgym/20121212/1355277764

• ウェブページからのデータ取得 東京大学グローバル消費インテリジェンス寄附講座チュートリアルhttp://gci.t.u-tokyo.ac.jp/tutorial/crawling/