Я работаю над презентацией о парсинге веб-страниц и пытаюсь объяснить некоторые части файла robots.txt.
Учитывая следующий раздел файла robots.txt Википедии, кажется, что IsraBot
разрешено очищать /
в то время как Mediapartners-Google*
нет.
# advertising-related bots:
User-agent: Mediapartners-Google*
Disallow: /
# Wikipedia work bots:
User-agent: IsraBot
Disallow:
Это подтверждается
url = 'https://en.wikipedia.org'
rfp = urllib.robotparser.RobotFileParser(f'{url}/robots.txt')
rfp.read()
bots = ["*", "Mediapartners-Google*", "IsraBot", "gsa-garmin"]
for bot in bots:
print(rfp.can_fetch(bot, f'{url}/'))
# True
# False
# True
# True
Однако, когда я смотрю на файл robots.txt от Garmin, кажется, что они довольно открыты для соскоб. Они даже отмечают, что их намерение состоит в том, чтобы все боты могли выполнять скрапинг, за некоторыми исключениями.
# Allow all agents to get all stuff
User-agent: *
Disallow:
# ...except this stuff...
# pointless without POSTed form data:
Disallow: /products/comparison.jsp
# not for the general public:
Disallow: /dealerResource/*
Disallow: /lbt/*
User-agent: gsa-garmin
Allow: /
Тем не менее, запуск того же кода, что и выше, на сайте Garmin, похоже, не позволяет ботам выполнять парсинг.
url = 'https://www.garmin.com'
rfp = urllib.robotparser.RobotFileParser(f'{url}/robots.txt')
rfp.read()
bots = ["*", "Mediapartners-Google*", "IsraBot", "gsa-garmin"]
for bot in bots:
print(rfp.can_fetch(bot, f'{url}/'))
# False
# False
# False
# False
Я думаю, главный вопрос заключается в том, в чем разница между двумя строками ниже (для Disallow или Allow)? Я прочитал это, так как в первом говорится, что ничего не запрещено, а во втором говорится, что «/» запрещено.
Disallow:
Disallow: /
Я также недоумеваю, почему rfp.can_fetch('gsa-garmin', 'https://www.garmin.com/')
возвращает False
.
Есть ли разница между этими строками?
Disallow:
Allow: /
Даже ответы на этот вопрос предполагают, что я правильно понимаю, но код говорит об обратном . Также в ответах на этот вопрос указано, что директива Allow
является нестандартное расширение, но RobotFileParser.parse()
поддерживает его.
И если это ошибка с Python, это было выполнено с Python 3.7.5.