我有一只蜘蛛抓取传递网站的链接。我想在使用不同的数据集完成执行时再次启动相同的蜘蛛。如何重新启动同一个爬虫?这些网站通过数据库传递。我希望爬虫在无限循环中运行,直到所有网站都被抓取。目前,我必须始终启动抓取工具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'
这是完成这项工作的正确方法吗?或者还有其他方法吗?请帮忙!
谢谢
答案 0 :(得分:1)
另一种方法是创建一个新脚本,从中选择数据库中的链接并将其保存到文件中,然后以这种方式调用scrapy脚本
os.system("scrapy crawl first")
并将文件中的链接加载到您的蜘蛛上并从那里开始工作。
如果你想不断检查数据库中的新链接,在第一个脚本中,只是在无限循环中不时地调用数据库,并在有新链接的时候进行scrapy调用!