【发布时间】:2019-12-05 12:43:00
【问题描述】:
我想在我的蜘蛛中禁用深度检查和迭代,或者在爬行时更改深度限制。这是我的一些代码:
def start_requests(self):
if isinstance(self.vuln, context.GenericVulnerability):
yield Request(
self.vuln.base_url,
callback=self.determine_aliases,
meta=self._normal_meta,
)
else:
for url in self.vuln.entrypoint_urls:
yield Request(
url, callback=self.parse, meta=self._patch_find_meta
)
@inline_requests
def determine_aliases(self, response):
vulns = [self.vuln]
processed_vulns = set()
while vulns:
vuln = vulns.pop()
if vuln.vuln_id is not self.vuln.vuln_id:
response = yield Request(vuln.base_url)
processed_vulns.add(vuln.vuln_id)
aliases = context.create_vulns(*list(self.parse(response)))
for alias in aliases:
if alias.vuln_id in processed_vulns:
continue
if isinstance(alias, context.GenericVulnerability):
vulns.append(alias)
else:
logger.info("Alias discovered: %s", alias.vuln_id)
self.cves.add(alias)
yield from self._generate_requests_for_vulns()
def _generate_requests_for_vulns(self):
for vuln in self.cves:
for url in vuln.entrypoint_urls:
yield Request(
url, callback=self.parse, meta=self._patch_find_meta
)
我的程序是这样的,用户可以给出他们需要/想要的深度限制作为输入。在某些情况下,我的默认解析方法允许递归爬取链接。
determine_aliases 是一种预处理方法,_generate_requests_for_vulns 生成的请求用于实际解决方案。
如您所见,我从响应中抓取了我需要的数据,并将其存储在来自确定别名的蜘蛛类中的一个集合属性“cves”中。完成后,我会从 _generate_requests_for_vulns 生成带有该数据的请求。
这里的问题是,要么产生来自确定别名的请求,要么调用确定别名作为回调迭代深度。因此,当我从 _generate_requests_for_vulns 发出请求以进行进一步爬取时,我的深度限制比预期的要快。
请注意,实际的爬取解决方案是从 _generate_requests_for_vulns 生成的请求开始的,因此给定的深度限制应仅适用于这些请求。
【问题讨论】:
-
达到深度限制时会发生什么?您是否获得最大递归限制? stackoverflow.com/questions/3323001/…
-
@HåkenLid 当我达到深度限制时,Scrapy 会忽略在该深度可能产生的任何进一步请求。我没有得到递归限制。