2010-09-07 34 views
22

Estoy tratando de hacer una solicitud POST para recuperar información sobre un libro. Aquí está el código que devuelve el código HTTP: 302, MovidoHaciendo solicitud HTTP POST

import httplib, urllib 
params = urllib.urlencode({ 
    'isbn' : '9780131185838', 
    'catalogId' : '10001', 
    'schoolStoreId' : '15828', 
    'search' : 'Search' 
    }) 
headers = {"Content-type": "application/x-www-form-urlencoded", 
      "Accept": "text/plain"} 
conn = httplib.HTTPConnection("bkstr.com:80") 
conn.request("POST", "/webapp/wcs/stores/servlet/BuybackSearch", 
      params, headers) 
response = conn.getresponse() 
print response.status, response.reason 
data = response.read() 
conn.close() 

Cuando intento desde un navegador, de esta página: http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828, funciona. ¿Qué me estoy perdiendo en mi código?

EDIT: Esto es lo que me pasa cuando llamo response.msg de impresión

302 Moved Date: Tue, 07 Sep 2010 16:54:29 GMT 
Vary: Host,Accept-Encoding,User-Agent 
Location: http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackSearch 
X-UA-Compatible: IE=EmulateIE7 
Content-Length: 0 
Content-Type: text/plain; charset=utf-8 

parece que los puntos de ubicación a la misma URL estoy tratando de acceso en el primer lugar?

Edit2:

He intentado usar urllib2 como se sugiere aquí. Aquí está el código:

import urllib, urllib2 

url = 'http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackSearch' 
values = {'isbn' : '9780131185838', 
      'catalogId' : '10001', 
      'schoolStoreId' : '15828', 
      'search' : 'Search' } 


data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
print response.geturl() 
print response.info() 
the_page = response.read() 
print the_page 

Y aquí está la salida:

http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackSearch 
Date: Tue, 07 Sep 2010 16:58:35 GMT 
Pragma: No-cache 
Cache-Control: no-cache 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Set-Cookie: JSESSIONID=0001REjqgX2axkzlR6SvIJlgJkt:1311s25dm; Path=/ 
Vary: Accept-Encoding,User-Agent 
X-UA-Compatible: IE=EmulateIE7 
Content-Length: 0 
Connection: close 
Content-Type: text/html; charset=utf-8 
Content-Language: en-US 
Set-Cookie: TSde3575=225ec58bcb0fdddfad7332c2816f1f152224db2f71e1b0474c866f3b; Path=/ 
+0

La respuesta 302 también indicó dónde se movió a: encuentre esa URL y úsela. – adamk

Respuesta

26

Su servidor parece querer que adquiera la cookie adecuada. Esto funciona:

import urllib, urllib2, cookielib 

cookie_jar = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar)) 
urllib2.install_opener(opener) 

# acquire cookie 
url_1 = 'http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828' 
req = urllib2.Request(url_1) 
rsp = urllib2.urlopen(req) 

# do POST 
url_2 = 'http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackSearch' 
values = dict(isbn='9780131185838', schoolStoreId='15828', catalogId='10001') 
data = urllib.urlencode(values) 
req = urllib2.Request(url_2, data) 
rsp = urllib2.urlopen(req) 
content = rsp.read() 

# print result 
import re 
pat = re.compile('Title:.*') 
print pat.search(content).group() 

# OUTPUT: Title:&nbsp;&nbsp;Statics & Strength of Materials for Arch (w/CD)<br /> 
+0

¡Funciona de verdad! ¡Muchas gracias! – infrared

+6

@infrared: Me alegra ayudar. Probablemente debería haber agregado que uno de los métodos para resolver este tipo de cosas es ejecutar un proxy HTTP que muestre el rastro de solicitudes/respuestas. Luego, use el navegador y su código, y compare los dos rastros. Por lo general, estás buscando diferencias entre las cookies o los encabezados. A veces se necesita un poco de prueba y error. Me gusta usar Fiddler, pero cualquier herramienta así servirá. – ars

1
  1. Tal vez eso es lo que consigue el navegador, y usted sólo tiene que seguir la redirección 302.

  2. Si todo lo demás falla, puede controlar el diálogo entre Firefox y el servidor web utilizando FireBug o tcpdump o wireshark, y ver qué encabezados HTTP son diferentes. Posiblemente solo sea el encabezado User Agent:.