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.

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

5,321 views

Published on

Go(Un)Conference(Goあんこ)LT大会 2kg

Published in: Technology
  • Be the first to comment

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

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

×