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