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