Scrapy spider_idle 信号 - 需要添加带有解析项回调的请求
Scrapy spider_idle signal - need to add requests with parse item callback
在我的 Scrapy 蜘蛛中,我重写了 start_requests()
方法,以便从数据库中检索一些额外的 url,这些 url 表示在抓取中可能遗漏的项目(孤立项目)。这应该发生在爬行过程结束时。类似于(伪代码):
def start_requests(self):
for url in self.start_urls:
yield Request(url, dont_filter=True)
# attempt to crawl orphaned items
db = MySQLdb.connect(host=self.settings['AWS_RDS_HOST'],
port=self.settings['AWS_RDS_PORT'],
user=self.settings['AWS_RDS_USER'],
passwd=self.settings['AWS_RDS_PASSWD'],
db=self.settings['AWS_RDS_DB'],
cursorclass=MySQLdb.cursors.DictCursor,
use_unicode=True,
charset="utf8",)
c=db.cursor()
c.execute("""SELECT p.url FROM products p LEFT JOIN product_data pd ON p.id = pd.product_id AND pd.scrape_date = CURDATE() WHERE p.website_id = %s AND pd.id IS NULL""", (self.website_id,))
while True:
url = c.fetchone()
if url is None:
break
# record orphaned product
self.crawler.stats.inc_value('orphaned_count')
yield Request(url['url'], callback=self.parse_item)
db.close()
不幸的是,在其余的爬网过程中,爬虫似乎将这些孤立的项目排队 - 因此,实际上,太多的项目被视为孤立的(因为爬虫尚未在正常爬网中检索到这些项目,当执行数据库查询时)。
我需要这个孤立的进程在抓取结束时发生 - 所以我相信我需要使用 spider_idle 信号。
然而,我的理解是我不能简单地在我的蜘蛛空闲方法中产生请求——相反我可以使用 self.crawler.engine.crawl
?
我需要通过我的蜘蛛程序的 parse_item()
方法处理请求(并且要遵守我配置的中间件、扩展和管道)。我怎样才能做到这一点?
连接到 idle signal
的空闲方法(假设空闲方法称为 idle_method
)应该接收 spider
作为参数,因此您可以执行以下操作:
def idle_method(self, spider):
self.crawler.engine.crawl(Request(url=myurl, callback=spider.parse_item), spider)
在我的 Scrapy 蜘蛛中,我重写了 start_requests()
方法,以便从数据库中检索一些额外的 url,这些 url 表示在抓取中可能遗漏的项目(孤立项目)。这应该发生在爬行过程结束时。类似于(伪代码):
def start_requests(self):
for url in self.start_urls:
yield Request(url, dont_filter=True)
# attempt to crawl orphaned items
db = MySQLdb.connect(host=self.settings['AWS_RDS_HOST'],
port=self.settings['AWS_RDS_PORT'],
user=self.settings['AWS_RDS_USER'],
passwd=self.settings['AWS_RDS_PASSWD'],
db=self.settings['AWS_RDS_DB'],
cursorclass=MySQLdb.cursors.DictCursor,
use_unicode=True,
charset="utf8",)
c=db.cursor()
c.execute("""SELECT p.url FROM products p LEFT JOIN product_data pd ON p.id = pd.product_id AND pd.scrape_date = CURDATE() WHERE p.website_id = %s AND pd.id IS NULL""", (self.website_id,))
while True:
url = c.fetchone()
if url is None:
break
# record orphaned product
self.crawler.stats.inc_value('orphaned_count')
yield Request(url['url'], callback=self.parse_item)
db.close()
不幸的是,在其余的爬网过程中,爬虫似乎将这些孤立的项目排队 - 因此,实际上,太多的项目被视为孤立的(因为爬虫尚未在正常爬网中检索到这些项目,当执行数据库查询时)。
我需要这个孤立的进程在抓取结束时发生 - 所以我相信我需要使用 spider_idle 信号。
然而,我的理解是我不能简单地在我的蜘蛛空闲方法中产生请求——相反我可以使用 self.crawler.engine.crawl
?
我需要通过我的蜘蛛程序的 parse_item()
方法处理请求(并且要遵守我配置的中间件、扩展和管道)。我怎样才能做到这一点?
连接到 idle signal
的空闲方法(假设空闲方法称为 idle_method
)应该接收 spider
作为参数,因此您可以执行以下操作:
def idle_method(self, spider):
self.crawler.engine.crawl(Request(url=myurl, callback=spider.parse_item), spider)