SlideShare a Scribd company logo
Goでシュッと
Webスクレイピングする
Go(Un)Conference(Goあんこ)LT大会 2kg
2018/05/25
Yuta Ohashi
2
blue_goheimochi
blue-goheimochi
はじめて2ヶ月
3
もくじ
• モチベーション
• Webスクレイピングとは?
• 使ったパッケージ
• 静的サイトのスクレイピング
• 動的サイトのスクレイピング
• まとめ
4
サンプルコード
https://github.com/blue-goheimochi/practice-scraping-with-go
5
モチベーション
6
モチベーション
• 何か思いついた時にシュッとWebスクレイピングしたい
• 自分の中にシュッとやる方法が確立してなかった
• PHP?Python?Node.js?Go?
• Goでやってみよう
7
Webスクレイピングとは?
8
Webスクレイピングとは?
• ウェブサイトから情報を抽出するコンピュータソフト
ウェア技術のこと(Wikipedia調べ)
• HTML取得→DOM解析→保存→加工→何かしらで利用
• 用法・容量を守って正しくスクレイピングする必要あり
• Twitterはスクレイピングを利用規約で明示的に禁止している
• 岡崎市中央図書館事件
• Webスクレイピングの注意事項一覧
https://qiita.com/nezuq/items/c5e827e1827e7cb29011
9
https://twitter.com/ja/tos
10
使ったパッケージ
11
使ったパッケージ
goquery
https://github.com/PuerkitoBio/goquery
jQueryライクにDOMの指定ができるやーつ!
12
使ったパッケージ
例)タイトルタグの中身を取得
doc, _ := goquery.NewDocument(url)
doc.Find("title").Text()
例)クラス名を指定して取得
doc, _ := goquery.NewDocument(url)
doc.Find(".hoge-list > li")
13
使ったパッケージ
doc.Find(".hoge-list > li ").Each(func(i int, s *goquery.Selection) {
s.Find(“a > span”).Text()
})
例)取得した複数のliをループする
jQueryでDOM操作をゴリゴリしたことがある
人にはきっと使いやすい
※goqueryの詳しい使い方はググる
14
静的サイトのスクレイピング
15
静的サイトのスクレイピング
対象のサイト
1
2
リクエスト
HTMLレスポンス
16
簡単!
17
静的サイトのスクレイピング
簡単!
• ChromeのDeveloper Toolsで確認したままのDOM
• 素直に指定すれば要素が取得できる
• qoqueryだけでシュッとスクレイピングできる
18
動的サイトのスクレイピング
19
動的サイトのスクレイピング
対象のサイト
1
2
リクエスト
HTMLレスポンス
20
むずかしぃ・・・
21
動的サイトのスクレイピング
むずかしぃ・・・
• ChromeのDeveloper Toolsで確認したままのDOM
ではない・・・
• レンダリングが終わる前のHTMLが返ってくる
• ググるとSeleniumと組み合わせてってのが多い
• 面倒なことはしたくない・・・(したほうがいい
22
そこで
23
動的サイトのスクレイピング
Scrapy + Splash
• Scrapy
• Python製のクローリング・スクレイピングフレーム
ワーク
• robots.txtを考慮してくれる(らしい)
• Splash
• Python製のJavascriptレンダリングサービス
24
Scrapy + Splashの
環境構築面倒だよぉ
25
動的サイトのスクレイピング
Scrapy + SplashのDockerのコンテナがある
• scrapinghub/splash
• 静的サイトをスクレイピングするのと同じ感じで
できる
• 便利な世の中ですね
26
動的サイトのスクレイピング
対象のサイト
Scrapy
+
Splash
1
2
35
リクエスト
リクエスト
HTMLレスポンス4 レンダリング
レンダリング後のHTMLレスポンス
27
動的サイトのスクレイピング
Scrapy + Splashのコンテナを起動
$ docker pull scrapinghub/splash
$ docker run -d -p 5023:5023 -p 8050:8050 -p 8051:8051 scrapinghub/splash
Scrapyを経由してアクセスするURL
http://localhost:8050/render.html?url=https://hogeho
ge.com&timeout=10&wait=3
※5023: telnet 8050: http 8051: https
※ Scrapy,Splashの詳しい内容・使い方はググる
28
まとめ
29
まとめ
GoでシュッとWebスクレイピングするなら・・・
• goqueryを使う
• Scrapy + Splashのコンテナを使う
• ルールを守ってスクレイピングする
30
おわり

More Related Content

GoでシュッとWebスクレイピングする