Автор оригинала: Doug Hellmann.
Цель:
Разобрать
robots.txt
файл, используемый для управления интернет-пауками
robotparser
реализует синтаксический анализатор для формата файла robots.txt
, включая функцию, которая проверяет, может ли данный пользовательский агент получить доступ к ресурсу. Он предназначен для использования в хорошо управляемых пауках или других приложениях-обходчиках, которые необходимо либо регулировать, либо иным образом ограничивать.
robots.txt
Формат файла robots.txt
– это простая текстовая система контроля доступа для компьютерных программ, которые автоматически получают доступ к веб-ресурсам («пауки», «сканеры» и т. Д.). Файл состоит из записей, в которых указывается идентификатор пользовательского агента для программы, за которым следует список URL-адресов (или префиксов URL-адресов), к которым агент может не обращаться.
Это файл robots.txt
для https://pymotw.com/
:
robots.txt
Sitemap: https://pymotw.com/sitemap.xml User-agent: * Disallow: /admin/ Disallow: /downloads/ Disallow: /media/ Disallow: /static/ Disallow: /codehosting/
Это предотвращает доступ к некоторым частям сайта, которые требуют больших затрат на вычисление, и может перегрузить сервер, если поисковая система попытается их проиндексировать. Более полный набор примеров robots.txt
см. На странице веб-роботов .
Проверка прав доступа
Используя данные, представленные ранее, простой поисковый робот может проверить, разрешено ли загружать страницу, с помощью RobotFileParser.can_fetch ()
.
urllib_robotparser_simple.py
from urllib import parse from urllib import robotparser AGENT_NAME 'PyMOTW' URL_BASE 'https://pymotw.com/' parser robotparser.RobotFileParser() parser.set_url(parse.urljoin(URL_BASE, 'robots.txt')) parser.read() PATHS [ '/', '/PyMOTW/', '/admin/', '/downloads/PyMOTW-1.92.tar.gz', ] for path in PATHS: print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, path), path)) url parse.urljoin(URL_BASE, path) print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, url), url)) print()
Аргумент URL для can_fetch ()
может быть путем относительно корня сайта или полным URL.
$ python3 urllib_robotparser_simple.py True : / True : https://pymotw.com/ True : /PyMOTW/ True : https://pymotw.com/PyMOTW/ False : /admin/ False : https://pymotw.com/admin/ False : /downloads/PyMOTW-1.92.tar.gz False : https://pymotw.com/downloads/PyMOTW-1.92.tar.gz
Пауки-долгожители
Приложение, которому требуется много времени для обработки загружаемых ресурсов или которое регулируется для паузы между загрузками, должно периодически проверять наличие новых файлов robots.txt
в зависимости от возраста содержимого, которое оно уже загрузило. Возраст не контролируется автоматически, но есть удобные методы, облегчающие его отслеживание.
urllib_robotparser_longlived.py
from urllib import robotparser import time AGENT_NAME 'PyMOTW' parser robotparser.RobotFileParser() # Using the local copy parser.set_url('file:robots.txt') parser.read() parser.modified() PATHS [ '/', '/PyMOTW/', '/admin/', '/downloads/PyMOTW-1.92.tar.gz', ] for path in PATHS: age int(time.time() - parser.mtime()) print('age:', age, end' ') if age > 1: print('rereading robots.txt') parser.read() parser.modified() else: print() print('{!r:>6} : {}'.format( parser.can_fetch(AGENT_NAME, path), path)) # Simulate a delay in processing time.sleep(1) print()
В этом крайнем примере загружается новый файл robots.txt
, если тот, что у него есть, старше одной секунды.
$ python3 urllib_robotparser_longlived.py age: 0 True : / age: 1 True : /PyMOTW/ age: 2 rereading robots.txt False : /admin/ age: 1 False : /downloads/PyMOTW-1.92.tar.gz
Более хорошая версия долгоживущего приложения может запросить время модификации файла перед загрузкой всего файла. С другой стороны, файлы robots.txt
обычно довольно малы, поэтому просто повторно получить весь документ не намного дороже.
Смотрите также
- стандартная библиотечная документация для urllib.robotparser
- Страница веб-роботов – описание формата
robots.txt
.