robotparser - Controlla l'accesso degli spider internet

Scopo Elabora il file robots.txt usato per controllare gli spider internet
Versione Python 2.1.3 e successiva

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 modulo robotparser è stato rinominato urllib.robotparser in Python 3.0. Il codice esistente che usa robotparser può essere aggiornato usando 2to3.

robots.txt

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.

Un Semplice Esempio

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

Spider Longevi

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:

robotparser
La documentazione della libreria standard per questo modulo.
The Web Robots Page
Descrizione del formato di robots.txt