发出HTTP POST请求
我正在尝试发出POST请求以检索有关一本书的信息。这是返回HTTP代码的代码:302,已移动
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()
当我从浏览器尝试时,可以从以下页面进行操作:http
:
//www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828,它可以工作。我的代码中缺少什么?
编辑:这就是我打电话给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
似乎位置首先指向了我要访问的相同网址?
编辑2:
我已经尝试按照这里的建议使用urllib2。这是代码:
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
这是输出:
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=/
-
他们的服务器似乎要您获取正确的cookie。这有效:
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)<br />