每个scrapy请求是否都通过中间件?

时间:2018-02-05 10:53:30

标签: scrapy

我的蜘蛛中有这样的东西:

def some_parse(self,response):
    # ... other code here
    for link in extracted_links:
        log.info(link)
        yield scrapy.Request(link, callback=self.some_parse, method="GET")

在我的自定义下载器中间件中,我有类似的东西:

def process_request(self, request, spider):
    #do something
    log.info(request.url)
    request.headers.setdefault('User-Agent', "some randomly selected useragent")

我从some_parse获得了数千个日志,而从process_request只获得了几百个日志。为什么会这样?每个页面请求都没有通过中间件吗?

2 个答案:

答案 0 :(得分:0)

2个问题

  1. 你让刮刀完全完成了吗?
  2. 有一个更改,大多数网址都是重复的,这就是为什么没有通过中间件但显示在你的蜘蛛some_parse
  3. 我很确定您的网址因重复而被过滤了。

答案 1 :(得分:0)

我想我发现了这个问题。我有:

def some_parse(self,response): #1
    # ... other code here 
    for link in extracted_links: #2
        log.info(link) #3
        yield scrapy.Request(link, callback=self.some_parse, method="GET") #4

如果深度限制为N且响应属于属于第N个深度的URL,那么它所产生的所有链接都将在它已经记录时不会通过中间件。因此存在差异!

正确的记录方式是:

    def some_parse(self,response):
        # ... other code here 
        log.info(response.url)
        for link in extracted_links:
            yield scrapy.Request(link, callback=self.some_parse, method="GET")