以编程方式调用同一个蜘蛛

Calling the same spider programmatically

我有一个蜘蛛程序,它可以抓取通过的网站的链接。当使用不同的数据集执行完成时,我想再次启动同一个蜘蛛。如何再次重启同一个爬虫?这些网站通过数据库传递。我想让爬虫运行无限循环,直到爬完所有网站。目前我必须一直启动爬虫 scrapy crawl first。有什么方法可以让爬虫一次启动,爬完所有网站就停止?

我搜索了相同的内容,并找到了处理爬虫的解决方案 closed/finished。但我不知道如何以编程方式从 closed_handler 方法调用蜘蛛程序。

以下是我的代码:

 class MySpider(CrawlSpider):
        def __init__(self, *args, **kwargs):
            super(MySpider, self).__init__(*args, **kwargs)
            SignalManager(dispatcher.Any).connect(
                self.closed_handler, signal=signals.spider_closed)

        def closed_handler(self, spider):
            reactor.stop()
            settings = Settings()
            crawler = Crawler(settings)
            crawler.signals.connect(spider.spider_closing, signal=signals.spider_closed)
            crawler.configure()
            crawler.crawl(MySpider())
            crawler.start()
            reactor.run()

        # code for getting the websites from the database
        name = "first"
        def parse_url(self, response):
            ...

我收到错误:

Error caught on signal handler: <bound method ?.closed_handler of <MySpider 'first' at 0x40f8c70>>

Traceback (most recent call last):
  File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 150, in maybeDeferred
    result = f(*args, **kw)
  File "c:\python27\lib\site-packages\scrapy\xlib\pydispatch\robustapply.py", line 57, in robustApply
    return receiver(*arguments, **named)
  File "G:\Scrapy\web_link_crawler\web_link_crawler\spiders\first.py", line 72, in closed_handler
    crawler = Crawler(settings)
  File "c:\python27\lib\site-packages\scrapy\crawler.py", line 32, in __init__
    self.spidercls.update_settings(self.settings)
AttributeError: 'Settings' object has no attribute 'update_settings'

这是完成这项工作的正确方法吗?或者还有其他办法吗?请帮忙!

谢谢

另一种方法是制作一个新脚本,在其中 select 来自数据库的链接并将它们保存到一个文件中,然后以这种方式调用 scrapy 脚本

os.system("scrapy crawl first")

并将文件中的链接加载到您的蜘蛛上,然后从那里开始工作。

如果你想经常检查数据库中的新链接,在第一个脚本中只是不时地在无限循环中调用数据库,并在有新链接时进行 scrapy 调用!