2009-04-29 37 views

risposta

54

Setting the User-Agent dal preferito di tutti Dive Into Python.

Il racconto: è possibile utilizzare Request.add_header per farlo.

È inoltre possibile passare le intestazioni come un dizionario durante la creazione della richiesta stessa, as the docs note:

intestazioni dovrebbe essere un dizionario, e verranno trattati come se add_header() è stato chiamato con ogni chiave e valore come argomenti. Questo è spesso usato per "falsificare" l'intestazione User-Agent, che viene utilizzata da un browser per identificarsi; alcuni server HTTP consentono solo le richieste provenienti da browser comuni anziché da script. Ad esempio, Mozilla Firefox potrebbe identificarsi come "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", mentre la stringa di agente utente predefinita di urllib2 è "Python-urllib/2.6" (su Python 2.6).

106

I answered a similar question un paio di settimane fa.

C'è esempio di codice in questa domanda, ma in fondo si può fare qualcosa di simile: (. Si noti la capitalizzazione di User-Agent come di RFC 2616, sezione 14,43)

opener = urllib2.build_opener() 
opener.addheaders = [('User-Agent', 'Mozilla/5.0')] 
response = opener.open('http://www.stackoverflow.com') 
+8

Questo metodo funziona per altre intestazioni, ma non per User-Agent - almeno non nella mia installazione 2.6.2. User-Agent viene ignorato per qualche motivo. – Nathan

+1

Credo che "User-agent" dovrebbe in effetti essere "User-Agent" (L'A è in maiuscolo) Sembra funzionare per me quando viene fatto. – KriiV

+0

I nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole. –

92
headers = { 'User-Agent' : 'Mozilla/5.0' } 
req = urllib2.Request('www.example.com', None, headers) 
html = urllib2.urlopen(req).read() 

Oppure, un po 'più corto :

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' }) 
html = urllib2.urlopen(req).read() 
+4

Con i parametri denominati è possibile farlo in due righe. Rimuovi la prima riga e sostituisci la seconda con: 'req = urllib2.Request ('www.example.com', intestazioni = {'User-Agent': 'Mozilla/5.0'})'. Preferisco questo modulo per fare solo una richiesta. –

9

Tutto questo dovrebbe funzionare in teoria, ma (con Python 2.7.2 su Windows, almeno) ogni volta che si invia un header personalizzato User-agent, urllib2 non invia che hea der. Se non si tenta di inviare un'intestazione User-agent, invia il default Python/urllib2

Nessuno di questi metodi sembrano funzionare per l'aggiunta di User-agent, ma lavorano 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') 
+0

@ la soluzione di jcoon ha funzionato per me su Python 2.7.2 (Linux) – bparker

+2

'opener.addheaders' dovrebbe probabilmente 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 sbagliato. – jfs

+0

Per me la chiamata build_opener viene restituita con un User-Agent predefinito già definito nelle intestazioni. Quindi l'aggiunta creerà solo un'altra intestazione User-Agent, che come 2nd verrà ignorata. Ecco perché @ jcoon's sol sta funzionando. –

11

Per pitone 3, urllib è suddiviso in 3 moduli ...

import urllib.request 
req = urllib.request.Request(url="http://localhost/",data=b'None',headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'}) 
handler = urllib.request.urlopen(req) 
+0

Questo ha aiutato meravigliosamente. Non capisco perché ho bisogno di request.Request e quindi ripeto urllib.request.urlopen dove la vecchia versione dovrebbe fare solo urllib.urlopen (req) bene ma in ogni caso, questo funziona e so come usarlo in python 3 ora . – jamescampbell

5

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) 
+1

Ricevo un errore 404 per una pagina che esiste se l'url inserito tramite il mio browser – Yebach

6

Per urllib si può 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') 
+1

mi ha aiutato molto, grazie! – Meysam

3

Prova questa:

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 
+0

La domanda tratta esplicitamente di 'urllib2' e non di altri moduli. –

1

ci sono due proprietà di urllib.URLopener() e cioè:
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 utente-agente 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>) 

cambiare solo una proprietà non funziona perché il sito contrassegna come una richiesta di sospetto.