https://naba-san.hatenablog.com/


【Java クローラ】robots.txt食べてみた

bot動かすならrobots.txtも残さず食べましょう。

Javaから(直接的にでも間接的にでも)利用して動かせるものを探して彷徨いました。

Crawler-Commons

探すとGoogle codeとかGitHubとかで公開されてるJava用のライブラリ。
jarはMVN Repositoryから入手可能ですが、なぜかGoogle code時代のやつとGitHub時代のやつが別々に登録されてます。

ライブラリはcommons-io 2.4httpclient 4.3.5tika-core 1.8slf4j-api 1.7.7/nop 1.7.7で一通り動きました。

BaseRobotsParser parser = new SimpleRobotRulesParser();

String url = "http://www.hatena.ne.jp/robots.txt";
String robotsText = "User-Agent: *\r\n"+
	"Disallow: /prof/search\r\n"+
	"Disallow: /mobile/prof/search\r\n"+
	"Disallow: /faq/report/\r\n"+
	"Disallow: /api/\r\n"+
	"Disallow: /mobile/easylogin\r\n"+
	"Disallow: /hatenatypered\r\n";

String mime = "text/html";
String robotName = "oreoreBot";

BaseRobotRules rules = parser.parseContent(url, robotsText.getBytes(), mime, robotName);

// おk
System.out.println(rules.isAllowed("http://www.hatena.ne.jp/"));

// ダメー
System.out.println(rules.isAllowed("http://www.hatena.ne.jp/mobile/easylogin/"));

// ダメー?
System.out.println(rules.isAllowed("https://www.hatena.ne.jp/mobile/easylogin/"));

実行結果

true
false
false

robots.txtは素のHTTPですが、テストコードの3件目はhttpsでもDisallowに引っかかってますね。
サンプルの状態ではスキーマをうまく認識してない?(ちゃんとソース読んでないけど、そもそも区別してない?)

とりあえず動かすところまでは確認。最低限動いてるかな?

他の候補とか

気が向いたら試してみたいやつとか、そうじゃないやつとか。

RobotParser (Python 2.7)

Python 2.7 標準ライブラリに含まれるrobot parser。

Pythonド素人ですがが、WindowsPython入れて、EclipseにPyDev組み合わせてデバッグモードで立ち上げる所までは持っていけました。

第一関門、プロキシの越え方がわからない。諦めて手元に置いたファイルを食わせ、外からクラス内の値を直接触る強硬手段に出る。

第二関門、エントリーの適用順がおかしい。プロキシ越えらない都合上、#set_url とか #read を馬鹿正直に叩けないので、代替処理をクラスの外から呼び出してました。
そのせいなのか、サンプルのrobots.txtがよろしくないのか分かりませんが、対象パスをdisallow→allowの順に解釈してしまう現象に悩まされ(拒否られてないはずなのに拒否判定され)、うまく動かず。

Javaからの(コンソール経由での)制御諸々にも難点があり、内部処理のデバッグも程々にして利用を諦めました。

WWW-RobotRules-Extended

Perlで動くパーサで、CPANからモジュールとして入手可能とのこと。

Pythonと同じ問題が付きまといそうなのと、あまりシステム汚したくなかったので今回はパス。

jrobotx

同じjava向けのライブラリで、GitHubから入手可能。ずっと更新されてないので今回は見送り。