在我的scrapy项目中,我必须在数据库中获取大量网址,这些网址由另一个蜘蛛填充。
通常我会从数据库中获取网址并将其设置为
蜘蛛的 (?<=<(ns\d:OutputData>)).*?(?=<\/\1)|(?<=<(ns\d\d:OutputData>)).*?(?=<\/\2)
属性,但db中可能有1000多个url,并且url可以随时更新。
所以我想知道是否可以从数据库中读取每个请求一个?
答案 0 :(得分:1)
可能有很多方法可以做到这一点。首先想到的是使用spider_idle
信号在完成任务时弹出新网址,这样您就可以始终拥有最新的网址。
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
现在,当第一个网址被抓取后,你的spider_idle()就会被调用,你可以在那里安排一个新网址,只要你能够从数据库中弹出网址,就可以继续这个网址。