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

3,724 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. Python と Xpath で! ウェブからデータをあつめる @tushuhei
  2. 2. 問題意識 • 自社製品に対する口コミを収集して分析したい・・・ • ブログ記事を集めて市場の動きを予測できないか? • 私、オープンデータに興味あるんです! • でもまずは女の子の水着画像集めたい※。 • というかもう本能の赴くままに集めたい※※。 目的はともあれウェブブラウジングを自動化したいときはある。 ※http://d.hatena.ne.jp/utgym/20121212/1355277764 ※※http://yusukebe.com/archives/20120229/072808.html
  3. 3. 全体の流れ そんなときに威力を発揮するクローリング技術について紹介します。 HTML を取ってくる Xpath で要素を指定する 指定部分を切り取る 今回前提とするスキル • Python で書かれたプログラムの編集、実行ができる • HTML の構造についてはある程度理解している
  4. 4. 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 のトップページを取得してみる
  5. 5. HTML を取ってくる # coding: utf8 import urllib2 headers = {'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 と呼びます。)
  6. 6. Xpath で要素を指定する ソースコードを見ながら、取得したい部分を探します。 ソースコードを見るには、Google Chrome の開発者ツールがおすすめです。 Xpath はソースコードから特定の要素を指定するための問い合わせ言語です。 今回は livedoor ニュースの見出しを! 取り出してみましょう。
  7. 7. Xpath で要素を指定する 1.対象となる部分から木構造を上にたどっていき、id を持った要素を見つけます。 2.そこから、対象の部分に向かって、HTML タグをスラッシュ区切りで書いていき ます。これが Xpath の記法にあたります。 この場合、ニュースの見出しのテキストは //div[@id='newstopicsbox']/ol/li/a! と指定できます。 取りたい部分
  8. 8. 指定部分を切り取る # coding: utf8 import urllib2 import lxml.html url = '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 を使ってインストールし ましょう。
  9. 9. うまくいかないときは • エラーはないが、何もデータが取れない • Xpath が間違っている可能性があります。Xpath を要素が確実に取れそう なところまで削ってみて、要素がとれるか print して確認しましょう。 • それでも取れない場合は、プログラムから取れる HTML とブラウザで見て いる HTML が異なっている可能性があります。プログラムから取得した HTML を見て Xpath を書きましょう。 • それでもダメな場合は Selenuim を使った上級編へ。 • href など、タグの属性部分を取りたい • Xpath でググると、記法のバリエーションが見つかります。たとえばアン カータグの href 属性を取りたい場合は、末尾を a/@href とします。
  10. 10. 参考文献 • ウェブから情報をあつめる UT Startup Gym | SlideShare 
 http://www.slideshare.net/tushuhei/ut-startup-gym-15588813 • たった10行のコードでひたすらアイドル水着画像をあつめる | UT Startup Gym
 http://d.hatena.ne.jp/utgym/20121212/1355277764 • ウェブページからのデータ取得 東京大学グローバル消費インテリジェンス寄 附講座チュートリアル
 http://gci.t.u-tokyo.ac.jp/tutorial/crawling/

×