Рубрики
Без рубрики

urllib.robotparser – Контроль доступа Internet Spider

Автор оригинала: 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 обычно довольно малы, поэтому просто повторно получить весь документ не намного дороже.

Смотрите также