Modifica dell'agente utente su urllib2.urlopen
-
03-07-2019 - |
Domanda
Come posso scaricare una pagina web con un agente utente diverso da quello predefinito su urllib2.urlopen?
Soluzione
Impostazione dell'agente utente dai preferiti di tutti Dive Into Python .
La breve storia: puoi usare Request.add_header per fare questo.
Puoi anche passare le intestazioni come dizionario durante la creazione della Richiesta stessa, as la nota sui documenti :
header dovrebbe essere un dizionario e verrà trattato come se
add_header ()
fosse chiamato con ogni chiave e valore come argomento. Questo è spesso usato per "falsificare" l'intestazioneUser-Agent
, che viene utilizzata da un browser per identificarsi - alcuni server HTTP consentono solo richieste provenienti da browser comuni invece di 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 dell'agente utente predefinito è" Python-urllib / 2.6 "
(su Python 2.6).
Altri suggerimenti
I ho risposto a domanda simile un paio di settimane fa.
C'è un esempio di codice in questa domanda, ma fondamentalmente puoi fare qualcosa del genere: (Nota la maiuscola di User-Agent
da RFC 2616 , sezione 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
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()
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)
Tutti questi dovrebbero funzionare in teoria, ma (almeno con Python 2.7.2 su Windows) ogni volta che invii un'intestazione User-agent personalizzata, urllib2 non invia quell'intestazione. Se non si tenta di inviare un'intestazione User-agent, invia Python / urllib2 predefinito
Nessuno di questi metodi sembra funzionare per aggiungere 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')
Per 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')
Un'altra soluzione in urllib2
e Python 2.7:
req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)
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
ci sono due proprietà di urllib.URLopener ()
e precisamente:
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 un User-Agent accettato. per es.
Browser Chrome: 'Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, come 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.