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?
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 serUser-Agent
(O A é maiúsculo) Parece funcionar para mim quando faço isso.Ou um pouco mais curto:
fonte
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 ...
fonte
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, @MaksimTudo 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:
fonte
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:fonte
Outra solução em
urllib2
e Python 2.7:fonte
Experimente isto:
fonte
urllib2
e não outros módulos.existem duas propriedades, a
urllib.URLopener()
saber:addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
eversion = '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
alterar apenas uma propriedade não funciona porque o site a marca como uma solicitação suspeita.
fonte