2013-03-11 16 views
5

私はクローラを作成しています。このためにrobots.txtパーサーを実装しています。私は標準ライブラリを使用しています。robotparserです。Robotparserが正しく解析されていないようです

robotparserが正しくパースないで、私はGoogleのrobots.txtを使用して、私のクローラをデバッグしていているようです。

(以下の例では、IPythonからです)

In [1]: import robotparser 

In [2]: x = robotparser.RobotFileParser() 

In [3]: x.set_url("http://www.google.com/robots.txt") 

In [4]: x.read() 

In [5]: x.can_fetch("My_Crawler", "/catalogs") # This should return False, since it's on Disallow 
Out[5]: False 

In [6]: x.can_fetch("My_Crawler", "/catalogs/p?") # This should return True, since it's Allowed 
Out[6]: False 

In [7]: x.can_fetch("My_Crawler", "http://www.google.com/catalogs/p?") 
Out[7]: False 

時にはそれが「仕事」のようですし、時には失敗しているようですので、それは面白いです、私はまた、FacebookとのStackOverflowからのrobots.txtで同じことを試してみました。これはrobotpaserモジュールのバグですか?あるいは私はここで何か間違っているのですか?もしそうなら、何?

thisバグは私が何についてrobotparser問題を見つけることができませんでしたいくつかのGoogle検索後

+0

またLinuxマシンでPython 2.7.3を使用しています(Arch Linux) –

答えて

2

関連何かを持っていた場合、私は思っていました。私は他の何かに終わった、私はいくつかのテストを行ったと非常に強力なようだreppyと呼ばれるモジュールを見つけた。 pipでインストールできます。ここで

pip install reppy 

reppyを使用して(IPythonの)いくつかの例では、Googleのrobots.txt

In [1]: import reppy 

In [2]: x = reppy.fetch("http://google.com/robots.txt") 

In [3]: x.atts 
Out[3]: 
{'agents': {'*': <reppy.agent at 0x1fd9610>}, 
'sitemaps': ['http://www.gstatic.com/culturalinstitute/sitemaps/www_google_com_culturalinstitute/sitemap-index.xml', 
    'http://www.google.com/hostednews/sitemap_index.xml', 
    'http://www.google.com/sitemaps_webmasters.xml', 
    'http://www.google.com/ventures/sitemap_ventures.xml', 
    'http://www.gstatic.com/dictionary/static/sitemaps/sitemap_index.xml', 
    'http://www.gstatic.com/earth/gallery/sitemaps/sitemap.xml', 
    'http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xml', 
    'http://www.gstatic.com/trends/websites/sitemaps/sitemapindex.xml']} 

In [4]: x.allowed("/catalogs/about", "My_crawler") # Should return True, since it's allowed. 
Out[4]: True 

In [5]: x.allowed("/catalogs", "My_crawler") # Should return False, since it's not allowed. 
Out[5]: False 

In [7]: x.allowed("/catalogs/p?", "My_crawler") # Should return True, since it's allowed. 
Out[7]: True 

In [8]: x.refresh() # Refresh robots.txt, perhaps a magic change? 

In [9]: x.ttl 
Out[9]: 3721.3556718826294 

In [10]: # It also has a x.disallowed function. The contrary of x.allowed 
2

興味深い質問を使用して、再び、です。私は、ソースを見ては、(私は唯一のpython 2.4のソースを用意して、私はそれが変更されていない賭け)持っていたし、コードが実行することによってテストされているURLを正規化する:

urllib.quote(urlparse.urlparse(urllib.unquote(url))[2]) 

の源でありますあなたの問題:「?」

>>> urllib.quote(urlparse.urlparse(urllib.unquote("/foo"))[2]) 
'/foo' 
>>> urllib.quote(urlparse.urlparse(urllib.unquote("/foo?"))[2]) 
'/foo' 

がそう、それはPythonのライブラリのバグのどちらかだ、またはGoogleが含むことにより、robot.txt仕様を壊していますルール内の文字(これは少し珍しい)です。

[明らかでない場合には、別の方法でもう一度言います。上記のコードは、urlのチェックの一環としてrobotparserライブラリによって使用されます。したがって、URLが「?」で終わると、そのキャラクターはドロップされます。だから/catalogs/p?をチェックしたときに実行された実際のテストは/catalogs/pでした。あなたの驚くべき結果です。]

私は、pythonの人々とfiling a bugを提案しています(あなたは説明の一部としてここにリンクを掲示することができます)[編集:thanks]。あなたが見つけた他のライブラリを使用しています。

+0

ありがとう!あなたは正しいです、私は見つけたlibと同じチェックをしましたが、残念ながら彼らは同じことをしますが、ロボットパーサーよりも優れていますが、問題は同じです。私はバグを報告しました - > http://bugs.python.org/issue17403 –

1

約1週間前に、この問題の原因となっているバグに、コミットがマージされました。我々はバージョン0.2.2をプッシュして、この問題のリグレッションテストを含むレポに徹底的に徹底させました。

バージョン0.2にはわずかなインタフェース変更が含まれています。reppyが元々持っていたインタフェースを含むRobotsCacheオブジェクトを作成する必要があります。これは主にキャッシュを明示的にし、同じプロセス内で異なるキャッシュを持つことを可能にすることでした。しかし、見よ、それは今再び働く!

from reppy.cache import RobotsCache 
cache = RobotsCache() 
cache.allowed('http://www.google.com/catalogs', 'foo') 
cache.allowed('http://www.google.com/catalogs/p', 'foo') 
cache.allowed('http://www.google.com/catalogs/p?', 'foo') 
+1

ありがとう!それは素晴らしいことです! Reppyのための+10、すぐに問題を起こし、24時間以内に解決されました!再度、感謝します! –

4

これはバグではなく、解釈の違いです。

URLへのアクセスが許可されている場合、ロボットは 許可でのパスに一致するようにしようと反対のラインを禁止しなければなりません評価する:(承認されていない、またそれは可能性があるんでした)draft robots.txt specificationによると、 URLには、 の順序でレコードに記録されます。見つかった最初の一致が使用されます。 と一致するものが見つからない場合、デフォルトの前提はURLが許可されていることです。

(セクション3.2.2、許可及び許可しない行)、その解釈を使用して

"/カタログ/ P?"以前は "Disallow:/ catalogs"というディレクティブが存在するため、拒否する必要があります。

ある時点で、Googleはその仕様とは違ってrobots.txtの解釈を開始しました。彼らの方法があるように思われる:

Check for Allow. If it matches, crawl the page. 
Check for Disallow. If it matches, don't crawl. 
Otherwise, crawl. 

問題はrobots.txtの解釈上の正式な合意がないことです。私は、Googleの方法と1996年のドラフト標準を使用している他のものを使用するクローラを見ました。私がクローラを操作しているとき、クロールするべきではないと思ったページをクロールしたので、彼らが索引を付けるべきであると思ったものが索引付けされるべきであったので、他の解釈を使用した場合、他人からの嫌悪感を得ました。

関連する問題