Cambio de agente de usuario en urllib2.urlopen

99

¿Cómo puedo descargar una página web con un agente de usuario que no sea el predeterminado en urllib2.urlopen?


fuente

Respuestas:

61

Configuración del User-Agent desde el Dive Into Python favorito de todos .

La historia corta: puede usar Request.add_header para hacer esto.

También puede pasar los encabezados como un diccionario al crear la Solicitud en sí, como se indica en los documentos :

los encabezados deben ser un diccionario y se tratarán como si add_header()se llamaran con cada clave y valor como argumentos. Esto se usa a menudo para "falsificar" el User-Agentencabezado, que es utilizado por un navegador para identificarse a sí mismo; algunos servidores HTTP solo permiten solicitudes provenientes de navegadores comunes en lugar de scripts. Por ejemplo, Mozilla Firefox puede identificarse como "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", mientras que urllib2la cadena de agente de usuario predeterminada es "Python-urllib/2.6"(en Python 2.6).

Paolo Bergantino
fuente
117

Yo respondí una pregunta similar hace un par de semanas.

Hay un código de ejemplo en esa pregunta, pero básicamente puede hacer algo como esto: (Tenga en cuenta las mayúsculas de a User-Agentpartir de RFC 2616 , sección 14.43).

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
Jason Coon
fuente
8
Ese método funciona para otros encabezados, pero no para User-Agent, al menos no en mi instalación 2.6.2. El User-Agent se ignora por alguna razón.
Nathan
3
Creo User-agentque de hecho debería ser User-Agent(La A está en mayúscula) Parece funcionar para mí cuando lo hago .
KriiV
1
Los nombres de los encabezados no distinguen entre mayúsculas y minúsculas.
Nicolás
100
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()

O, un poco más corto:

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
Paolo
fuente
4
Con los parámetros con nombre, puede hacer esto en dos líneas. Retire la primera línea y vuelva a colocar la segunda con esto: req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Prefiero este formulario para hacer una sola solicitud.
Iain Samuel McLean Elder
O incluso más corto, en una línea:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
usuario
13

Para python 3, urllib se divide en 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)
Jay Dave
fuente
Esto ayudó maravillosamente. No entiendo por qué necesito request.Request y luego repita urllib.request.urlopen donde la versión anterior solo haría urllib.urlopen (req) bien, pero de cualquier manera, esto funciona y sé cómo usarlo en Python 3 ahora .
jamescampbell
Sigo recibiendo el error 404 :(
Maksim Kniazev
Eliminé el data=b'None'parámetro confuso de la respuesta. Transformó la solicitud de ejemplo a POST con datos no válidos. Probablemente la razón del error en su caso, @Maksim
usuario
9

Todo esto debería funcionar en teoría, pero (con Python 2.7.2 en Windows al menos) cada vez que envía un encabezado de agente de usuario personalizado, urllib2 no envía ese encabezado. Si no intenta enviar un encabezado de agente de usuario, envía el Python / urllib2 predeterminado

Ninguno de estos métodos parece funcionar para agregar User-agent, pero funcionan para otros encabezados:

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')
fijiaaron
fuente
2
opener.addheadersprobablemente debería ser [('User-agent', 'Custom user agent')]. De lo contrario, todos estos métodos deberían funcionar (he probado en Python 2.7.3 (Linux)). En su caso, podría romperse porque utiliza incorrectamente el argumento de proxy.
jfs
Para mí, la llamada build_opener regresa con un User-Agent predeterminado ya definido en los encabezados. Por lo tanto, agregar simplemente creará otro encabezado de agente de usuario, que como segundo se ignorará. Es por eso que el sol de @ jcoon está funcionando.
Vajk Hermecz
6

Porque urllibpuedes 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')
CONvid19
fuente
5

Otra solución en urllib2Python 2.7:

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)
OH2GBA
fuente
2
Recibo un error 404 para una página que existe si la URL ingresada a través de mi navegador
Yebach
2

Prueba esto :

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
Akash Karothiya
fuente
1
La pregunta discute explícitamente urllib2y no otros módulos.
Ron Klein
2

hay dos propiedades de a urllib.URLopener()saber:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]y
version = 'Python-urllib/1.17'.
Para engañar al sitio web, debe cambiar ambos valores a un User-Agent aceptado. por ejemplo,
navegador 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'
así

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

cambiar solo una propiedad no funciona porque el sitio web la marca como una solicitud sospechosa.

twitu
fuente