Scopo | Elabora il file robots.txt usato per controllare gli spider internet |
Versione Python | 2.1.3 e successiva |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per le versioni 3.x di Python
Il modulo
robotparser
implementa un parser per il formato del file
robots.txt
, inclusa una semplice funzione per controllare se un dato user agent può avere accesso ad una risorsa. E' inteso per l'uso con spider "ben-educati" od altre applicazioni
crawler
che devono essere limitate od in altromodo ristrette.
Il formato del file
robots.txt
è un formato di testo con un semplice sistema di controllo degli accessi per i programmi che accedono automaticamente alle risorse web ("spider", "crawler", ecc.). Il file è composto da record che specificano l'identificatore dell' l'user agent per il programma, seguito da un elenco di URL (o prefissi di URL) ai quali l'agente non dovrebbe accedere.
Questo è il file
robots.txt
per
http://www.doughellmann.com/
User-agent: * Disallow: /admin/ Disallow: /downloads/ Disallow: /media/ Disallow: /static/ Disallow: /codehosting/
Previene l'accesso a parti rilevanti del sito che potrebbero sovraccaricare il server se un motore di ricerca tentasse di indicizzarle. Per una serie di esempi più completi fare riferimento a The Web Robots Page.
Usando i dati di cui sopra, un semplice crawler può verificare se gli è consentito scaricare una pagina usando il metodo di
RobotFileParser
can_fetch()
import robotparser
import urlparse
AGENT_NAME = 'PyMOTW'
URL_BASE = 'http://www.doughellmann.com/'
parser = robotparser.RobotFileParser()
parser.set_url(urlparse.urljoin(URL_BASE, 'robots.txt'))
parser.read()
PATHS = [
'/',
'/PyMOTW/',
'/admin/',
'/downloads/PyMOTW-1.92.tar.gz',
]
for path in PATHS:
print '%6s : %s' % (parser.can_fetch(AGENT_NAME, path), path)
url = urlparse.urljoin(URL_BASE, path)
print '%6s : %s' % (parser.can_fetch(AGENT_NAME, url), url)
print
Il parametro URL per
can_fetch()
può essere un percorso relativo alla radice del sito, oppure un URL completo.
$ python robotparser_simple.py True : / True : http://www.doughellmann.com/ True : /PyMOTW/ True : http://www.doughellmann.com/PyMOTW/ False : /admin/ False : http://www.doughellmann.com/admin/ False : /downloads/PyMOTW-1.92.tar.gz False : http://www.doughellmann.com/downloads/PyMOTW-1.92.tar.gz
Una applicazione che impiega molto tempo per elaborare le risorse che scarica o che è limitata a mettersi in pausa tra i download potrebbe volere verificare periodicamente se esistono nuovi file
robots.txt
in base all'età del contenuto che ha già scaricato. L'etàa non è gestita automaticamente, ma ci sono comodi metodi per tenerne facilmente traccia.
import robotparser
import time
import urlparse
AGENT_NAME = 'PyMOTW'
parser = robotparser.RobotFileParser()
# Si usa la copia locale
parser.set_url('robots.txt')
parser.read()
parser.modified()
PATHS = [
'/',
'/PyMOTW/',
'/admin/',
'/downloads/PyMOTW-1.92.tar.gz',
]
for n, path in enumerate(PATHS):
print
age = int(time.time() - parser.mtime())
print 'age:', age,
if age > 1:
print 're-reading robots.txt'
parser.read()
parser.modified()
else:
print
print '%6s : %s' % (parser.can_fetch(AGENT_NAME, path), path)
# Simulazione di un ritardo nell'elaborazione
time.sleep(1)
Questo esempio particolarmente semplice scarica un nuovo file
robots.txt
se quello esistente è più vecchio di più di 1 secondo.
$ python robotparser_longlived.py age: 0 True : / age: 1 True : /PyMOTW/ age: 2 rilettura di robots.txt False : /admin/ age: 1 False : /downloads/PyMOTW-1.92.tar.gz
Una versione più "elegante" di questa applicazione potrebbe richiedere l'ora di modifica per il file prima di scaricarlo interamente. D'altro canto, i file
robots.txt
sono in genere piuttosto piccoli, quindi non costa più di tanto recuperare di nuovo l'intero documento.
Vedere anche: