2010-07-12 7 views
6

जिस साइट पर मैं स्पाइडर की कोशिश कर रहा हूं वह जावास्क्रिप्ट का उपयोग कर रहा है:AJAX अनुरोध पोस्ट करने के लिए मैं पाइथन की मैकेनाइजेशन कैसे प्राप्त करूं?

request.open("POST", url, true); 

AJAX पर अतिरिक्त जानकारी खींचने के लिए मुझे स्पाइडर की आवश्यकता है। मैंने पृष्ठ प्राप्त करने के लिए मैकेनाइजेशन प्राप्त करने के लिए

r = mechanize.urlopen("https://site.tld/dir/" + url, urllib.urlencode({'none' : 'none'})) 

के विभिन्न क्रमपरिवर्तनों का प्रयास किया है, लेकिन यह हमेशा मुझे लॉगिन HTML प्राप्त करने का परिणाम देता है, यह दर्शाता है कि कुछ गलत है। फ़ायरफ़ॉक्स फ़ायरबग के अनुसार POST में कोई भी HTTP डेटा नहीं जोड़ता प्रतीत होता है, और मैं यूआरएलओपेन को "GET" के बजाय "POST" का उपयोग करने के लिए "फ़ील्ड" का उपयोग करने के लिए एक खाली फ़ील्ड जोड़ रहा हूं ताकि साइट फ़ील्ड को अनदेखा कर सके। मैंने सोचा कि मैकेनाइज के यूआरलोपेन में कुकीज़ शामिल हैं। लेकिन एचटीटीपीएस होने के कारण लेनदेन को डीबग करने के लिए तार करना मुश्किल है।

क्या कोई बेहतर तरीका है?

मैकेनाइजेशन के लिए सभ्य एपीआई दस्तावेज प्रतीत नहीं होता है, उदाहरण के लिए। यह कष्टप्रद है।

उत्तर

8

यह है कि मैं क्या के साथ आया था:

req = mechanize.Request("https://www.site.com/path/" + url, " ") 
req.add_header("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7") 
req.add_header("Referer", "https://www.site.com/path") 
cj.add_cookie_header(req) 
res = mechanize.urlopen(req) 

क्या दिलचस्प है "पोस्ट" मोड "mechanize.Request बलों इसे करने के लिए कॉल में में"। स्पष्ट रूप से साइट एक ही स्थान पर चकित नहीं हुई :)

इसे कुकीज़ की भी आवश्यकता थी।

hh = mechanize.HTTPHandler() 
hsh = mechanize.HTTPSHandler() 
hh.set_http_debuglevel(1) 
hsh.set_http_debuglevel(1) 
opener = mechanize.build_opener(hh, hsh) 
logger = logging.getLogger() 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.NOTSET) 
mechanize.install_opener(opener) 

क्या Firebug दिखाया जा रहा था के खिलाफ: मैं का उपयोग कर हेडर डिबग।

+0

अंतरिक्ष को पोस्ट मोड में कैसे रखा जाता है? क्या यह सिर्फ डेटा नहीं है, या पोस्ट को मशीनीकरण के लिए एक स्थान के रूप में परिभाषित किया गया है? – brainysmurf

+2

@brainysmurf अंतरिक्ष के बिना इसका एक अनुरोध है, लेकिन डेटा की आपूर्ति करके यह एक POST अनुरोध में बदल जाता है, और एक स्थान सबसे छोटा सबसे सरल "डेटा" प्रदान कर सकता है जो मैं प्रदान कर सकता हूं। अंतरिक्ष प्रति से संबंधित कुछ खास नहीं है। – fret

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