urllib.robotparser - Controllo Accesso degli Spider Internet

Scopo: Elabora il file robots.txt utilizzato per controllare gli spider internet

Il modulo robotparser implementa un elaboratore per il formato di file robots.txt, compresa una funzione per verificare se un dato user agent può accedere a una risorsa. E' concepito per l'uso in spider che "si comportano bene", o altre applicazioni crawler che devono essere in qualche modo limitate.

robots.txt

Il formato file robots.txt è un semplice sistema di controllo di accesso basato su testo semplice per programmi che accedono automaticamente a risorse web ("spider", "crawler", ecc.). Il file è composto da records che specificano l'identificativo dell'user agent per il programma seguito da un elenco di URL (o prefissi URL) ai quali l'agente non può accedere.

Questo è il file robots.txt per il sito https://pymotw.com:

robots.txt

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

Previene l'accesso ad alcune parti del sito che sono costose da elaborare e sovraccaricherebbero il server se il motore di ricerca cercasse di indicizzarle. Per un insieme di esempi più esaustivo fare riferimento a The Web Robots Page.

Verificare i Permessi di Accesso

Utilizzando i dati esposti qui sopra, un semplice crawler potrebbero verificare se gli sia consentito o meno scaricare una pagina 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()

L'argomento URL per can_fetch() può essere un percorso relativo alla radice del sito, oppure 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

Spider che Vivono a Lungo

Una applicazione che impiega un lungo periodo di tempo per elaborare le risorse che scarica o che viene costretta a effettuare pause tra gli scaricamenti dovrebbero cercare dei nuovi file robots.txt periodicamente in base all'età del contenuto che è già stato scaricato. Questo dato non viene gestito automaticamente ma ci sono metodi di comodo per facilitare la tracciatura.

# urllib_robotparser_longlived.py

from urllib import robotparser
import time

AGENT_NAME = 'PyMOTW'
parser = robotparser.RobotFileParser()
# Usa la copia locale
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('rilettura di robots.txt')
        parser.read()
        parser.modified()
    else:
        print()
    print('{!r:>6} : {}'.format(
        parser.can_fetch(AGENT_NAME, path), path))
    # Simula un differimento nell'elaborazione
    time.sleep(1)
    print()

Questo esempio estremizzato scarica un nuovo file robots.txt se quello che ha è più vecchio di un secondo.

$ python3 urllib_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ù efficace dell'applicazione potrebbe richiedere il tempo di modifica per il file prima di scaricare tutto quanto. D'altro canto, i file robots.txt sono in genere piuttosto piccoli, quindi non è eccessivamente costoso riscaricare nuovamente l'intero documento.

Vedere anche:

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