2010-09-07 86 views
22

Tôi đang cố gắng thực hiện yêu cầu POST để truy xuất thông tin về một cuốn sách. Dưới đây là đoạn code mà trả về mã HTTP: 302, MovedThực hiện yêu cầu 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() 

Khi tôi cố gắng từ một trình duyệt, từ trang này: http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828, nó hoạt động. Tôi đang thiếu gì trong mã của mình?

EDIT: Đây là những gì tôi nhận được khi tôi gọi in 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 

vẻ như là điểm vị trí để url cùng tôi đang cố gắng để truy cập ở nơi đầu tiên?

EDIT2:

Tôi đã thử sử dụng urllib2 như được đề xuất tại đây. Đây là mã:

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 

Và đây là kết quả:

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

Phản hồi 302 cũng cho biết địa điểm được chuyển đến - tìm URL đó và sử dụng URL đó. – adamk

Trả lời

26

Máy chủ của họ có vẻ muốn bạn có được cookie thích hợp. Công trình này:

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

Nó hoạt động thực sự! Cảm ơn nhiều! – infrared

+6

@infrared: Rất vui được trợ giúp. Tôi có lẽ nên có thêm rằng một phương pháp để giải quyết các loại điều là để chạy một proxy HTTP trong đó cho bạn thấy dấu vết của các yêu cầu/phản ứng. Sau đó, sử dụng trình duyệt và mã của bạn và so sánh hai dấu vết. Thông thường, bạn đang tìm kiếm sự khác biệt giữa cookie hoặc tiêu đề. Đôi khi phải mất một chút thử và sai. Tôi thích sử dụng Fiddler, nhưng bất kỳ công cụ như vậy sẽ làm. – ars

1
  1. Có lẽ đó là những gì các trình duyệt được, và bạn sẽ chỉ phải làm theo các 302 chuyển hướng.

  2. Nếu vẫn thất bại, bạn có thể theo dõi cuộc đối thoại giữa Firefox và Web Server bằng FireBug hoặc tcpdump hoặc wireshark và xem tiêu đề HTTP nào khác nhau. Có thể đó chỉ là tiêu đề User Agent:.

Các vấn đề liên quan