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/
:
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()
.
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.
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
- Documentación de la biblioteca estándar para urllib.robotparser
- La página Web de Robots – Descripción del formato de
robots.txt
.