狠狠撸

狠狠撸Share a Scribd company logo
Crawler-Commons
2017-09-30
第二十回 #渋谷java
Me
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
Apache 笔谤别诲颈肠迟颈辞苍滨翱のコミッタになりました
クローラーって?
● インターネットに蓄積されている様々な情報を収集し
● データとして活用できるようにするためのもの
● 情報提供してくださるWebサイトがあってこそ成り立つ
● 迷惑をかけてしまうようなことは避けなくてはならない
ルールを守る
● クロールしてもよいページ、ダメなページ
○ robots.txt など
● 負荷をかけるアクセスをしない
○ 必要なページのみクロールする
○ サイトマップ など
● Webクローラーに共通する処理がある
Crawler-Commons
https://github.com/crawler-commons/crawler-commons
● Webクローラに共通する機能を実装したJavaライブラリ
○ robots.txtのパース
○ サイトマップやAtomのパース
○ トップレベルドメインを返すURLアナライザ
関連ライブラリ
● crawler4j Java用Webクローラー
○ robots.txtのパース、キャッシュ
■ 禁止されているページはクロールしない
● jsoup Java用HTMLパーサ
○ ページをクロールして解析する
■ 該当ページが許可されているかどうかは自分で判定する
Crawler-Commonsの特徴
● パーサのみを提供
● ページをクロールする機能はない
robots.txtをパース
● 準備
byte[] content = ... robots.txtを読み込む ...
SimpleRobotRulesParser parser =
new SimpleRobotRulesParser();
robots.txtをパース
● パース
BaseRobotRules rules = parser.parseContent(
"http://www.example.com",
content,
"text/plain",
"Sample Crawler");
robots.txtをパース
● パース
BaseRobotRules rules = parser.parseContent(
"http://www.example.com",
content,
"text/plain",
"Sample Crawler");
URL(ログの出力に使われる )
robots.txtの内容
robots.txtのContent-Type
クローラーの名前
robots.txtをパース
● 結果を取得
boolean isAllowed =
rules.isAllowed("http://example.com/help/faq.html");
List<String> sitemaps = rules.getSitemaps();
許可されている場合は true
サイトマップ
サイトマップをパース
● 準備
URL sitemapUrl = new URL(
"http://www.example.com/sitemap.xml");
SiteMapParser parser = new SiteMapParserSAX();
サイトマップをパース
● パース
AbstractSiteMap sitemap = parser
.parseSiteMap(sitemapUrl);
if (sitemap.isIndex()) { }
else { ... }
サイトマップインデックスの場合
サイトマップをパース
● サイトマップインデックス
SiteMapIndex smIndex = (SiteMapIndex) sitemap;
for (AbstractSiteMap sm : smIndex.getSitemaps()) {
URL url = sm.getUrl();
...
}
(例) http://www.example.com/sitemap1.xml.gz
サイトマップをパース
● それ以外
SiteMap sm = (SiteMap) sitemap;
for (SiteMapURL u : sm.getSiteMapUrls()) {
URL url = u.getUrl();
...
}
(例) http://www.example.com/catalog?item=1
Atomをパース
● パース
URL atomUrl = new URL(
"http://www.example.com/atom.xml");
SiteMapParser parser = new SiteMapParserSAX();
SiteMap atom = (SiteMap) parser
.parseSiteMap(atomUrl);
TLD
● Webサイトの地域ターゲティング
● URLからTLDの取得はややこしい
TLDを取得
● 取得
EffectiveTLD etld = EffectiveTldFinder
.getEffectiveTLD("blogs.yahoo.co.jp");
String tld = etld.getDomain(); co.jp
まとめ
● Webクローラーにありがちな共通機能を提供
● robots.txt、サイトマップの解析
● こういったライブラリを活用するのも1つの手
Ad

Recommended

LocalStack
LocalStack
chibochibo
?
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
真治 米田
?
JAWSUG architecture-crowler
JAWSUG architecture-crowler
Takuro Sasaki
?
搁耻产测で始める奥别产スクレイピング
搁耻产测で始める奥别产スクレイピング
Takuro Sasaki
?
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
Takuro Sasaki
?
AWS Lambdaで作るクローラー/スクレイピング
AWS Lambdaで作るクローラー/スクレイピング
Takuro Sasaki
?
React系(別言語含む)の サーバーサイドレンダリング について考えよう
React系(別言語含む)の サーバーサイドレンダリング について考えよう
Kazuhiro Hara
?
搁耻产测によるクローラー开発
搁耻产测によるクローラー开発
しくみ製作所
?
20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools
Kazuki Ueki
?
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
Kazuya Numata
?
厂蚕尝による顿测苍补尘辞顿叠の操作
厂蚕尝による顿测苍补尘辞顿叠の操作
Sugawara Genki
?
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
Tetsuya Mase
?
はじめての datadog
はじめての datadog
Naoya Nakazawa
?
Re-frame and A-Frame
Re-frame and A-Frame
Kazuhiro Hara
?
Innovation eggcloudnative
Innovation eggcloudnative
Takuro Sasaki
?
Rubyで操るAWS 第67回Ruby関西 勉強会
Rubyで操るAWS 第67回Ruby関西 勉強会
Takuro Sasaki
?
?Node.jsて?始める Modern JavaScript Framework
?Node.jsて?始める Modern JavaScript Framework
kamiyam .
?
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
医療IT数学同好会 T/T
?
AWS Step Functionsを使ったバックアップシステム
AWS Step Functionsを使ったバックアップシステム
Akihiro Kamiyama
?
AWS CLIでEC2の利用料金を節約する
AWS CLIでEC2の利用料金を節約する
Yasuyuki Sato
?
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
三七男 山本
?
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-
chibochibo
?
LINE API × heroku ×selenium
LINE API × heroku ×selenium
医療IT数学同好会 T/T
?
Reactjs
Reactjs
しくみ製作所
?
200k/sec
200k/sec
Sugawara Genki
?
颁补辫测产补谤补で雑に奥别产スクレイピング
颁补辫测产补谤补で雑に奥别产スクレイピング
Koji Nakamura
?
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
chibochibo
?
グラフ解析で社长の脳内さらす!
グラフ解析で社长の脳内さらす!
Kazuki Morozumi
?
笔测迟丑辞苍による奥别产スクレイピング入门
笔测迟丑辞苍による奥别产スクレイピング入门
Hironori Sekine
?
奥别产サーハ?の性能测定
奥别产サーハ?の性能测定
Ryo Maruyama
?

More Related Content

What's hot (20)

20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools
Kazuki Ueki
?
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
Kazuya Numata
?
厂蚕尝による顿测苍补尘辞顿叠の操作
厂蚕尝による顿测苍补尘辞顿叠の操作
Sugawara Genki
?
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
Tetsuya Mase
?
はじめての datadog
はじめての datadog
Naoya Nakazawa
?
Re-frame and A-Frame
Re-frame and A-Frame
Kazuhiro Hara
?
Innovation eggcloudnative
Innovation eggcloudnative
Takuro Sasaki
?
Rubyで操るAWS 第67回Ruby関西 勉強会
Rubyで操るAWS 第67回Ruby関西 勉強会
Takuro Sasaki
?
?Node.jsて?始める Modern JavaScript Framework
?Node.jsて?始める Modern JavaScript Framework
kamiyam .
?
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
医療IT数学同好会 T/T
?
AWS Step Functionsを使ったバックアップシステム
AWS Step Functionsを使ったバックアップシステム
Akihiro Kamiyama
?
AWS CLIでEC2の利用料金を節約する
AWS CLIでEC2の利用料金を節約する
Yasuyuki Sato
?
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
三七男 山本
?
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-
chibochibo
?
LINE API × heroku ×selenium
LINE API × heroku ×selenium
医療IT数学同好会 T/T
?
Reactjs
Reactjs
しくみ製作所
?
200k/sec
200k/sec
Sugawara Genki
?
颁补辫测产补谤补で雑に奥别产スクレイピング
颁补辫测产补谤补で雑に奥别产スクレイピング
Koji Nakamura
?
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
chibochibo
?
グラフ解析で社长の脳内さらす!
グラフ解析で社长の脳内さらす!
Kazuki Morozumi
?
20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools
Kazuki Ueki
?
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
高トラフィックサイトを搁补颈濒蝉で构筑するための罢颈辫蝉基础编
Kazuya Numata
?
厂蚕尝による顿测苍补尘辞顿叠の操作
厂蚕尝による顿测苍补尘辞顿叠の操作
Sugawara Genki
?
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
Tetsuya Mase
?
Innovation eggcloudnative
Innovation eggcloudnative
Takuro Sasaki
?
Rubyで操るAWS 第67回Ruby関西 勉強会
Rubyで操るAWS 第67回Ruby関西 勉強会
Takuro Sasaki
?
?Node.jsて?始める Modern JavaScript Framework
?Node.jsて?始める Modern JavaScript Framework
kamiyam .
?
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
础奥厂で地球の里侧ブラジルの人にすばやく奥贰叠サイトを见せたい。
医療IT数学同好会 T/T
?
AWS Step Functionsを使ったバックアップシステム
AWS Step Functionsを使ったバックアップシステム
Akihiro Kamiyama
?
AWS CLIでEC2の利用料金を節約する
AWS CLIでEC2の利用料金を節約する
Yasuyuki Sato
?
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
三七男 山本
?
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-
chibochibo
?
颁补辫测产补谤补で雑に奥别产スクレイピング
颁补辫测产补谤补で雑に奥别产スクレイピング
Koji Nakamura
?
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
chibochibo
?
グラフ解析で社长の脳内さらす!
グラフ解析で社长の脳内さらす!
Kazuki Morozumi
?

Similar to Crawler Commons (20)

笔测迟丑辞苍による奥别产スクレイピング入门
笔测迟丑辞苍による奥别产スクレイピング入门
Hironori Sekine
?
奥别产サーハ?の性能测定
奥别产サーハ?の性能测定
Ryo Maruyama
?
厂辫谤辞肠办别迟蝉を捨てたい
厂辫谤辞肠办别迟蝉を捨てたい
Masato Noguchi
?
45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄
Yukio Saito
?
20110305冲颁辞诲别4尝颈产2011参加报告会:田辺浩介参加报告
20110305冲颁辞诲别4尝颈产2011参加报告会:田辺浩介参加报告
Code4Lib JAPAN
?
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Yukimitsu Izawa
?
サーバーの初歩的な话セミナー@大阪20120901
サーバーの初歩的な话セミナー@大阪20120901
Masayuki Abe
?
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
Kazuki Tsutsumi
?
尘颈苍苍别で学ぶクラウド脳
尘颈苍苍别で学ぶクラウド脳
Uchio Kondo
?
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
Yuki KAN
?
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
Masakazu Muraoka
?
奥别产サーバの基础知识【编集済み】
奥别产サーバの基础知识【编集済み】
Kikunaga Taishi
?
JavaScript And Keywords
JavaScript And Keywords
uupaa
?
础苍别尘辞苍别によるクローラー入门
础苍别尘辞苍别によるクローラー入门
Tasuku Nakano
?
Web制作勉強会 #2
Web制作勉強会 #2
Moto Yan
?
Code4Lib 2010報告会?発表ダイジェスト
Code4Lib 2010報告会?発表ダイジェスト
Masao Takaku
?
Isomorphic web development with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
?
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から设计?开発?保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から设计?开発?保守に活かす!~
貴志 上坂
?
笔测迟丑辞苍による奥别产スクレイピング入门
笔测迟丑辞苍による奥别产スクレイピング入门
Hironori Sekine
?
奥别产サーハ?の性能测定
奥别产サーハ?の性能测定
Ryo Maruyama
?
厂辫谤辞肠办别迟蝉を捨てたい
厂辫谤辞肠办别迟蝉を捨てたい
Masato Noguchi
?
45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄
Yukio Saito
?
20110305冲颁辞诲别4尝颈产2011参加报告会:田辺浩介参加报告
20110305冲颁辞诲别4尝颈产2011参加报告会:田辺浩介参加报告
Code4Lib JAPAN
?
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Yukimitsu Izawa
?
サーバーの初歩的な话セミナー@大阪20120901
サーバーの初歩的な话セミナー@大阪20120901
Masayuki Abe
?
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
Kazuki Tsutsumi
?
尘颈苍苍别で学ぶクラウド脳
尘颈苍苍别で学ぶクラウド脳
Uchio Kondo
?
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
Yuki KAN
?
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
Masakazu Muraoka
?
奥别产サーバの基础知识【编集済み】
奥别产サーバの基础知识【编集済み】
Kikunaga Taishi
?
JavaScript And Keywords
JavaScript And Keywords
uupaa
?
础苍别尘辞苍别によるクローラー入门
础苍别尘辞苍别によるクローラー入门
Tasuku Nakano
?
Web制作勉強会 #2
Web制作勉強会 #2
Moto Yan
?
Code4Lib 2010報告会?発表ダイジェスト
Code4Lib 2010報告会?発表ダイジェスト
Masao Takaku
?
Isomorphic web development with scala and scala.js
Isomorphic web development with scala and scala.js
TanUkkii
?
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から设计?开発?保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から设计?开発?保守に活かす!~
貴志 上坂
?
Ad

More from chibochibo (11)

Tour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 Minutes
chibochibo
?
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
chibochibo
?
Dynamic SQL in doobie
Dynamic SQL in doobie
chibochibo
?
Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?
chibochibo
?
What is doobie? - database access for scala -
What is doobie? - database access for scala -
chibochibo
?
蚕耻补谤迟锄て?肠谤辞苍を范囲検索したい
蚕耻补谤迟锄て?肠谤辞苍を范囲検索したい
chibochibo
?
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
chibochibo
?
苍颈辞で作った叠耻蹿蹿别谤别诲奥谤颈迟别谤に変えたら例外になった
苍颈辞で作った叠耻蹿蹿别谤别诲奥谤颈迟别谤に変えたら例外になった
chibochibo
?
What's a macro?: Learning by Examples
What's a macro?: Learning by Examples
chibochibo
?
Spring Boot Introduction
Spring Boot Introduction
chibochibo
?
厂濒颈肠办入门
厂濒颈肠办入门
chibochibo
?
Tour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 Minutes
chibochibo
?
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
chibochibo
?
Dynamic SQL in doobie
Dynamic SQL in doobie
chibochibo
?
Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?
chibochibo
?
What is doobie? - database access for scala -
What is doobie? - database access for scala -
chibochibo
?
蚕耻补谤迟锄て?肠谤辞苍を范囲検索したい
蚕耻补谤迟锄て?肠谤辞苍を范囲検索したい
chibochibo
?
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
chibochibo
?
苍颈辞で作った叠耻蹿蹿别谤别诲奥谤颈迟别谤に変えたら例外になった
苍颈辞で作った叠耻蹿蹿别谤别诲奥谤颈迟别谤に変えたら例外になった
chibochibo
?
What's a macro?: Learning by Examples
What's a macro?: Learning by Examples
chibochibo
?
Spring Boot Introduction
Spring Boot Introduction
chibochibo
?
厂濒颈肠办入门
厂濒颈肠办入门
chibochibo
?
Ad

Crawler Commons