狠狠撸

狠狠撸Share 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

骋辞て?シュッと奥别产スクレイヒ?ンク?する