Contenu connexe Similaire à 実践スクレイピング (20) 実践スクレイピング1. 実践スクレイピング
不条理な現実との折り合いの付け方
ふるかわだいすけ/mogya.com
9. 例えばこんなページ
http://www.mcdonalds.co.jp/shop/map/map.php?strcode=01570
10. こうなっているところから
http://www.mcdonalds.co.jp/shop/map/map.php?strcode=01570
11. require 'rubygems'
require 'hpricot'
require 'open-uri'
url =
'http://www mcdonalds map php?strcode=01570'
http://www.mcdonalds…map.php?strcode=01570
page = Hpricot( open(url).read );nil
page sea c ( S op a e 3 )
page.search(".Shopname h3").inner_te t
e text
店名を取ってみる
12. Hpricot
• HTMLパーサー
• xpathでHTMLから切り出しができる
Hpricot
13. page = Hpricot( open(url).read )
page.search(".Shopname h3").inner_text
“body div h1”
“div#Content1
“di #C t t1 h1”
“.content title”
.content_title
(page/".content_title")[0].inner_text
XPath(XML Path Language)
15. require 'rubygems'
require 'hpricot'
require 'open-uri'
open-uri
url =
'http://www.mcdonalds・・・map.php?strcode=01570'
page = Hp icot( open( l) ead ) nil
Hpricot( open(url).read );nil
page.search(".Shopname h3").inner_text
店名を取ってみる
16. page = Hpricot( open(url).read )
↓
page = Hpricot( open(url).read );nil
irbの場合
17. userAgent =
"mogya scraper under construction. ”+
”you can contact me at mogya+scraper@mogya.com"
page = Hpricot( open(_url, "User-Agent" => userAgent ).read )
連絡がつくようにしておく
18. Require “kconv”
userAgent =
"mogya scraper under construction. ”+
”you can contact me at mogya+scraper@mogya.com"
page = Hpricot( open(url, "User-Agent" => userAgent ).read.toutf8 )
※読みにくいので、以降のサンプルでは省略しました
文字コードの問題
19. • Aj でデ タを動的ロ ド
Ajaxでデータを動的ロード
→スクレイピングだとデータが取れない
• JSの読み出し元を見ればいいんじゃね?
•ブラウザでアクセスしてみる
→403 forbidden
•以降、サイトまるごと403 forbiddenになった
→「本気だ!」
※このデザインになる前の話
余談:防衛反応
http://www.mcdonalds.co.jp/shop/map/map.php?strcode=01570
22. バーガーキング
http://www.burgerkingjapan.co.jp/locations/
23. require 'rubygems'
i ' b '
require 'hpricot'
require 'open-uri'
url = 'htt //
l 'http://www.burgerkingjapan.co.jp/locations/'
b ki j j /l ti /'
page = Hpricot( open(url).read );nil
page.search( li dl ).each{|part|
page search(".li dl") each{|part|
p part.search("dd h4 a").inner_text
}
バーガーキング
http://www.burgerkingjapan.co.jp/locations/
24. id=xxxx方式
http://www.mcdonalds.co.jp/shop/map/map.php?strcode=01578
25. require 'rubygems'
require 'hp icot'
eq i e 'hpricot'
require 'open-uriʻ
url_template
url template =
'http://www.mcdonalds ・・・ strcode=%05i'
0.upto(10000){|i|
url = sprintf(url_template,i)
page = Hpricot( open(url).read );nil
p page search(" Shopname h3") inner text
page.search(".Shopname h3").inner_text
sleep 3
}
id=xxxx方式
http://www.mcdonalds.co.jp/shop/map/map.php?strcode=01578
27. 飛び飛びで見て最低値を推測
0.step(10000,100){|i|
url = sprintf(url template i)
sprintf(url_template,i)
page = Hpricot( open(url).read );nil
p "#{url}:"+page.search(".Shopname h3").inner_text
sleep 3
}
id=xxxx方式
28. 飛び飛びで見て最低値を推測
0.step(10000,100){|i|
url = sprintf(url template i)
sprintf(url_template,i)
page = Hpricot( open(url).read );nil
p "#{url}:"+page.search(".Shopname h3").inner_text
sleep 3
}
id=xxxx方式
29. 一覧ページ→詳細ページ
http://www.bagus-99.com/company/shop.html
30. 一覧ページ→詳細ページ
http://www.bagus-99.com/company/shop.html
31. require 'rubygems'
q yg
require 'hpricot'
require 'open-uri'
archive_url = 'http://www.bagus-99.com/netcafe/store/'
archive_page = Hpricot( open(archive_url).read );nil
archive_page.search("td.darker2/a").each{|url_part|
url = archive_url + url_part['href']
page = Hpricot( open(url).read ) il
i ( ( l) d );nil
以下略
sleep 1
}
一覧ページ→詳細ページ
http://www.bagus-99.com/company/shop.html
32. 「次へ」対応
http://www.mapion.co.jp・・・search=mapAreabtn
34. def parse(url)
p ( )
page = Hpricot( open(url).read )
page.search(".address").each{|part|
p part.search("h2").inner_text
}
next_url =
(page.inner_html.scan(
/HREF="(.*)"><strong>次ページへ/
/ "( *)" 次 ジ /
)[0][0]) rescue nil
if (next_url)
parse("http://www.mapion.co.jp"+next_url)
("htt // i j "+ t l)
end
end
url = “http://www.mapion.co.jp/c/f?・・・admi3=13101・・・"
parse(url)
「次へ」対応
http://www.mapion.co.jp・・・search=mapAreabtn
36. 現実1:データ大杉
http://www.doutor.co.jp/shopsearch/index.html#
38. 現実1:データ大杉
http://www.mapion.co.jp・・・BT=all
40. Flashの検索フォーム
検索
現実2:強敵Flash
http://sp.chizumaru.com/dbh/lotteria/top.aspx?account=lotteria
41. Flashの検索フォーム
検索
現実2:強敵Flash
http://sp.chizumaru.com/dbh/lotteria/top.aspx?account=lotteria
69. • t itt で「電源 OR コンセント -切」をwatch
twitterで「電源 ンセント 切 を t h
• 99%はどうでもいい話だけど、
高速で読み飛ばせるので対応可能
• 敵はbotと診断メーカー
twitter
70. • t itt で「電源 OR コンセント -切」をwatch
twitterで「電源 ンセント 切 を t h
• 99%はどうでもいい話だけど、
高速で読み飛ばせるので対応可能
• 効能
•電源情報収集
•宣伝
•SEO
顧客の声を聞く
•顧客の声を聞く
twitter
73. システム構成
• Ce tOS5 3
CentOS5.3
• Apache2.2.3
• E pressionEngine v.1.6.4
ExpressionEngine 1 6 4
• MySQL 5.0
• jQuery 1.3.2
132
• GoogleMapsAPI
システム構成
74. システム構成
ee_Net_UserAgent_Mobile
ee Net UserAgent Mobile
通常のリクエスト
通常 リク ト
Expression spot_search
結果ページの Engine
リクエスト
DB
検索クエリ Search.php
システム構成