Como posso baixar uma página da web com um agente de usuário diferente do padrão em urllib2.urlopen?
Como posso baixar uma página da web com um agente de usuário diferente do padrão em urllib2.urlopen?
Respostas:
Configurando o User-Agent do Dive Into Python favorito de todos .
A história curta: você pode usar Request.add_header para fazer isso.
Você também pode passar os cabeçalhos como um dicionário ao criar a própria solicitação, conforme a nota do documento :
os cabeçalhos devem ser um dicionário e serão tratados como se
add_header()
fossem chamados com cada chave e valor como argumentos. Isso geralmente é usado para “falsificar” oUser-Agent
cabeçalho, que é usado por um navegador para se identificar - alguns servidores HTTP permitem apenas solicitações provenientes de navegadores comuns, em vez de scripts. Por exemplo, o Mozilla Firefox pode se identificar como"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
, enquantourllib2
a string do agente do usuário padrão é"Python-urllib/2.6"
(no Python 2.6).
Eu respondi a uma pergunta semelhante algumas semanas atrás.
Há um código de exemplo nessa questão, mas basicamente você pode fazer algo assim: (Observe a capitalização de a User-Agent
partir de RFC 2616 , seção 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
deveria de fato ser User-Agent
(O A é maiúsculo) Parece funcionar para mim quando faço isso.
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()
Ou um pouco mais curto:
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'})
. Prefiro este formulário para fazer apenas um pedido.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
Para python 3, urllib é dividido em 3 módulos ...
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'
parâmetro confuso da resposta. Ele transformou a solicitação de exemplo em POST com dados inválidos. Provavelmente o motivo da falha em seu caso, @Maksim
Tudo isso deve funcionar em teoria, mas (com o Python 2.7.2 no Windows, pelo menos) sempre que você enviar um cabeçalho de agente do usuário personalizado, o urllib2 não enviará esse cabeçalho. Se você não tentar enviar um cabeçalho do agente do usuário, ele enviará o padrão Python / urllib2
Nenhum desses métodos parece funcionar para adicionar o User-agent, mas funcionam para outros cabeçalhos:
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
provavelmente deveria ser [('User-agent', 'Custom user agent')]
. Caso contrário, todos esses métodos devem funcionar (eu testei no Python 2.7.3 (Linux)). No seu caso, ele pode falhar porque você usa o argumento de proxy errado.
Pois urllib
você pode usar:
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')
Experimente isto:
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 não outros módulos.
existem duas propriedades, a urllib.URLopener()
saber:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
e
version = 'Python-urllib/1.17'
.
Para enganar o site, você precisa alterar esses dois valores para um User-Agent aceito. por exemplo,
navegador Chrome: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
bot do Google: 'Googlebot/2.1'
assim
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>)
alterar apenas uma propriedade não funciona porque o site a marca como uma solicitação suspeita.