Come posso scaricare una pagina web con uno user agent diverso da quello predefinito su urllib2.urlopen?
Come posso scaricare una pagina web con uno user agent diverso da quello predefinito su urllib2.urlopen?
Risposte:
Impostazione dello User-Agent dal Dive Into Python preferito da tutti .
Il racconto: puoi usare Request.add_header per farlo.
Puoi anche passare le intestazioni come dizionario quando crei la richiesta stessa, come notano i documenti :
le intestazioni dovrebbero essere un dizionario e verranno trattate come se
add_header()
fossero chiamate con ogni chiave e valore come argomenti. Questo viene spesso utilizzato per "falsificare" l'User-Agent
intestazione, che viene utilizzata da un browser per identificarsi: alcuni server HTTP consentono solo le richieste provenienti dai browser comuni anziché gli script. Ad esempio, Mozilla Firefox potrebbe identificarsi come"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
, mentreurllib2
la stringa predefinita dell'agente utente è"Python-urllib/2.6"
(su Python 2.6).
Ho risposto a una domanda simile un paio di settimane fa.
C'è un codice di esempio in quella domanda, ma fondamentalmente puoi fare qualcosa del genere: (Nota le lettere maiuscole User-Agent
di RFC 2616 , sezione 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
in effetti dovrebbe essere User-Agent
(la A è maiuscola) Sembra funzionare per me quando lo faccio.
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()
Oppure, un po 'più breve:
req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})
. Preferisco questo modulo per fare una sola richiesta.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
Per python 3, urllib è diviso in 3 moduli ...
import urllib.request
req = urllib.request.Request(url="http://localhost/", headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'})
handler = urllib.request.urlopen(req)
data=b'None'
parametro confuso dalla risposta. Ha trasformato la richiesta di esempio in POST con dati non validi. Probabilmente il motivo del fallimento nel tuo caso, @Maksim
Tutti questi dovrebbero funzionare in teoria, ma (con Python 2.7.2 almeno su Windows) ogni volta che invii un'intestazione User-agent personalizzata, urllib2 non invia quell'intestazione. Se non provi a inviare un'intestazione User-agent, invia il file Python / urllib2 predefinito
Nessuno di questi metodi sembra funzionare per l'aggiunta di User-agent ma funzionano per altre intestazioni:
opener = urllib2.build_opener(proxy)
opener.addheaders = {'User-agent':'Custom user agent'}
urllib2.install_opener(opener)
request = urllib2.Request(url, headers={'User-agent':'Custom user agent'})
request.headers['User-agent'] = 'Custom user agent'
request.add_header('User-agent', 'Custom user agent')
opener.addheaders
probabilmente dovrebbe essere [('User-agent', 'Custom user agent')]
. Altrimenti tutti questi metodi dovrebbero funzionare (ho provato su Python 2.7.3 (Linux)). Nel tuo caso potrebbe rompersi perché usi l'argomento proxy in modo sbagliato.
Perché urllib
puoi usare:
from urllib import FancyURLopener
class MyOpener(FancyURLopener, object):
version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
myopener = MyOpener()
myopener.retrieve('https://www.google.com/search?q=test', 'useragent.html')
Prova questo :
html_source_code = requests.get("http://www.example.com/",
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'Upgrade-Insecure-Requests': '1',
'x-runtime': '148ms'},
allow_redirects=True).content
urllib2
e non altri moduli.
ci sono due proprietà di urllib.URLopener()
vale a dire:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
e
version = 'Python-urllib/1.17'
.
Per ingannare il sito Web è necessario modificare entrambi questi valori in uno User-Agent accettato. per es.
browser Chrome: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google bot: 'Googlebot/2.1'
come questo
import urllib
page_extractor=urllib.URLopener()
page_extractor.addheaders = [('User-Agent', 'Googlebot/2.1'), ('Accept', '*/*')]
page_extractor.version = 'Googlebot/2.1'
page_extractor.retrieve(<url>, <file_path>)
la modifica di una sola proprietà non funziona perché il sito Web la contrassegna come richiesta sospetta.