Domanda

Come posso scaricare una pagina web con un agente utente diverso da quello predefinito su urllib2.urlopen?

È stato utile?

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'intestazione User-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 " , mentre urllib2 ' 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top