urllib.robotparser — Control de acceso a arañas de Internet

Propósito:Analiza el archivo robots.txt usado para controlar arañas de Internet

robotparser implementa un analizador para el formato de archivo robots.txt, incluyendo una función que verifica si un agente de usuario determinado puede acceder a un recurso. Está destinado para su uso en arañas de buen comportamiento, u otras aplicaciones de rastreador que necesitan ser aceleradas o de lo contrario restringidas.

robots.txt

El formato del archivo robots.txt es un simple sistema de control de acceso basado en texto para programas informáticos que acceden automáticamente a los recursos web. («arañas», «rastreadores», etc.). El archivo se compone de registros que especifican el identificador de agente de usuario para el programa seguido de una lista de URLs (o prefijos de URL) que el agente no puede acceder.

Este es el archivo robots.txt para https://pymotw.com/:

robots.txt

Sitemap: https://pymotw.com/sitemap.xml
User-agent: *
Disallow: /admin/
Disallow: /downloads/
Disallow: /media/
Disallow: /static/
Disallow: /codehosting/

Evita el acceso a algunas de las partes del sitio que son difíciles para computar y sobrecargaría el servidor si un motor de búsqueda intentara indexarlos. Para un conjunto más completo de ejemplos de robots.txt, consulta La página Web de Robots.

Probar de permisos de acceso

Usar los datos presentados anteriormente, un simple rastreador puede probar si se le permite descargar una página usando 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()

El argumento del URL para can_fetch() puede ser una ruta relativa a la raíz del sitio, o un URL completo.

$ 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

Arañas longevas

Una aplicación que necesita mucho tiempo para procesar los recursos que descarga o que se limita a hacer una pausa entre descargas debe comprobar los nuevos archivos robots.txt periódicamente según la edad de el contenido que ya ha descargado. La edad no se maneja automáticamente, pero hay métodos de conveniencia para hacer más fácil el seguimiento.

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()

Este ejemplo extremo descarga un nuevo archivo robots.txt si el que tiene más de un segundo de antigüedad.

$ 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

Una versión mejor de la aplicación de larga duración podría solicitar el tiempo de modificación del archivo antes de descargar todo el archivo. Por otro lado, los archivos robots.txt suelen ser bastante pequeños, por lo que no es mucho más difícil recuperar el documento completo otra vez.

Ver también