SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
Crawler-Commons
2017-09-30
第二十回 #渋谷java
Me
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
Apache PredictionIOのコミッタになりました
クローラーって?
● インターネットに蓄積されている様々な情報を収集し
● データとして活用できるようにするためのもの
● 情報提供してくださる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つの手

Weitere ähnliche Inhalte

Was ist angesagt?

JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LTJAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
三七男 山本
 
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with ElasticsearchSpark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
chibochibo
 

Was ist angesagt? (20)

20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
 
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
SWF+FlowFrameworkを使ってみた@JAWS-UG高尾山 2015.09.27
 
はじめての datadog
はじめての datadogはじめての datadog
はじめての datadog
 
Re-frame and A-Frame
Re-frame and A-FrameRe-frame and A-Frame
Re-frame and A-Frame
 
Innovation eggcloudnative
Innovation eggcloudnativeInnovation eggcloudnative
Innovation eggcloudnative
 
Rubyで操るAWS 第67回Ruby関西 勉強会
Rubyで操るAWS 第67回Ruby関西 勉強会Rubyで操るAWS 第67回Ruby関西 勉強会
Rubyで操るAWS 第67回Ruby関西 勉強会
 
Node.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript FrameworkNode.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript Framework
 
AWSで地球の裏側ブラジルの人にすばやくWEBサイトを見せたい。
AWSで地球の裏側ブラジルの人にすばやくWEBサイトを見せたい。AWSで地球の裏側ブラジルの人にすばやくWEBサイトを見せたい。
AWSで地球の裏側ブラジルの人にすばやくWEBサイトを見せたい。
 
AWS Step Functionsを使ったバックアップシステム
AWS Step Functionsを使ったバックアップシステムAWS Step Functionsを使ったバックアップシステム
AWS Step Functionsを使ったバックアップシステム
 
AWS CLIでEC2の利用料金を節約する
AWS CLIでEC2の利用料金を節約するAWS CLIでEC2の利用料金を節約する
AWS CLIでEC2の利用料金を節約する
 
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LTJAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
 
Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-Spark Streaming on AWS -S3からKinesisへ-
Spark Streaming on AWS -S3からKinesisへ-
 
LINE API × heroku ×selenium
LINE API × heroku ×selenium LINE API × heroku ×selenium
LINE API × heroku ×selenium
 
Reactjs
ReactjsReactjs
Reactjs
 
200k/sec
200k/sec200k/sec
200k/sec
 
Capybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピングCapybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピング
 
Spark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with ElasticsearchSpark in small or middle scale data processing with Elasticsearch
Spark in small or middle scale data processing with Elasticsearch
 
グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!
 

Ähnlich wie Crawler Commons

Webサーバの性能測定
Webサーバの性能測定Webサーバの性能測定
Webサーバの性能測定
Ryo Maruyama
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
Code4Lib JAPAN
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Yukimitsu Izawa
 
サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901
Masayuki Abe
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
Yuki KAN
 
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
Masakazu Muraoka
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
Kikunaga Taishi
 
Code4Lib 2010報告会・発表ダイジェスト
Code4Lib 2010報告会・発表ダイジェストCode4Lib 2010報告会・発表ダイジェスト
Code4Lib 2010報告会・発表ダイジェスト
Masao Takaku
 

Ähnlich wie Crawler Commons (20)

PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門
 
Webサーバの性能測定
Webサーバの性能測定Webサーバの性能測定
Webサーバの性能測定
 
Sprocketsを捨てたい
Sprocketsを捨てたいSprocketsを捨てたい
Sprocketsを捨てたい
 
45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄45分で理解する webクローリング入門 斉藤之雄
45分で理解する webクローリング入門 斉藤之雄
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
 
Zynga
ZyngaZynga
Zynga
 
Aws privte20110406 arai
Aws privte20110406 araiAws privte20110406 arai
Aws privte20110406 arai
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 
サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901サーバーの初歩的な話セミナー@大阪20120901
サーバーの初歩的な話セミナー@大阪20120901
 
高速!Clojure Web 開発入門
高速!Clojure Web 開発入門高速!Clojure Web 開発入門
高速!Clojure Web 開発入門
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
 
Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会Rdbms起点で考えると見えない世界 okuyama勉強会
Rdbms起点で考えると見えない世界 okuyama勉強会
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywords
 
Anemoneによるクローラー入門
Anemoneによるクローラー入門Anemoneによるクローラー入門
Anemoneによるクローラー入門
 
Web制作勉強会 #2
Web制作勉強会 #2Web制作勉強会 #2
Web制作勉強会 #2
 
Code4Lib 2010報告会・発表ダイジェスト
Code4Lib 2010報告会・発表ダイジェストCode4Lib 2010報告会・発表ダイジェスト
Code4Lib 2010報告会・発表ダイジェスト
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
クラウドデザインパターンから始めるクラウドの利点と弱点の理解~提案から設計・開発・保守に活かす!~
 

Mehr von chibochibo

Mehr von chibochibo (11)

Tour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 MinutesTour of Apache PredictionIO in 10 Minutes
Tour of Apache PredictionIO in 10 Minutes
 
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching PatternDeadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
Deadly Code! (seriously) Blocking &amp; Hyper Context Switching Pattern
 
Dynamic SQL in doobie
Dynamic SQL in doobieDynamic SQL in doobie
Dynamic SQL in doobie
 
Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?Is spark streaming based on reactive streams?
Is spark streaming based on reactive streams?
 
What is doobie? - database access for scala -
What is doobie? - database access for scala -What is doobie? - database access for scala -
What is doobie? - database access for scala -
 
Quartzでcronを範囲検索したい
Quartzでcronを範囲検索したいQuartzでcronを範囲検索したい
Quartzでcronを範囲検索したい
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 
nioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になったnioで作ったBufferedWriterに変えたら例外になった
nioで作ったBufferedWriterに変えたら例外になった
 
What's a macro?: Learning by Examples
What's a macro?: Learning by ExamplesWhat's a macro?: Learning by Examples
What's a macro?: Learning by Examples
 
Spring Boot Introduction
Spring Boot IntroductionSpring Boot Introduction
Spring Boot Introduction
 
Slick入門
Slick入門Slick入門
Slick入門
 

Crawler Commons