¿Cómo puedo descargar una página web con un agente de usuario que no sea el predeterminado en urllib2.urlopen?
¿Cómo puedo descargar una página web con un agente de usuario que no sea el predeterminado en urllib2.urlopen?
Respuestas:
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" elUser-Agent
encabezado, 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 queurllib2
la cadena de agente de usuario predeterminada es"Python-urllib/2.6"
(en Python 2.6).
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-Agent
partir 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')
User-agent
que de hecho debería ser User-Agent
(La A está en mayúscula) Parece funcionar para mí cuando lo hago .
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()
req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})
. Prefiero este formulario para hacer una sola solicitud.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
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)
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
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')
opener.addheaders
probablemente 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.
Porque urllib
puedes 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')
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
urllib2
y no otros módulos.
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.