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

时间:2016-05-03 11:22:02

标签: web-scraping scrapy scrapy-spider

我有一只蜘蛛抓取传递网站的链接。我想在使用不同的数据集完成执行时再次启动相同的蜘蛛。如何重新启动同一个爬虫?这些网站通过数据库传递。我希望爬虫在无限循环中运行,直到所有网站都被抓取。目前,我必须始终启动抓取工具scrapy crawl first。有没有办法启动爬虫一次,它会在所有网站被抓取时停止?

我搜索了相同的内容,并找到了一个处理爬虫的解决方案。但我不知道如何以编程方式从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'

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

谢谢

1 个答案:

答案 0 :(得分:1)

另一种方法是创建一个新脚本,从中选择数据库中的链接并将其保存到文件中,然后以这种方式调用scrapy脚本

os.system("scrapy crawl first")

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

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