讓Scrapy按計劃運行正在驅使着我圍繞着Twist(ed)。按計劃進行Scrapy
我想下面的測試代碼的工作,但我得到一個twisted.internet.error.ReactorNotRestartable
錯誤,當蜘蛛被觸發第二次:
from quotesbot.spiders.quotes import QuotesSpider
import schedule
import time
from scrapy.crawler import CrawlerProcess
def run_spider_script():
process.crawl(QuotesSpider)
process.start()
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
})
schedule.every(5).seconds.do(run_spider_script)
while True:
schedule.run_pending()
time.sleep(1)
我要去猜測,作爲CrawlerProcess,被扭曲的部分調用Reactor會再次啓動,如果不需要,則程序崩潰。有什麼辦法可以控制這個嗎?
同樣在這個階段,如果有另一種自動化Scrapy蜘蛛來按計劃運行的方法,我全都是耳朵。我試過scrapy.cmdline.execute
,但未能得到這兩種循環:
from quotesbot.spiders.quotes import QuotesSpider
from scrapy import cmdline
import schedule
import time
from scrapy.crawler import CrawlerProcess
def run_spider_cmd():
print("Running spider")
cmdline.execute("scrapy crawl quotes".split())
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
})
schedule.every(5).seconds.do(run_spider_cmd)
while True:
schedule.run_pending()
time.sleep(1)
編輯
添加代碼,它使用雙絞線task.LoopingCall()
運行測試蜘蛛每隔幾秒鐘。我是否完全錯誤地安排每天在同一時間運行的蜘蛛?
from twisted.internet import reactor
from twisted.internet import task
from scrapy.crawler import CrawlerRunner
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.xpath('//div[@class="quote"]')
for quote in quotes:
author = quote.xpath('.//small[@class="author"]/text()').extract_first()
text = quote.xpath('.//span[@class="text"]/text()').extract_first()
print(author, text)
def run_crawl():
runner = CrawlerRunner()
runner.crawl(QuotesSpider)
l = task.LoopingCall(run_crawl)
l.start(3)
reactor.run()
爲什麼不簡單地使用cron或systemd定時器? – Granitosaurus
數據的網絡抓取只是預期應用程序的一部分,我希望將所有內容都作爲單個程序的一部分運行。但是,是的,如果我無法按照所述方式運行,我將使用OS任務計劃程序運行Scrapy腳本,其餘應用程序將分別運行。 – itzafugazi