在scrapy中特定请求完成后触发一个函数
triggering a function after the finish of specific Request in scrapy
我在 Scrapy 中有一个复杂的 scraping 应用程序,它 运行 在多个阶段(每个阶段都是一个调用下一阶段的抓取和解析的函数)。蜘蛛尝试下载多个目标,每个目标都包含大量文件。我需要做的是在下载目标的所有文件后调用一些处理它们的函数并且它不能部分地处理它们它同时需要目标的整个文件集。有办法吗?
如果你不能等到整个爬虫完成,你将不得不在一个项目管道中编写一些逻辑来跟踪你所抓取的内容,然后执行一个函数。
下面是一些让您入门的逻辑:它跟踪您为每个目标抓取的项目数,当它达到 100 时,它将执行 target_complete 方法。请注意,您必须在课程项目中填写 'target' 字段。
from collections import Counter
class TargetCountPipeline(object):
def __init__(self):
self.target_counter = Counter()
self.target_number = 100
def process_item(self, item, spider):
target = item['target']
self.target_counter[target] += 1
if self.target_counter[target] >= self.target_number:
target_complete(target)
return item
def target_complete(self, target):
# execute something here when you reached the target
我在 Scrapy 中有一个复杂的 scraping 应用程序,它 运行 在多个阶段(每个阶段都是一个调用下一阶段的抓取和解析的函数)。蜘蛛尝试下载多个目标,每个目标都包含大量文件。我需要做的是在下载目标的所有文件后调用一些处理它们的函数并且它不能部分地处理它们它同时需要目标的整个文件集。有办法吗?
如果你不能等到整个爬虫完成,你将不得不在一个项目管道中编写一些逻辑来跟踪你所抓取的内容,然后执行一个函数。 下面是一些让您入门的逻辑:它跟踪您为每个目标抓取的项目数,当它达到 100 时,它将执行 target_complete 方法。请注意,您必须在课程项目中填写 'target' 字段。
from collections import Counter
class TargetCountPipeline(object):
def __init__(self):
self.target_counter = Counter()
self.target_number = 100
def process_item(self, item, spider):
target = item['target']
self.target_counter[target] += 1
if self.target_counter[target] >= self.target_number:
target_complete(target)
return item
def target_complete(self, target):
# execute something here when you reached the target