2016-09-26 4 views
14

Scrapy 1.x documentation बताते हैं वहाँ लिए दो तरीके हैं कि एक स्क्रिप्ट से एक Scrapy मकड़ी चलाएँ:CrawlerProcess बनाम CrawlerRunner

का उपयोग कर क्या दोनों के बीच अंतर है ? मुझे "प्रक्रिया" और "धावक" कब उपयोग करना चाहिए?

उत्तर

16

स्कैरेपी का दस्तावेज दोनों के असली अनुप्रयोगों पर उदाहरण देने पर एक बहुत बुरा काम करता है।

CrawlerProcess मानता है कि स्केपर एकमात्र चीज है जो मुड़कर के रिएक्टर का उपयोग करने जा रही है। यदि आप अन्य कोड चलाने के लिए पायथन में धागे का उपयोग कर रहे हैं तो यह हमेशा सत्य नहीं होता है। आइए इसे एक उदाहरण के रूप में लें।

from scrapy.crawler import CrawlerProcess 
import scrapy 
def notThreadSafe(x): 
    """do something that isn't thread-safe""" 
    # ... 
class MySpider1(scrapy.Spider): 
    # Your first spider definition 
    ... 

class MySpider2(scrapy.Spider): 
    # Your second spider definition 
    ... 

process = CrawlerProcess() 
process.crawl(MySpider1) 
process.crawl(MySpider2) 
process.start() # the script will block here until all crawling jobs are finished 
notThreadSafe(3) # it will get executed when the crawlers stop 

अब, जैसा कि आप देख सकते हैं, समारोह केवल निष्पादित हो जाएगा जब क्रॉलर्स बंद करो, जो मैं जबकि क्रॉलर्स ही रिएक्टर में क्रॉल समारोह निष्पादित करने के लिए चाहते हैं, तो?

from twisted.internet import reactor 
from scrapy.crawler import CrawlerRunner 
import scrapy 

def notThreadSafe(x): 
    """do something that isn't thread-safe""" 
    # ... 

class MySpider1(scrapy.Spider): 
    # Your first spider definition 
    ... 

class MySpider2(scrapy.Spider): 
    # Your second spider definition 
    ... 
runner = CrawlerRunner() 
runner.crawl(MySpider1) 
runner.crawl(MySpider2) 
d = runner.join() 
d.addBoth(lambda _: reactor.stop()) 
reactor.callFromThread(notThreadSafe, 3) 
reactor.run() #it will run both crawlers and code inside the function 

धावक वर्ग इस कार्यक्षमता तक सीमित नहीं है, तो आप अपने रिएक्टर (स्थगित, धागे, getPage, कस्टम त्रुटि रिपोर्टिंग, आदि) पर कुछ कस्टम सेटिंग्स चाहते हो सकता है

2

CrawlerRunner:

इस वर्ग की जरूरत नहीं किया जाना चाहिए स्क्रिप्ट को मैन्युअल रूप से क्रॉल करने की प्रक्रिया को संभालने लेखन जब तक (के बाद से Scrapy यह तदनुसार का उपयोग करने का जिम्मेदार है)। एक उदाहरण के लिए एक स्क्रिप्ट से रन स्केपर देखें।

CrawlerProcess:

यह उपयोगिता CrawlerRunner तुलना में एक बेहतर फिट करता है, तो आप अपने आवेदन के भीतर एक और मुड़ रिएक्टर नहीं चला रहे हैं होना चाहिए।

ऐसा लगता है कि क्रॉलरप्रोसेस वह है जो आप चाहते हैं जब तक कि आप अपने क्रॉलर को मौजूदा ट्विस्ट एप्लिकेशन में नहीं जोड़ रहे हों।

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