【发布时间】:2016-12-04 03:38:32
【问题描述】:
在我的scrapy项目中,我必须在数据库中获取很多url,而这些url是由另一个蜘蛛填充的。
一般我会从数据库中获取url并将它们设置为
start_urlsspider 的属性,但是 db 中可能有 1000+ 上千个 url,并且可以随时更新 url。
所以我想知道是否可以为每个请求从数据库中读取一个?
【问题讨论】:
标签: scrapy
在我的scrapy项目中,我必须在数据库中获取很多url,而这些url是由另一个蜘蛛填充的。
一般我会从数据库中获取url并将它们设置为
start_urlsspider 的属性,但是 db 中可能有 1000+ 上千个 url,并且可以随时更新 url。
所以我想知道是否可以为每个请求从数据库中读取一个?
【问题讨论】:
标签: scrapy
可能有很多方法可以做到这一点。想到的第一个是使用spider_idle 信号在每次完成时弹出新的 url,这样你总是有最新的 url。
from scrapy import Spider, signals
from scrapy.exceptions import DontCloseSpider
class MySpider(scrapy.Spider):
start_urls = ['first_url']
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_idle, signals.spider_idle)
return spider
def spider_idle(self, spider):
new_url = ... #pop url from database
if new_url:
self.crawler.engine.schedule(
Request(new_url, callback=self.parse), spider)
raise DontCloseSpider
现在,一旦第一个 url 被抓取完成,您的 spider_idle() 将被调用,您可以在那里安排一个新的 url,只要您能够从数据库中弹出 url,就继续此操作。
【讨论】:
from_crawler 中连接信号。根据scrapy issue #1762。查看我的编辑。