【问题标题】:Is there a way to restart a scrapy crawler?有没有办法重新启动一个scrapy爬虫?
【发布时间】:2021-01-07 17:00:48
【问题描述】:

我想知道是否有办法重新启动爬虫。这是我的代码的样子:

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.crawler import CrawlerProcess

results = set([])

class SitemapCrawler(CrawlSpider):

name = "Crawler"
start_urls = ['www.example.com']
allowed_domains = ['www.example.com']
rules = [Rule(LinkExtractor(), callback='parse_links', follow=True)]

def parse_links(self, response):
    href = response.xpath('//a/@href').getall()
    results.add(response.url)
    for link in href:
        results.add(link)

def start():
   process.crawl(Crawler)
   process.start()
   for link in results:
      print(link)

如果我尝试调用start() 两次,它会运行一次而不是给我这个错误:

raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable

我知道这是一个普遍的问题,所以我不希望有任何代码,但我只想知道如何解决这个问题。提前致谢。

【问题讨论】:

  • 重启是什么意思?您是要同时运行两个爬虫实例,还是在不知何故停止后重新启动爬虫。
  • @ibilgen,我的意思是第一次运行爬虫,直到它完成,然后再次运行它。
  • 我建议你使用独立脚本启动爬虫,然后你可以随心所欲地启动爬虫。

标签: python scrapy


【解决方案1】:
from twisted.internet import reactor
import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
class MySpider(scrapy.Spider):
        #Spider definition
        configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
        runner = CrawlerRunner()
        d = runner.crawl(MySpider)
        def finished():            
            print("finished :D") 
        d.addCallback(finished)
        reactor.run() 

【讨论】:

  • 有没有办法让爬虫在爬完后继续运行。我想做的是:抓取一个 url,然后等到添加了一个不同的 url,然后再抓取那个,依此类推。我不想直接重新启动它。我将它用于 API。
  • 你不能只用一个请求来做到这一点。您可以通过定期发送请求检查 url 更改。对于该更改回调第二个d.addCallback(sleep, seconds=<What ever you want>) # call back in second
  • @mtabbsi 我发现了一个与我类似的问题:stackoverflow.com/questions/65522335/…。如果你能回答这个问题,那就太好了。
  • @MeZo 查看我的答案
  • 感谢您的解决方案,它有效。有什么方法可以让我在 reactor.run() 之后运行代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2023-04-04
  • 2016-11-09
  • 2021-12-26
相关资源
最近更新 更多