Hacer solicitud HTTP POST

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, Movido

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 bash desde un navegador, desde esta página: http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828 , funciona. ¿Qué me falta en mi código?

EDITAR: Esto es lo que obtengo cuando llamo print response.msg

 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 la ubicación apunta a la misma url a la que estoy intentando acceder en 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=/ 

Su servidor parece querer que usted 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:  Statics & Strength of Materials for Arch (w/CD)

Es posible que desee utilizar el módulo urllib2 que debería manejar mejor las redirecciones . Aquí hay un ejemplo de POSTING con urllib2.

  1. Tal vez sea eso lo que obtiene el navegador, y solo tendrás que seguir la redirección 302 .

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