2013-03-11 3 views
5

Я пишу обложку, и для этого я использую парсер robots.txt, я использую стандартный lib 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 

Это смешно, потому что иногда кажется, что «работа», а иногда, кажется, не получится, я также попробовал то же самое с robots.txt от Facebook и Stackoverflow. Это ошибка от модуля robotpaser? Или я делаю что-то не так? Если да, то?

мне было интересно, если this ошибка имела все, что связано

+0

Также я использую Python 2.7.3 на Linux-машине (Arch Linux) – 2013-03-11 17:10:55

ответ

2

После нескольких поисков Google я не нашел ничего о robotparser вопрос. Я закончил с чем-то еще, я нашел модуль под названием reppy, который я сделал несколько тестов, и он кажется очень мощным. Вы можете установить его через pip;

pip install reppy 

Вот несколько примеров (на IPython) с использованием reppy, опять же, используя 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

интересный вопрос Google. я имел взгляд на источник (я только питон 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' 

так это либо ошибка в библиотеке питона, или Google ломает robot.txt спецификации, причем в анкетах символ в правиле (что немного необычно).

[на всякий случай это непонятно, я скажу это снова по-другому. приведенный выше код используется библиотекой robotparser как часть проверки URL-адреса. поэтому, когда URL-адрес заканчивается символом «?», этот символ отбрасывается. поэтому, когда вы проверили /catalogs/p?, фактическое выполненное испытание было для /catalogs/p. следовательно, ваш неожиданный результат.]

Я предлагаю filing a bug с людьми-питонами (вы можете разместить ссылку на здесь как часть объяснения) [edit: thanks]. а затем с помощью другой библиотеки, которую вы нашли ...

+0

Спасибо! Вы правы, я сделал ту же проверку с библиотекой, которую я нашел, и, к сожалению, они делают то же самое, хотя она работает лучше, чем робот-плейер, они одинаковы. Я сообщил об ошибке -> http://bugs.python.org/issue17403 – 2013-03-12 17:19:09

1

Около недели назад мы объединили фиксацию с ошибкой в ​​ней, которая вызывает эту проблему. Мы просто нажали версию 0.2.2 на pip и master в репо, включая регрессионный тест именно для этой проблемы.

Версия 0.2 содержит небольшое изменение интерфейса - теперь вы должны создать объект RobotsCache, который содержит точный интерфейс, который первоначально имел reppy. Это было главным образом для того, чтобы сделать кеширование явным и позволить иметь разные кеши в рамках одного и того же процесса.Но вот, теперь он работает снова!

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

Спасибо! Замечательно! +10 для Реппи, сделал быструю проблему, и менее чем за 24 часа был решен! Еще раз спасибо! – 2013-03-14 13:11:27

4

Это не ошибка, а скорее разница в интерпретации. Согласно draft robots.txt specification (который никогда не был утвержден, и не является, вероятно, будет):

Чтобы оценить, если доступ к URL разрешен, робот должен попытаться соответствовать пути в Разрешить и Запретить линии по отношению к URL, в порядке , которые они записывают в записи. Используется первый найденный совпадение. Если совпадение найдено, по умолчанию предполагается, что URL-адрес разрешен.

(раздел 3.2.2, Разрешить и Запретить Линии)

Используя эту интерпретацию, а затем "/ каталоги/р?" должен быть отклонен, потому что ранее была директива «Запретить:/каталоги».

В какой-то момент 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 года. Когда я работал с искателем, у меня были настграммы от веб-мастеров, когда я использовал интерпретацию Google, потому что я просматривал страницы, которые, по их мнению, не нужно сканировать, и у меня были настграммы от других, если я использовал другую интерпретацию, потому что материал, который, по их мнению, должен был быть проиндексирован, не был.

Смежные вопросы