【问题标题】:How to use APscheduler with scrapy如何将 APscheduler 与 scrapy 一起使用
【发布时间】:2015-06-28 04:35:07
【问题描述】:

让这段代码从脚本(http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script)运行scrapy crawler。但它不起作用。

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log,signals
from spiders.egov import EgovSpider
from scrapy.utils.project import get_project_settings

def run():
    spider =EgovSpider()
    settings = get_project_settings()
    crawler = Crawler(settings)
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
    crawler.configured
    crawler.crawl(spider)
    crawler.start()
    log.start()
    reactor.run()


from apscheduler.schedulers.twisted import TwistedScheduler
sched = TwistedScheduler()
sched.add_job(run, 'interval', seconds=10)
sched.start()

我的蜘蛛:

import scrapy

class EgovSpider(scrapy.Spider):
    name = 'egov'
    start_urls = ['http://egov-buryatia.ru/index.php?id=1493']


    def parse(self, response):

        data = response.xpath("//div[@id='main_wrapper_content_news']//tr//text()").extract()
        print data
        print response.url
        f = open("vac.txt","a")
        for d in data:
            f.write(d.encode(encoding="UTF-8") + "\n")

        f.write(str(now))
        f.close()

如果我替换“reactor.run()”行,蜘蛛会在 10 秒后启动一次:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log,signals
from spiders.egov import EgovSpider
from scrapy.utils.project import get_project_settings

def run():  
    spider =EgovSpider()
    settings = get_project_settings()
    crawler = Crawler(settings)
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
    crawler.configured
    crawler.crawl(spider)
    crawler.start()
    log.start()

from apscheduler.schedulers.twisted import TwistedScheduler
sched = TwistedScheduler()
sched.add_job(run, 'interval', seconds=10)
sched.start()
reactor.run()

我在 python 和英语方面经验不足 :) 请帮帮我。

【问题讨论】:

  • 好的,最后一段代码有什么问题?你说它在 10 秒后开始,就像它应该的那样。
  • 被启动了一次。不是每 10 秒一次。
  • 如果你还在寻找答案here 是我不久前写的一篇关于如何实现它的博文。此外,您还需要 0.24 版才能正常工作。

标签: python scrapy twisted apscheduler


【解决方案1】:

我今天遇到了同样的问题。这是一些信息。

Twisted reactor 一旦运行和停止就无法重新启动。您应该启动一个长时间运行的反应器并定期添加爬虫任务。

为了进一步简化代码,您可以使用 CrawlerProcess.start(),其中包含 reactor.run()。

from scrapy.crawler import CrawlerProcess
from spiders.egov import EgovSpider
from scrapy.utils.project import get_project_settings
from apscheduler.schedulers.twisted import TwistedScheduler

process = CrawlerProcess(get_project_settings())
sched = TwistedScheduler()
sched.add_job(process.crawl, 'interval', args=[EgovSpider], seconds=10)
sched.start()
process.start(False)    # Do not stop reactor after spider closes

【讨论】:

  • 如何处理多个 Scrapy 蜘蛛?
  • 如何只运行一个实例? max_instances=1 似乎不起作用。即使之前的抓取仍在运行,新的抓取也会开始。
  • 这不会与 Django 一起运行:该进程将阻止服务器初始化并继续愉快地抓取。
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多