2014-06-15 14 views
36

voglio aprire un URL utilizzando urllib.request.urlopen('someurl'):Cambiare User Agent in Python 3 per urrlib.request.urlopen

with urllib.request.urlopen('someurl') as url: 
b = url.read() 

Continuo a ricevere il seguente errore:

urllib.error.HTTPError: HTTP Error 403: Forbidden 

ho capito l'errore essere dovuto al fatto che il sito non consente a Python di accedervi, per evitare che i bot sprechino le loro risorse di rete, il che è comprensibile. Sono andato alla ricerca e ho scoperto che è necessario cambiare l'interprete per urllib. Tuttavia tutte le guide e le soluzioni che ho trovato per questo problema su come cambiare l'user agent sono state con urllib2, e sto usando python 3 in modo che tutte le soluzioni non funzionino.

Come posso risolvere questo problema con python 3?

+0

un [403 errore] (http://pcsupport.about.com/od/findbyerrormessage/a/403error.htm) potrebbe non essere dovuto al tuo user-agent. – hd1

risposta

42

Dal Python docs:

import urllib.request 
req = urllib.request.Request(
    url, 
    data=None, 
    headers={ 
     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36' 
    } 
) 

f = urllib.request.urlopen(req) 
print(f.read().decode('utf-8')) 
+0

fantastico! questo è quasi funzionante - mi chiedo solo come si otterrebbe il codice sorgente da quello- normalmente userei url.read() ma non funziona in questo caso perché è un urllib.request.Request piuttosto che urlopen? – user3662991

+1

Risposta aggiornata in modo da poter vedere come usarlo. –

+0

grazie martin, ha funzionato come un fascino. Grazie per la vostra pazienza e disponibilità ad aiutare! – user3662991

15
from urllib.request import urlopen, Request 

urlopen(Request(url, headers={'User-Agent': 'Mozilla'})) 
+0

Questo è importante. Ho dovuto importare urllib.request non semplicemente urllib. Tutto il resto nella risposta accettata funziona con questa modifica. – wrkyle

+0

(Non è quello che ho già?) –

+0

Sì, lo fai, ma la risposta accettata non è così che volevo attirare l'attenzione sulla tua risposta perché affronta un difetto nell'accettazione. – wrkyle

-1

Il sito rifiuto ospite proviene dalla OWASP ModSecurity regole di base per Apache mod-security. La regola 900002 contiene un elenco di agenti utente "cattivi" e uno di questi è "python-urllib2". Ecco perché le richieste con l'agente utente predefinito falliscono.

Purtroppo, se si utilizza la funzione di Python "robotparser",

https://docs.python.org/3.5/library/urllib.robotparser.html?highlight=robotparser#module-urllib.robotparser

utilizza l'agente utente di default Python, e non c'è nessun parametro di cambiare la situazione. Se il tentativo di "robotparser" di leggere "robots.txt" viene rifiutato (non solo URL non trovato), quindi considera tutti gli URL da quel sito come non consentiti.

1

ho solo risposto a una domanda simile qui: https://stackoverflow.com/a/43501438/206820

Nel caso in cui semplicemente non solo vuole aprire l'URL, ma anche desidera scaricare la risorsa (ad esempio, un file PDF), è possibile utilizzare il codice come qui di seguito:

# proxy = ProxyHandler({'http': 'http://192.168.1.31:8888'}) 
    proxy = ProxyHandler({}) 
    opener = build_opener(proxy) 
    opener.addheaders = [('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30')] 
    install_opener(opener) 

    result = urlretrieve(url=file_url, filename=file_name) 

la ragione per cui ho aggiunto delega è quello di monitorare il traffico di Charles, e qui è il traffico che ho ottenuto:

See the User-Agent

+0

Grazie per aver fornito una risposta che utilizza gli oggetti OpenerDirector restituiti da build_opener()! Questo mi ha aiutato molto – happyskeptic