2010-09-07 42 views
22

मैं किसी पुस्तक के बारे में जानकारी पुनर्प्राप्त करने के लिए एक POST अनुरोध करने का प्रयास कर रहा हूं। 302, ले जाया गया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() 

जब मैं एक ब्राउज़र से प्रयास करते हैं, इस पेज से: यहाँ कोड है कि HTTP कोड देता है http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828, यह काम करता है। मेरे कोड में मुझे क्या याद आ रही है?

संपादित करें: यहाँ मैं क्या मिलता है जब मैं प्रिंट 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 

लगता है कि एक ही यूआरएल को स्थान अंक मैं पहली जगह में उपयोग करने के लिए कोशिश कर रहा हूँ है?

EDIT2:

मैं के रूप में यहाँ का सुझाव दिया 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=/ 
+0

302 प्रतिक्रिया ने यह भी संकेत दिया कि इसे स्थानांतरित किया गया था - उस यूआरएल को ढूंढें और इसका इस्तेमाल करें। – adamk

उत्तर

26

उनका सर्वर आपको उचित कुकी प्राप्त करना चाहता है। यह काम करता है:

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

यह वास्तव में काम करता है! आपका बहुत बहुत धन्यवाद! – infrared

+6

@infrared: मदद करने में खुशी हुई। मुझे शायद यह कहना चाहिए था कि इन प्रकार की चीजों को हल करने के लिए एक विधि HTTP प्रॉक्सी चलाने के लिए है जो आपको अनुरोध/प्रतिक्रियाओं का पता दिखाती है। फिर, ब्राउज़र और अपने कोड का उपयोग करें, और दो निशान की तुलना करें। आमतौर पर, आप कुकीज़ या हेडर के बीच अंतर की तलाश में हैं। कभी-कभी इसमें कुछ परीक्षण और त्रुटि होती है। मुझे फिडलर का उपयोग करना पसंद है, लेकिन ऐसा कोई भी उपकरण करेगा। – ars

1
  1. शायद कि क्या ब्राउज़र हो जाता है, और तुम सिर्फ 302 रीडायरेक्ट का पालन करना होगा।

  2. यदि अन्य सभी विफल हो जाते हैं, तो आप फ़ायरबग या टीसीपीडम्प या वायरशर्क का उपयोग करके फ़ायरफ़ॉक्स और वेब सर्वर के बीच संवाद की निगरानी कर सकते हैं, और देखें कि कौन से HTTP शीर्षलेख अलग हैं। संभवतः यह User Agent: शीर्षलेख है।

4

आप urllib2 मॉड्यूल जो handle redirects better चाहिए उपयोग करने के लिए चाहते हो सकता है। Urllib2 के साथ POSTING का उदाहरण यहां दिया गया है।

संबंधित मुद्दे