De nuevo urllib.error.HTTPError: HTTP Error 400: Solicitud incorrecta

Hy! Intenté abrir una página web, que normalmente se abre en el navegador, pero Python simplemente jura y no quiere trabajar.

import urllib.request, urllib.error f = urllib.request.urlopen('http://www.booking.com/reviewlist.html?cc1=tr;pagename=sapphire') 

Y otra forma

 import urllib.request, urllib.error opener=urllib.request.build_opener() f=opener.open('http://www.booking.com/reviewlist.html?cc1=tr;pagename=sapphi re') 

Ambas opciones dan un tipo de error:

 Traceback (most recent call last): File "", line 1, in  File "C:\Python34\lib\urllib\request.py", line 461, in open response = meth(req, response) File "C:\Python34\lib\urllib\request.py", line 571, in http_response 'http', request, response, code, msg, hdrs) File "C:\Python34\lib\urllib\request.py", line 493, in error result = self._call_chain(*args) File "C:\Python34\lib\urllib\request.py", line 433, in _call_chain result = func(*args) File "C:\Python34\lib\urllib\request.py", line 676, in http_error_302 return self.parent.open(new, timeout=req.timeout) File "C:\Python34\lib\urllib\request.py", line 461, in open response = meth(req, response) File "C:\Python34\lib\urllib\request.py", line 571, in http_response 'http', request, response, code, msg, hdrs) File "C:\Python34\lib\urllib\request.py", line 499, in error return self._call_chain(*args) File "C:\Python34\lib\urllib\request.py", line 433, in _call_chain result = func(*args) File "C:\Python34\lib\urllib\request.py", line 579, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 400: Bad Request 

¿Algunas ideas?

Esta URL parece estar haciendo la comprobación de cadenas del agente de usuario. Si ajusto la cadena de mi agente de usuario en Firefox a Python-urllib/2.7 , falla con la Bad Request que está viendo.

A medida que usa urllib , puede ajustar el agente de usuario siguiendo este tutorial.

 from urllib.request import FancyURLopener class MyOpener(FancyURLopener): version = 'My new User-Agent' # Set this to a string you want for your user agent myopener = MyOpener() page = myopener.open('http://www.booking.com/reviewlist.html?cc1=tr;pagename=sapphire') 

Probablemente están bloqueando el hecho de que no proviene de un navegador. Probablemente necesite un encabezado de User-Agent válido o algo así.

Usando peticiones, esto funciona:

 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36' } r = requests.get('http://www.booking.com/reviewlist.html?cc1=tr;pagename=sapphire', headers=headers) print r print r.headers