2016-02-11 13 views
7

हम scrapy-splash middleware का उपयोग Splash जावास्क्रिप्ट इंजन के माध्यम से एक डॉकर कंटेनर के अंदर चलने वाले स्क्रैप किए गए HTML स्रोत को पारित करने के लिए कर रहे हैं।स्क्रैप शैल और स्केपर स्पलैश

हम मकड़ी में स्पलैश उपयोग करना चाहते हैं, हम कई required project settings कॉन्फ़िगर और उपज एक Request को निर्दिष्ट विशिष्ट meta arguments:

yield Request(url, self.parse_result, meta={ 
    'splash': { 
     'args': { 
      # set rendering arguments here 
      'html': 1, 
      'png': 1, 

      # 'url' is prefilled from request url 
     }, 

     # optional parameters 
     'endpoint': 'render.json', # optional; default is render.json 
     'splash_url': '<url>',  # overrides SPLASH_URL 
     'slot_policy': scrapyjs.SlotPolicy.PER_DOMAIN, 
    } 
}) 

यह काम करता है के रूप में दस्तावेज। लेकिन, हम Scrapy Shell के अंदर scrapy-splash का उपयोग कैसे कर सकते हैं?

+2

यह सच है कि कोई भी [DEFAULT_REQUEST_META' नहीं है जैसे एक [DEFAULT_REQUEST_HEADERS] (http://doc.scrapy.org/en/latest/topics/settings.html?#std:setting-DEFAULT_REQUEST_HEADERS) जो एक अच्छा होगा इसके अलावा। एक मिडलवेयर के माध्यम से डिफ़ॉल्ट रूप से स्प्लैश को सक्षम करने पर खुली चर्चाएं होती हैं (https://github.com/scrapinghub/scrapy-splash/issues/11 देखें)। एक अन्य विकल्प है स्केपर-स्प्लैश एमडीडब्ल्यू और बल सेटिंग्स को उपclass करना है। विचार https://github.com/scrapinghub/scrapy-splash/issues –

उत्तर

12

बस उस यूआरएल को लपेटें जिसे आप splash http api में खोलना चाहते हैं।

तो तुम जैसे कुछ चाहेगा:

scrapy shell 'http://localhost:8050/render.html?url=http://domain.com/page-with-javascript.html&timeout=10&wait=0.5' 

जहां localhost:port वह जगह है जहाँ अपने छप सेवा चल रही है
url यूआरएल आप क्रॉल करने के लिए करना चाहते हैं और न urlquote यह भूल है!
render.html, संभव http api अंतिम बिंदुओं में से एक है टाइमआउट के लिए सेकंड में इस मामले में redered html पृष्ठ रिटर्न
timeout समय सेकंड में
wait समय जावास्क्रिप्ट के लिए पढ़ने/HTML सहेजने से पहले निष्पादित करने के लिए प्रतीक्षा करने के लिए।

+0

पर आपका स्वागत है, आप इसे अधिक सुविधाजनक बनाने के लिए शायद एक बैश उपनाम बना सकते हैं। – Granitosaurus

9

आप कॉन्फ़िगर किए गए स्क्रैप प्रोजेक्ट के अंदर तर्क के बिना scrapy shell चला सकते हैं, फिर req = scrapy_splash.SplashRequest(url, ...) बनाएं और fetch(req) पर कॉल करें।

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