SlideShare a Scribd company logo
1 of 43
Download to read offline
Pythonによる
Webスクレイピング入門
関根裕紀
自己紹介
• 関根裕紀(せきね ひろのり)
• アライドアーキテクツ株式会社
• ソフトウェア・エンジニア
• PyCon JP 2014 スタッフ
• Twitter(@checkpoint )
• 前職まで
• RSSリーダー、SNS
• WebMail
• 写真共有サービス
• 現在(アライドアーキテクツ)
• モニプラFacebook、Social-IN
• Webアプリケーション開発全般を担当
経歴
アジェンダ
• Webスクレイピングとは
• PythonでのWebスクレイピング
• ライブラリの紹介、サンプル(入門編)
Webスクレイピングとは?
Webスクレイピングとは、WebサイトからWebページのHTMLデータを収
集して、特定のデータを抽出、整形し直すことである。
!
Webスクレイピングを行うことで、Webページを対象として、あたかも
Web APIを利用しているかのようにデータを効率的に取得・収集することが
可能になる。用途の例としては、部分的にコンテンツを取り出して携帯電話
向けのコンテンツを生成したり、小見出しの一覧を生成したり、といった使
い方あある。Webスクレイピングは様々な手段で実現可能であるが、PHPや
Perlといったスクリプト言語を使用して行われることが多い。
!
IT用語辞典	
( http://www.sophia-it.com/content/Webスクレイピング ) より
Webスクレイピング
• WebサイトからHTMLのデータを収集
• 特定のデータを抽出、加工
• 抽出したデータを再利用
• クローリング + スクレイピング
クローリング
• 英語の意味は、[ はう、ゆっくり進む]
• Webページのリンクの内容をたどる
• Webページの内容をダウンロードして収集
• クローラー、スパイダーと呼ばれる
スクレイピング
• 英語の意味は、[ 削ること ]
• ページの内容から、必要な情報を抽出すること
用途
• 検索エンジン
• 価格比較
• 気象データの監視
• サイトの変更検出
• Webサイトの情報解析、研究(比較、分類、統計など)
• マッシュアップ
方法(1)
• Webサービス、アプリケーション
• Yahoo! Pipes( https://pipes.yahoo.com/ )
• kimono ( https://www.kimonolabs.com/ )
• import.io ( https://import.io/ )
方法(2)
• Ruby
• Nokogiri
• Mechanize
• Perl
• Web::Scraper
• JavaScript
• CasperJS
Pythonでのスクレイピング
• 標準ライブラリ
• BeautifulSoup
• pyquery
• Scrapy(スクレピー、スクラパイ、スクレパイ)
Python
• バッテリー付属言語
標準ライブラリ
• Pythonの標準ライブラリはとても充実している
• ネットワーク、正規表現ライブラリ
• Pythonの処理系だけあれば良い
• 簡単なスクレイピングであれば十分実用的
サンプル
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
Beautiful Soup
• 2004年からあるライブラリ
• HTMLやXMLからデータを抽出して取得できる
• 複数のパーサーに対応、パーサーを指定できる
• 最新バーションはBeautiful Soup 4系
• Python 2.7、Python 3.2に対応
• スクレイピング
サンプル
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/
pyquery
• jQuery風にHTML/XML操作が可能
• パーサーにはlxmlを使用(高速)
• JQuery風のセレクタを利用できる
• スクレイピング
サンプル
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()
>>> 昼の部
Scrapy
• Scarpyは速くて、ハイレベルなスクレイピング
クローラーのフレームワーク。Webサイトのク
ロールと、構造化されたデータを取り出すのに
使用する。幅広い目的に使用できる。データマ
イニングから、モニタリング、自動テストなど
Scrapyの特徴
• クローリング、スクレイピングフレームワーク
• シンプル、拡張性がある
• バッテリー付属
• ドキュメント、テストが充実
• コミュニティが活発
• Python2.7のみ対応
Scrapyの主な機能
• Webページからの情報抽出
• Robots.txtのパース
• ドメイン、IPアドレス単位のクロール間隔調整
• 並行処理
• エラー時のリトライ(回数を設定)
• http://orangain.hatenablog.com/entry/scrapy
アーキテクチャ
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Scrapy Engine
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Scrapy Engine
• 全てのコンポーネントを制御するシステム
• 特定のアクションが発生したら、イベントを起
こす責任を持つ。
Spider
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Spider
• ユーザーが作成するカスタムクラス
• 取得したいURL、抽出する項目などを記述する
• 取得した内容をスクレイピングして、Itemとし
てItem Pipelineに送る
Scheduler
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Scheduler
• リクエストのトラフィック等の制御
Downloader
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Downloader
• 実際にWebページを取得する
• Downloader middlewaresで処理を差し込む事
ができる。(キャッシュなど)
Item Pipeline
https://scrapy.readthedocs.org/en/latest/topics/architecture.html
Item Pipeline
• スパイダーによって抽出されたアイテムを出力
• データのクレンジング、検証
• 永続化(JSON、File、DB、Mail)など
手順
• Scrapy プロジェクトの作成
• 抽出するアイテムの定義
• アイテムの抽出とクローリングのためのSpider
を作成
• 抽出したアイテムのパイプライン部分作成
• 基本はSpiderとItem部分を書いていけばOK
プロジェクト作成
$ scrapy startproject scrapy_sample
$ tree scrapy_sample
scrapy_sample/
├── scrapy.cfg
└── scrapy_sample
├── __init__.py
├── items.py
├── pipelines.py
├── settings.py
└── spiders
└── __init__.py
抽出するItem定義
class TorrentItem(scrapy.Item):
url = scrapy.Field()
name = scrapy.Field()
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
実行
$ 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 ]
},
まとめ
• Pythonでスクレイピングを行う場合、色々なア
プローチがある。
• 標準のライブラリから、フレームワークまで選
択肢は沢山あるので、要件に合わせて使用すれ
ば良い
• Pythonに限らず、LL言語はスクレイピング用の
ライブラリがたくさん。
参考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( 注意事項 )
宣伝
• PyCon JP 2014は来月開催です。
宣伝
• https://pycon.jp/2014/
• 9/12 (金)∼ 9/15(月)の4日間
• チュートリアル(9/12)
• カンファレンス(9/13、14)
• スプリント(9/15)
• 絶賛準備中。お待ちしております!
ご静聴ありがとうございました。

More Related Content

What's hot

What's hot (20)

Jupyter notebook を用いた文芸的インフラ運用のススメ
Jupyter notebook を用いた文芸的インフラ運用のススメJupyter notebook を用いた文芸的インフラ運用のススメ
Jupyter notebook を用いた文芸的インフラ運用のススメ
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
そんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjugそんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjug
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Azure Cosmos DB で始める Java + NoSQL 開発
Azure Cosmos DB で始める Java + NoSQL 開発Azure Cosmos DB で始める Java + NoSQL 開発
Azure Cosmos DB で始める Java + NoSQL 開発
 
Python入門 : 4日間コース社内トレーニング
Python入門 : 4日間コース社内トレーニングPython入門 : 4日間コース社内トレーニング
Python入門 : 4日間コース社内トレーニング
 
Goの時刻に関するテスト
Goの時刻に関するテストGoの時刻に関するテスト
Goの時刻に関するテスト
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話
 
Software design and team design
Software design and team designSoftware design and team design
Software design and team design
 
Rails 6.1 → 7.0アップデート記録
Rails 6.1 → 7.0アップデート記録Rails 6.1 → 7.0アップデート記録
Rails 6.1 → 7.0アップデート記録
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
 
Microsoft Graph APIを活用した社内アプリケーション開発
Microsoft Graph APIを活用した社内アプリケーション開発Microsoft Graph APIを活用した社内アプリケーション開発
Microsoft Graph APIを活用した社内アプリケーション開発
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジー
 
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST APIRedmineをちょっと便利に! プログラミング無しで使ってみるREST API
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
 
Power Automate Desktopの内部言語Robinについて
Power Automate Desktopの内部言語RobinについてPower Automate Desktopの内部言語Robinについて
Power Automate Desktopの内部言語Robinについて
 

Viewers also liked

python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集
Hikaru Takemura
 
RとPythonによるデータ解析入門
RとPythonによるデータ解析入門RとPythonによるデータ解析入門
RとPythonによるデータ解析入門
Atsushi Hayakawa
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門
Takayuki Shimizukawa
 

Viewers also liked (20)

python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集python-twitterを用いたTwitterデータ収集
python-twitterを用いたTwitterデータ収集
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
 
Pythonで簡単ネットワーク分析
Pythonで簡単ネットワーク分析Pythonで簡単ネットワーク分析
Pythonで簡単ネットワーク分析
 
10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
 
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
野球Hack!~Pythonを用いたデータ分析と可視化 #pyconjp
 
Python東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしようPython東海Vol.5 IPythonをマスターしよう
Python東海Vol.5 IPythonをマスターしよう
 
RとPythonによるデータ解析入門
RとPythonによるデータ解析入門RとPythonによるデータ解析入門
RとPythonによるデータ解析入門
 
Scikit learnで学ぶ機械学習入門
Scikit learnで学ぶ機械学習入門Scikit learnで学ぶ機械学習入門
Scikit learnで学ぶ機械学習入門
 
scikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアルscikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアル
 
Gensim
GensimGensim
Gensim
 
DBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキルDBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキル
 
JupyterNotebookとMySQLでゼロからはじめるデータサイエンス
JupyterNotebookとMySQLでゼロからはじめるデータサイエンスJupyterNotebookとMySQLでゼロからはじめるデータサイエンス
JupyterNotebookとMySQLでゼロからはじめるデータサイエンス
 
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミングソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門
 
Pythonによるwebアプリケーション入門 - Django編-
Pythonによるwebアプリケーション入門 - Django編- Pythonによるwebアプリケーション入門 - Django編-
Pythonによるwebアプリケーション入門 - Django編-
 
Python による 「スクレイピング & 自然言語処理」入門
Python による 「スクレイピング & 自然言語処理」入門Python による 「スクレイピング & 自然言語処理」入門
Python による 「スクレイピング & 自然言語処理」入門
 
続Pythonによるwebスクレイピング入門
続Pythonによるwebスクレイピング入門続Pythonによるwebスクレイピング入門
続Pythonによるwebスクレイピング入門
 

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

クラウド運用のためのストリームマイニング
クラウド運用のためのストリームマイニングクラウド運用のためのストリームマイニング
クラウド運用のためのストリームマイニング
Shin Matsumoto
 
実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン
Hiroyasu Suzuki
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
Yusuke Wada
 
Swagger jjug ccc 2018 spring
Swagger jjug ccc 2018 springSwagger jjug ccc 2018 spring
Swagger jjug ccc 2018 spring
kounan13
 
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
Masakazu Muraoka
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
Takuro Sasaki
 
Rubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーションRubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーション
Naoto Hori
 

Similar to PythonによるWebスクレイピング入門 (20)

クラウド運用のためのストリームマイニング
クラウド運用のためのストリームマイニングクラウド運用のためのストリームマイニング
クラウド運用のためのストリームマイニング
 
Data Scientist Workbench - dots0729
Data Scientist Workbench - dots0729Data Scientist Workbench - dots0729
Data Scientist Workbench - dots0729
 
概説 Data API v3
概説 Data API v3概説 Data API v3
概説 Data API v3
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
 
Tech fun rails_workshop
Tech fun rails_workshopTech fun rails_workshop
Tech fun rails_workshop
 
実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン実践!AWSクラウドデザインパターン
実践!AWSクラウドデザインパターン
 
Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記Pythonおじさんのweb2py挑戦記
Pythonおじさんのweb2py挑戦記
 
ASP.NET Core 概要(2017年3月時点)
ASP.NET Core 概要(2017年3月時点)ASP.NET Core 概要(2017年3月時点)
ASP.NET Core 概要(2017年3月時点)
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
Building modernapplicationwithelasiccloud
Building modernapplicationwithelasiccloudBuilding modernapplicationwithelasiccloud
Building modernapplicationwithelasiccloud
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うか
 
Swagger jjug ccc 2018 spring
Swagger jjug ccc 2018 springSwagger jjug ccc 2018 spring
Swagger jjug ccc 2018 spring
 
インドのインターネット環境 との戦い方
インドのインターネット環境との戦い方インドのインターネット環境との戦い方
インドのインターネット環境 との戦い方
 
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
 
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
 
Rubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーションRubyで作るtwitter風webアプリケーション
Rubyで作るtwitter風webアプリケーション
 
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
データ分析に必要なスキルをつけるためのツール~Jupyter notebook、r連携、機械学習からsparkまで~
 
Azure Machine Leaning Workbench の使い方
Azure Machine Leaning Workbench の使い方Azure Machine Leaning Workbench の使い方
Azure Machine Leaning Workbench の使い方
 

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