Я работаю над презентацией о поиске в Интернете и пытаюсь объяснить части файла 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
Однако, когда я смотрю на Garmin's robots.txt , похоже, они довольно открыты для очистки. Они даже комментируют, что их намерение состоит в том, чтобы все боты могли отказаться от нескольких исключений.
# 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