python - ejemplos - urllib2 HTTP Error 400: Solicitud incorrecta
urllib2.urlopen timeout (4)
La razón por la que "el perro" devuelve un error 400 es porque no estás escapando de la cadena a una URL.
Si haces esto:
import urllib, urllib2
quoted_query = urllib.quote(query)
host = ''http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s'' % (quoted_query, page)
req = urllib2.Request(host)
req.add_header(''User-Agent'', User_Agent)
response = urllib2.urlopen(req)
Funcionará.
Sin embargo, le sugiero que utilice las requests lugar de utilizar urllib / urllib2 / httplib. Es mucho más fácil y manejará todo esto por ti.
Este es el mismo código con las solicitudes de python:
import requests
results = requests.get("http://www.bing.com/search",
params={''q'': query, ''first'': page},
headers={''User-Agent'': user_agent})
Tengo un pedazo de código como este
host = ''http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s'' % (query, page)
req = urllib2.Request(host)
req.add_header(''User-Agent'', User_Agent)
response = urllib2.urlopen(req)
y cuando ingreso una consulta mayor a una palabra como "el perro", aparece el siguiente error.
response = urllib2.urlopen(req)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 513, in http_response
''http'', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 521, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
¿Alguien puede señalar lo que estoy haciendo mal? Gracias por adelantado.
También me encontré con el mismo problema. Resulta que el problema fue que el método se estableció de manera inadecuada. Cuando incluyes datos urlencoded en urllib2.urlopen (), el método debe establecerse en POST y cuando lo excluyas, el método debería ser GET. Entonces, ¿cómo se establece el método se da a continuación:
Para solicitud POST
request_object = urllib2.Request(url)
method = ("POST", "GET")
request_object.get_method = lambda: method[0] #If method is set to POST
url_handle = opener.open(req, data) #If method is set to POST
Para solicitud GET
request_object = urllib2.Request(url)
method = ("POST", "GET")
request_object.get_method = lambda: method[1] #If method is set to GET
url_handle = opener.open(req) #If method is set to GET
Esto establecerá su método de solicitud de url al método requerido apropiado
tienes que usar urllib.quote
urllib.quote()
usar urllib.quote()
en su variable de ''consulta'':
query = urllib.quote(query)
host = ''http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s'' % (query, page)
Esto hace que la URL necesaria se escape para convertir el espacio en big dog
a big%20dog
.