【Java クローラ】robots.txt食べてみた
bot動かすならrobots.txtも残さず食べましょう。
Javaから(直接的にでも間接的にでも)利用して動かせるものを探して彷徨いました。
Crawler-Commons
探すとGoogle codeとかGitHubとかで公開されてるJava用のライブラリ。
jarはMVN Repositoryから入手可能ですが、なぜかGoogle code時代のやつとGitHub時代のやつが別々に登録されてます。
ライブラリはcommons-io 2.4、httpclient 4.3.5、tika-core 1.8、slf4j-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ド素人ですがが、WindowsにPython入れて、EclipseにPyDev組み合わせてデバッグモードで立ち上げる所までは持っていけました。
第一関門、プロキシの越え方がわからない。諦めて手元に置いたファイルを食わせ、外からクラス内の値を直接触る強硬手段に出る。
第二関門、エントリーの適用順がおかしい。プロキシ越えらない都合上、#set_url とか #read を馬鹿正直に叩けないので、代替処理をクラスの外から呼び出してました。
そのせいなのか、サンプルのrobots.txtがよろしくないのか分かりませんが、対象パスをdisallow→allowの順に解釈してしまう現象に悩まされ(拒否られてないはずなのに拒否判定され)、うまく動かず。