Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PythonによるWebスクレイピング入門

91,556 views

Published on

PythonによるWebスクレイピング入門

Published in: Engineering

PythonによるWebスクレイピング入門

  1. 1. Pythonによる Webスクレイピング入門 関根裕紀
  2. 2. 自己紹介 • 関根裕紀(せきね ひろのり) • アライドアーキテクツ株式会社 • ソフトウェア・エンジニア • PyCon JP 2014 スタッフ • Twitter(@checkpoint )
  3. 3. • 前職まで • RSSリーダー、SNS • WebMail • 写真共有サービス • 現在(アライドアーキテクツ) • モニプラFacebook、Social-IN • Webアプリケーション開発全般を担当 経歴
  4. 4. アジェンダ • Webスクレイピングとは • PythonでのWebスクレイピング • ライブラリの紹介、サンプル(入門編)
  5. 5. Webスクレイピングとは? Webスクレイピングとは、WebサイトからWebページのHTMLデータを収 集して、特定のデータを抽出、整形し直すことである。 ! Webスクレイピングを行うことで、Webページを対象として、あたかも Web APIを利用しているかのようにデータを効率的に取得・収集することが 可能になる。用途の例としては、部分的にコンテンツを取り出して携帯電話 向けのコンテンツを生成したり、小見出しの一覧を生成したり、といった使 い方あある。Webスクレイピングは様々な手段で実現可能であるが、PHPや Perlといったスクリプト言語を使用して行われることが多い。 ! IT用語辞典 ( http://www.sophia-it.com/content/Webスクレイピング ) より
  6. 6. Webスクレイピング • WebサイトからHTMLのデータを収集 • 特定のデータを抽出、加工 • 抽出したデータを再利用 • クローリング + スクレイピング
  7. 7. クローリング • 英語の意味は、[ はう、ゆっくり進む] • Webページのリンクの内容をたどる • Webページの内容をダウンロードして収集 • クローラー、スパイダーと呼ばれる
  8. 8. スクレイピング • 英語の意味は、[ 削ること ] • ページの内容から、必要な情報を抽出すること
  9. 9. 用途 • 検索エンジン • 価格比較 • 気象データの監視 • サイトの変更検出 • Webサイトの情報解析、研究(比較、分類、統計など) • マッシュアップ
  10. 10. 方法(1) • Webサービス、アプリケーション • Yahoo! Pipes( https://pipes.yahoo.com/ ) • kimono ( https://www.kimonolabs.com/ ) • import.io ( https://import.io/ )
  11. 11. 方法(2) • Ruby • Nokogiri • Mechanize • Perl • Web::Scraper • JavaScript • CasperJS
  12. 12. Pythonでのスクレイピング • 標準ライブラリ • BeautifulSoup • pyquery • Scrapy(スクレピー、スクラパイ、スクレパイ)
  13. 13. Python • バッテリー付属言語
  14. 14. 標準ライブラリ • Pythonの標準ライブラリはとても充実している • ネットワーク、正規表現ライブラリ • Pythonの処理系だけあれば良い • 簡単なスクレイピングであれば十分実用的
  15. 15. サンプル import re, urllib2 res = urllib2.urlopen( http://ll.jus.or.jp/2014/program") pattern_title = re.compile( <title>(.*?)</title>') m = pattern_title.search(res.read()) title = m.group(1) print title >>> プログラム ¦ LL Diver
  16. 16. Beautiful Soup • 2004年からあるライブラリ • HTMLやXMLからデータを抽出して取得できる • 複数のパーサーに対応、パーサーを指定できる • 最新バーションはBeautiful Soup 4系 • Python 2.7、Python 3.2に対応 • スクレイピング
  17. 17. サンプル import urllib2 from bs4 import BeautifulSoup res = urllib2.urlopen( http://ll.jus.or.jp/2014/program ) soup = BeautifulSoup(res.read()) soup.title >>> <title>プログラム ¦ LL Diver</title> for link in soup.find_all( a'): print(link.get( href')) >>> http://ll.jus.or.jp/2014/ >>> http://ll.jus.or.jp/2014/
  18. 18. pyquery • jQuery風にHTML/XML操作が可能 • パーサーにはlxmlを使用(高速) • JQuery風のセレクタを利用できる • スクレイピング
  19. 19. サンプル from pyquery import PyQuery as pq d = pq("http://ll.jus.or.jp/2014/program") print d( title").text() >>> プログラム ¦ LL Diver print d( .entry-title").text() >>> プログラム print d( #day ).text() >>> 昼の部
  20. 20. Scrapy • Scarpyは速くて、ハイレベルなスクレイピング クローラーのフレームワーク。Webサイトのク ロールと、構造化されたデータを取り出すのに 使用する。幅広い目的に使用できる。データマ イニングから、モニタリング、自動テストなど
  21. 21. Scrapyの特徴 • クローリング、スクレイピングフレームワーク • シンプル、拡張性がある • バッテリー付属 • ドキュメント、テストが充実 • コミュニティが活発 • Python2.7のみ対応
  22. 22. Scrapyの主な機能 • Webページからの情報抽出 • Robots.txtのパース • ドメイン、IPアドレス単位のクロール間隔調整 • 並行処理 • エラー時のリトライ(回数を設定) • http://orangain.hatenablog.com/entry/scrapy
  23. 23. アーキテクチャ https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  24. 24. Scrapy Engine https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  25. 25. Scrapy Engine • 全てのコンポーネントを制御するシステム • 特定のアクションが発生したら、イベントを起 こす責任を持つ。
  26. 26. Spider https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  27. 27. Spider • ユーザーが作成するカスタムクラス • 取得したいURL、抽出する項目などを記述する • 取得した内容をスクレイピングして、Itemとし てItem Pipelineに送る
  28. 28. Scheduler https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  29. 29. Scheduler • リクエストのトラフィック等の制御
  30. 30. Downloader https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  31. 31. Downloader • 実際にWebページを取得する • Downloader middlewaresで処理を差し込む事 ができる。(キャッシュなど)
  32. 32. Item Pipeline https://scrapy.readthedocs.org/en/latest/topics/architecture.html
  33. 33. Item Pipeline • スパイダーによって抽出されたアイテムを出力 • データのクレンジング、検証 • 永続化(JSON、File、DB、Mail)など
  34. 34. 手順 • Scrapy プロジェクトの作成 • 抽出するアイテムの定義 • アイテムの抽出とクローリングのためのSpider を作成 • 抽出したアイテムのパイプライン部分作成 • 基本はSpiderとItem部分を書いていけばOK
  35. 35. プロジェクト作成 $ scrapy startproject scrapy_sample $ tree scrapy_sample scrapy_sample/ ├── scrapy.cfg └── scrapy_sample ├── __init__.py ├── items.py ├── pipelines.py ├── settings.py └── spiders └── __init__.py
  36. 36. 抽出するItem定義 class TorrentItem(scrapy.Item): url = scrapy.Field() name = scrapy.Field()
  37. 37. Spider作成 class MininovaSpider(CrawlSpider): name = 'mininova' allowed_domains = ['mininova.org'] start_urls = ['http://www.mininova.org/yesterday/'] rules = [Rule(LinkExtractor(allow=['/tor/d+']), parse_torrent')] ! def parse_torrent(self, response): torrent = TorrentItem() torrent['url'] = response.url torrent['name'] = response.xpath("//h1/text()").extract() return torrent
  38. 38. 実行 $ scrapy crawl mininova -o scraped_data.json $ cat scraped_data.json { "url": "http://www.mininova.org/tor/13277197", "name": ["lady anna voice free plugin VSTI free download new by Softrave ] }, { "url": "http://www.mininova.org/tor/13277195", "name": ["mandala VSTI free download new by Softrave ] },
  39. 39. まとめ • Pythonでスクレイピングを行う場合、色々なア プローチがある。 • 標準のライブラリから、フレームワークまで選 択肢は沢山あるので、要件に合わせて使用すれ ば良い • Pythonに限らず、LL言語はスクレイピング用の ライブラリがたくさん。
  40. 40. 参考URL • http://scrapy.org ( Scrapy ) • http://www.slideshare.net/MasayukiIsobe/web-scraping-20140622isobe • https://github.com/gawel/pyquery/ ( pyquery ) • http://www.crummy.com/software/BeautifulSoup/ ( BeautfulSoup ) • http://orangain.hatenablog.com/entry/scrapy • http://akiniwa.hatenablog.jp/entry/2013/04/15/001411 • http://tokyoscrapper.connpass.com/ ( Webスクレイピング勉強会 ) • http://www.slideshare.net/nezuQ/web-36143026?ref=http://www.slideshare.net/slideshow/ embed_code/36143026 • http://qiita.com/nezuq/items/c5e827e1827e7cb29011( 注意事項 )
  41. 41. 宣伝 • PyCon JP 2014は来月開催です。
  42. 42. 宣伝 • https://pycon.jp/2014/ • 9/12 (金)∼ 9/15(月)の4日間 • チュートリアル(9/12) • カンファレンス(9/13、14) • スプリント(9/15) • 絶賛準備中。お待ちしております!
  43. 43. ご静聴ありがとうございました。

×