在 Scrapy 中覆盖 parse_start_url() 并将爬行深度限制为 1
Overriding parse_start_url() in Scrapy and limiting crawl depth to 1
我正在使用 Scrapy 抓取网站并覆盖 parse_start_url()
以抓取起始网址。
但是,这意味着当我将 DEPTH_LIMIT
设置为 1 时,Scrapy 会在深度 2 处爬行(因为我猜如果起始 url 不计入深度是有意义的,如果它们是通常被解析)。这在 1 以外的任何深度爬行时都可以,因为我可以将 DEPTH_LIMIT
减少 1 来解决这个问题。但是,这在深度 1 爬行时不起作用,因为 DEPTH_LIMIT
为 0 被视为无限深度。
谁能想出一种方法来解析起始 URL 并将深度限制为 1?
还是我自己写DepthMiddleware
?
当您从 parse_start_url()
方法产生请求时,设置 meta['depth']
:
yield Request(url, meta={'depth': 1})
这应该可以解决问题,因为稍后,当响应到达时,在 DepthMiddleware
中它会增加 1:
def process_spider_output(self, response, result, spider):
def _filter(request):
if isinstance(request, Request):
depth = response.meta['depth'] + 1
...
我正在使用 Scrapy 抓取网站并覆盖 parse_start_url()
以抓取起始网址。
但是,这意味着当我将 DEPTH_LIMIT
设置为 1 时,Scrapy 会在深度 2 处爬行(因为我猜如果起始 url 不计入深度是有意义的,如果它们是通常被解析)。这在 1 以外的任何深度爬行时都可以,因为我可以将 DEPTH_LIMIT
减少 1 来解决这个问题。但是,这在深度 1 爬行时不起作用,因为 DEPTH_LIMIT
为 0 被视为无限深度。
谁能想出一种方法来解析起始 URL 并将深度限制为 1?
还是我自己写DepthMiddleware
?
当您从 parse_start_url()
方法产生请求时,设置 meta['depth']
:
yield Request(url, meta={'depth': 1})
这应该可以解决问题,因为稍后,当响应到达时,在 DepthMiddleware
中它会增加 1:
def process_spider_output(self, response, result, spider):
def _filter(request):
if isinstance(request, Request):
depth = response.meta['depth'] + 1
...