以编程方式调用同一个蜘蛛
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 调用!
我有一个蜘蛛程序,它可以抓取通过的网站的链接。当使用不同的数据集执行完成时,我想再次启动同一个蜘蛛。如何再次重启同一个爬虫?这些网站通过数据库传递。我想让爬虫运行无限循环,直到爬完所有网站。目前我必须一直启动爬虫 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 调用!