Modifica dell'agente utente su urllib2.urlopen


99

Come posso scaricare una pagina web con uno user agent diverso da quello predefinito su urllib2.urlopen?

Risposte:


61

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-Agentintestazione, 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", mentre urllib2la stringa predefinita dell'agente utente è "Python-urllib/2.6"(su Python 2.6).


117

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-Agentdi 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. L'agente utente viene ignorato per qualche motivo.
Nathan

3
Credo che User-agentin effetti dovrebbe essere User-Agent(la A è maiuscola) Sembra funzionare per me quando lo faccio.
KriiV

1
I nomi delle intestazioni non fanno distinzione tra maiuscole e minuscole.
Nicolás

100
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()

4
Con i parametri denominati puoi farlo in due righe. Rimuovere la prima riga e sostituire il secondo con questo: req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Preferisco questo modulo per fare una sola richiesta.
Iain Samuel McLean Anziano

O anche più breve, in una riga:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
utente

13

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)

Questo ha aiutato meravigliosamente. Non capisco perché ho bisogno di request.Request e poi ripetere urllib.request.urlopen dove la vecchia versione farebbe solo urllib.urlopen (req) ma in ogni caso, funziona e ora so come usarlo in python 3 .
jamescampbell

Ricevo ancora l'errore 404 :(
Maksim Kniazev

Ho rimosso il 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
utente

9

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')

2
opener.addheadersprobabilmente 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.
jfs

Per me la chiamata build_opener ritorna con uno User-Agent predefinito già definito nelle intestazioni. Quindi l'aggiunta creerà solo un'altra intestazione User-Agent, che come seconda verrà ignorata. Ecco perché il sol di @ jcoon funziona.
Vajk Hermecz

6

Perché urllibpuoi 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')

5

Un'altra soluzione in urllib2e Python 2.7:

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)

2
Ricevo un errore 404 per una pagina che esiste se l'URL è stato inserito tramite il mio browser
Yebach,

2

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

1
La domanda discute esplicitamente urllib2e non altri moduli.
Ron Klein

2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.