当前位置: 首页 > 面试题库 >

按计划刮擦

戚逸清
2023-03-14
问题内容

按计划运行Scrapy使我绕过Twist(ed)。

我以为下面的测试代码可以工作,但是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的一部分,Twisted Reactor会在不需要时再次启动,从而导致程序崩溃。有什么办法可以控制吗?

同样在这个阶段,如果有一种自动执行Scrapy
Spider的替代方法可以按计划运行,我也很高兴。我试过了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()每隔几秒钟使用Twisted运行一次测试蜘蛛。我是否打算用这种错误的方式来计划每天在同一时间运行的Spider?

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()

问题答案:

首先值得注意的是,通常只有 一个
Twisted反应堆正在运行,并且它不可重启(如您所发现)。第二个是应该避免阻塞任务/功能(即time.sleep(n)),并应使用异步替代方法(例如’reactor.task.deferLater(n,…)`)代替。

要从Twisted项目中有效使用Scrapy,需要使用scrapy.crawler.CrawlerRunner核心API,而不是scrapy.crawler.CrawlerProcess。两者之间的主要区别是为您CrawlerProcess运行Twisted的操作reactor(因此很难重新启动反应堆),而后者CrawlerRunner依赖于开发人员来启动反应堆。这是您的代码使用以下代码的样子CrawlerRunner

from twisted.internet import reactor
from quotesbot.spiders.quotes import QuotesSpider
from scrapy.crawler import CrawlerRunner

def run_crawl():
    """
    Run a spider within Twisted. Once it completes,
    wait 5 seconds and run another spider.
    """
    runner = CrawlerRunner({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        })
    deferred = runner.crawl(QuotesSpider)
    # you can use reactor.callLater or task.deferLater to schedule a function
    deferred.addCallback(reactor.callLater, 5, run_crawl)
    return deferred

run_crawl()
reactor.run()   # you have to run the reactor yourself


 类似资料:
  • 我可以在不同的变体中看到类似的问题,但还没有找到一个明确的答案。 null 这两个函数都应该是幂等的,因为使用轮询机制下载的文件不应该在临时拉取中再次下载,反之亦然。这两种访问方式都应该下载所有尚未下载的可用文件(可能会有不止一个新文件--我在这里看到了一个类似的问题,用于按需获取,但它是针对单个文件的)。 我想避免通过pollEnrich来修改SFTP-我的理解是,每个pollEnrich都将从

  • GNU 计划和自由软件基金会(the Free Software Foundation - FSF)是由Richard M. Stallman 于1984 年一手创办的。旨在开发一个类似 Unix、并且是自由软件的完整操作系统:GNU 系统。(GNU 是"GNU's Not Unix"的递归缩写,它的发音为"guh-NEW"。)各种使用linux 作为核心的GNU 操作系统正在被广泛的使用。虽然这

  • 实现一个刮刮乐的刮奖效果。即用手指滑动刮奖区,会刮去上面一层视图,显示下面一层视图的内容。 [Code4App.com]

  • 主要内容:测试计划的类型,如何编写测试计划,测试计划指南测试计划是描述软件测试领域和活动的详细文档。它概述了测试策略,目标,测试计划,所需资源(人力资源,软件和硬件),测试评估和测试可交付成果。 测试计划是每个软件测试的基础。这是最重要的活动,可确保以适当的顺序提供所有计划活动清单。 测试计划是用于将软件测试活动作为定义的过程进行的模板,该过程由测试经理完全监视和控制。 测试计划的类型 测试计划有三种类型 主测试计划 阶段测试计划 测试特定类型的测试计

  • Polar 跑步计划是一个随时可用的个人化的跑步计划,用于帮助您针对跑步比赛而进行训练。不论您是进行 5K 长跑训练还是进行马拉松训练,跑步计划都会告诉您如何训练、训练多少、训练频率。 Polar 跑步计划基于您的体能水平制定,用于确保您以正确的方式进行训练,并避免过度训练。这项计划专门针对您的比赛定制,考虑了您的个人特点、训练背景与准备时间。提供针对 5K、10K、半马拉松以及马拉松比赛的跑步计

  • 分支 开始时间 积极支持截止时间 安全维护截止时间 v4.3.x 2019-2-7 2019-9-30 2019-12-31 v4.4.x 2019-4-15 2020-4-30 2020-7-31 v4.5.x 2019-12-20 2020-12-31 2021-3-31 积极支持 受到官方开发组的积极支持,已报告的错误和安全问题将会立即被修复,并按照常规流程发布正式的版本。 安全维护 仅支持