2012-06-26 11 views
9

में क्रॉलर को प्रोग्रामेटिक रूप से शुरू करने का सबसे आसान तरीका क्या है मैं एक पाइथन मॉड्यूल से स्केपर में क्रॉलर शुरू करना चाहता हूं। मैं अनिवार्य रूप से $ scrapy crawl my_crawler -a some_arg=value -L DEBUGस्केपर> = 0.14

का सार की नकल करना चाहते हैं मैं जगह में निम्नलिखित बातें है:

  • परियोजना के लिए एक settings.py फ़ाइल
  • वस्तुओं और पाइपलाइनों
  • एक क्रॉलर वर्ग जो BaseSpider फैली और प्रारंभिकरण पर तर्क की आवश्यकता है।

मैं काफी खुशी से scrapy आदेश का उपयोग कर अपने प्रोजेक्ट चला सकते हैं के रूप में ऊपर निर्दिष्ट, हालांकि मैं एकीकरण परीक्षणों लिख रहा हूँ और मैं करने के लिए प्रोग्राम के हैं: settings.py और में

  • लांच क्रॉल सेटिंग्स का उपयोग क्रॉलर my_crawler नाम विशेषता है कि (मैं अपने परीक्षण मॉड्यूल से आसानी से इस वर्ग का दृष्टांत कर सकते हैं।
  • मैं सभी पाइपलाइनों और मिडलवेयर settings.py में विनिर्देश के अनुसार इस्तेमाल किया जा करना चाहते हैं।
  • जब तक क्रॉलर समाप्त नहीं हो जाता है तब तक प्रक्रिया को अवरोधित करने के लिए मैं काफी खुश हूं। पाइपलाइनें डीबी में चीजें डंप करती हैं और डीबी की सामग्री मैं अपने परीक्षणों को पूरा करने के लिए क्रॉल करने के बाद निरीक्षण करूँगा।

तो, क्या कोई मेरी मदद कर सकता है? मैंने नेट पर कुछ उदाहरण देखे हैं लेकिन वे या तो कई मकड़ियों के लिए हैंक्स, या लगभग Twisted's प्रकृति अवरुद्ध कर रहे हैं, या स्केपर 0.14 या उससे ऊपर के साथ काम नहीं करते हैं। मुझे बस कुछ वास्तविक सरल चाहिए। :-)

+1

क्या 'subprocess.check_output ([ 'scrapy' साथ कुछ गड़बड़ है , ...], stderr = subprocess.STDOUT) '? – jfs

+1

मुझे लगता है कि एक और प्रक्रिया शुरू करना और बाहरी लिपि को निष्पादित करना एक हैक का थोड़ा सा है। मुझे पता है कि इसे एक ही प्रक्रिया (स्पष्ट रूप से) के भीतर से करना संभव है, और मैं जानना चाहता हूं कि इसे स्वयं कैसे करें। :-) – Edwardr

+2

यह एक हैक नहीं है यदि यह एकीकरण परीक्षण है अन्यथा आप स्क्रैप के विशिष्ट संस्करण पर निर्भर करेंगे (आंतरिक लाइन कमांड लाइन इंटरफ़ेस से तेज़ी से बदलते हैं) – jfs

उत्तर

7
from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 
from scrapy import log, signals 
from testspiders.spiders.followall import FollowAllSpider 

spider = FollowAllSpider(domain='scrapinghub.com') 
crawler = Crawler(Settings()) 
crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start() 
reactor.run() # the script will block here until the spider_closed signal was sent 

देखें this part of the docs

3

@ सरकारी डॉक्स से विल्फ्रेड के जवाब हिस्सा प्रवेश करने को छोड़कर ठीक काम करता है, यहाँ मेरा है:

from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy import log, signals 
from testspiders.spiders.followall import FollowAllSpider 
from scrapy.utils.project import get_project_settings 

spider = FollowAllSpider() 
crawler = crawler = Crawler(get_project_settings()) 
crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start_from_settings(get_project_settings()) 
reactor.run() 
संबंधित मुद्दे