2011-07-11 9 views
6

मैं एक स्केपर ऐप पर काम कर रहा हूं, जहां मैं एक ऐसे साइट पर लॉगिन करने की कोशिश कर रहा हूं जो कैप्चा का उपयोग करता है (यह स्पैम नहीं है)। मैं कैप्चा डाउनलोड करने के लिए ImagesPipeline का उपयोग कर रहा हूं, और मैं उपयोगकर्ता को हल करने के लिए स्क्रीन पर प्रिंट कर रहा हूं। अब तक सब ठीक है।स्केच में कैप्चास

मेरा सवाल यह है कि मैं कैप्चा/फॉर्म जानकारी जमा करने के लिए मकड़ी को कैसे पुनरारंभ कर सकता हूं? अभी मेरा मकड़ी कैप्चा पेज का अनुरोध करता है, फिर कैप्चा के image_url युक्त Item देता है। इसके बाद ImagesPipeline द्वारा संसाधित/डाउनलोड किया जाता है, और उपयोगकर्ता को प्रदर्शित किया जाता है। मैं अस्पष्ट हूं कि मैं मकड़ी की प्रगति को कैसे फिर से शुरू कर सकता हूं, और captcha और मकड़ी के लिए एक ही सत्र को पारित कर सकता हूं, क्योंकि मुझे लगता है कि मकड़ी छवियों को काम करने से पहले आइटम (जैसे छोड़ना) वापस करना है।

मैंने दस्तावेज़ों और उदाहरणों को देखा है लेकिन मुझे ऐसा कोई नहीं मिला है जो इसे स्पष्ट करने के लिए स्पष्ट करता है।

उत्तर

5

इस प्रकार आप इसे मकड़ी के अंदर काम करने के लिए प्राप्त कर सकते हैं।

self.crawler.engine.pause() 
process_my_captcha() 
self.crawler.engine.unpause() 

एक बार जब आप अनुरोध मिलता है, इंजन रोकते हैं, छवि प्रदर्शित, उपयोगकर्ता से जानकारी पढ़ें & प्रवेश के लिए एक पोस्ट अनुरोध प्रस्तुत करके क्रॉल को फिर से शुरू।

मुझे यह जानने में दिलचस्पी होगी कि दृष्टिकोण आपके मामले के लिए काम करता है या नहीं।

+0

क्रॉलर कोड के अंदर से आप छवियों को कैसे कहते हैं? –

+0

आप उस पृष्ठ से छवि को आसानी से पकड़ सकते हैं जिसे आपने अपने मकड़ी में पार्स किया है। मैंने कोशिश नहीं की है कि छवियों के पाइपलाइन – Medorator

+0

फ्रिसो से विचार। आप इसे मैन्युअल कार्रवाई करने के लिए चाहते हैं -> डीईएफ़ पार्स (स्वयं, प्रतिक्रिया): self.crawler.engine.pause() captcha_var = raw_input ("कैप्चा:") self.crawler.engine.unpause() scrapy.FormRequest.from_response वापसी ( प्रतिक्रिया, formdata = { 'codeTextBox': captcha_var}, कॉलबैक = self.after_login ) डीईएफ़ after_login (स्वयं, प्रतिक्रिया): प्रिंट (response.body) वापसी – OWADVL

3

मैं कोई आइटम नहीं बनाऊंगा और ImagePipeline का उपयोग नहीं करूंगा।

import urllib 
import os 
import subprocess 

... 

def start_requests(self): 
    request = Request("http://webpagewithcaptchalogin.com/", callback=self.fill_login_form) 
    return [request]  

def fill_login_form(self,response): 
    x = HtmlXPathSelector(response) 
    img_src = x.select("//img/@src").extract() 

    #delete the captcha file and use urllib to write it to disk 
    os.remove("c:\captcha.jpg") 
    urllib.urlretrieve(img_src[0], "c:\captcha.jpg") 

    # I use an program here to show the jpg (actually send it somewhere) 
    captcha = subprocess.check_output(r".\external_utility_solving_captcha.exe") 

    # OR just get the input from the user from stdin 
    captcha = raw_input("put captcha in manually>") 

    # this function performs the request and calls the process_home_page with 
    # the response (this way you can chain pages from start_requests() to parse() 

    return [FormRequest.from_response(response,formnumber=0,formdata={'user':'xxx','pass':'xxx','captcha':captcha},callback=self.process_home_page)] 

    def process_home_page(self, response): 
     # check if you logged in etc. etc. 

...

क्या मैं यहाँ करना है कि मैं आयात urllib.urlretrieve(url है) (छवि को संग्रहित करने), os.remove(file) (पिछले छवि को हटाने के लिए), और subprocess.checoutput (एक बाहरी कमांड लाइन उपयोगिता कॉल करने के लिए कैप्चा को हल करने के लिए)। इस "हैक" में पूरे स्केयर इंफ्रास्ट्रक्चर का उपयोग नहीं किया जाता है, क्योंकि इस तरह के कैप्चा को हल करना हमेशा एक हैक होता है।

वह कॉलिंग बाहरी उपप्रोसेस चीज एक अच्छा हो सकती थी, लेकिन यह काम करती है।

कुछ साइटों पर कैप्चा छवि को सहेजना संभव नहीं है और आपको पृष्ठ को ब्राउज़र में कॉल करना होगा और एक स्क्रीन_capture उपयोगिता और कैप्चा को "काट" करने के लिए एक सटीक स्थान पर फसल कॉल करना होगा। अब यह स्क्रीनक्रैपिंग है।

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

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