urllib RobotFileParser — кажущиеся противоречивыми правила в robots.txt

#python #urllib #robots.txt

Вопрос:

Вот соответствующие части amazon.co.jp/robots.txt:

 User-agent: *
Disallow: /-/
Disallow: /gp/aw/shoppingAids/
Allow: /-/en/
 

URL, который я хочу проверить: "https://www.amazon.co.jp/-/en/035719/dp/B000H4W9WG/ref=sr_1_61?dchild=1amp;keywords=dot matrix printeramp;qid=1617229306amp;s=computersamp;sr=1-61"

Теперь это соответствует запрету: Disallow: /-/ но также и разрешению: Allow: /-/en/ .

анализатор файлов-роботов urllib помечает URL-адрес как can_fetch = False. Я проверил исходный код, и, похоже, он идет хронологически. Поскольку на первом месте стоит запрет, он помечает разрешение как ложное, и все.

Любая идея, если это правильный подход, учитывая robots.txt стандартно, потому что мне это кажется довольно нелогичным, и я считаю, что URL-адрес должен быть разрешен.

Соответствующий код:

 import urllib.robotparser
rp = urllib.robotparser.RobotFileParser()
rp.set_url("https://www.amazon.co.jp/robots.txt")
rp.read()
can_ftch = rp.can_fetch("*", "https://www.amazon.co.jp/-/en/035719/dp/B000H4W9WG/ref=sr_1_61?dchild=1amp;keywords=dot matrix printeramp;qid=1617229306amp;s=computersamp;sr=1-61")
 

ПРАВКА: по стандарту Google это должно работать так, как я думал. URL-адрес должен быть разрешен. the most specific rule based on the length of the [path] entry trumps the less specific (shorter) rule

https://developers.google.com/search/docs/advanced/robots/robots_txt#order-of-precedence-for-group-member-lines

EIDT2: еще немного покопался и нашел этот вопрос:

Для Google и Bing правило состоит в том, что выигрывает директива с наибольшим количеством символов. Вот, это директива «Запретить».

  • Запретить: /блог/ (6 символов)
  • Разрешить: /блог (5 символов)

Если директивы разрешить и запретить одинаковы по длине, то выигрывает наименее ограничительная директива. В этом случае это была бы директива allow.

Важно отметить, что это относится только к Google и Bing. Другие поисковые системы прислушиваются к первой соответствующей директиве. В данном случае это запрещено.

По этой логике анализатор RobotFileParser действительно верен.