2010-09-07 28 views
22

Kitap hakkında bilgi almak için bir POST isteği yapmaya çalışıyorum. 302, ben bu sayfadan bir tarayıcıdan çalıştığınızdaHTTP POST isteğini oluşturma

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() 

Taşındı: İşte HTTP kodu döndürür koddur http://www.bkstr.com/webapp/wcs/stores/servlet/BuybackMaterialsView?langId=-1&catalogId=10001&storeId=10051&schoolStoreId=15828 işe yarıyor. Kodumda neyi özlüyorum?

DÜZENLEME: İşte baskı response.msg diyoruz

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 

aynı url konum noktaları ilk etapta erişmeye çalışıyorum o görünüyor zaman ne olsun ?

EDIT2:

Burada önerildiği gibi urllib2 kullanarak denedim. İşte kod: Burada

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 

Ve çıktısı:

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 yanıtı da nereye taşındığını gösterir - bu URL'yi bulmak ve kullanmak. – adamk

cevap

26

Sunucuları uygun çerezleri almanızı istiyor gibi görünüyor. Bu çalışır:

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

Gerçekten çalışıyor! Çok teşekkür ederim! – infrared

+6

@ İnfrared: Yardım ettiğim için sevindim. Muhtemelen bu tür şeyleri çözmek için bir yöntemin, isteklerin/yanıtların izini gösteren bir HTTP proxy çalıştırması olduğunu eklemeliydim. Ardından, tarayıcıyı ve kodunuzu kullanın ve iki izi karşılaştırın. Genellikle, çerezler veya üstbilgiler arasındaki farkları ararsınız. Bazen biraz deneme ve hata alır. Fiddler'ı kullanmayı seviyorum ama böyle bir araç yapacak. – ars

1
  1. Belki de bu tarayıcı alır ne ve sadece 302 yönlendirmeyi izlemek gerekecek.

  2. Diğer her şey başarısız olursa, Firefox ve Web Sunucusu arasındaki iletişimi FireBug veya tcpdump veya wireshark kullanarak izleyebilir ve hangi HTTP üstbilgilerinin farklı olduğunu görebilirsiniz. Muhtemelen sadece User Agent: başlığıdır.

İlgili konular