【问题标题】:Scrapy keeps scraping start page despite different get request url尽管获取请求 url 不同,但 Scrapy 仍然在抓取起始页
【发布时间】:2017-01-30 21:19:33
【问题描述】:

我正在构建一个刮板来使用 scrapy 刮取不同的链接。 Scrapy 不断地从初始页面抓取链接。尽管GET 请求的 url 不同,但 response.url 始终相同,这会导致相同的页面被抓取。我认为没有任何类型的重定向,因为链接不会在普通浏览器中重定向。我还设置了一个随机的 DELAY_INTERVAL 以及使用 this 旋转用户代理。这是我的解析函数:

def parse(self,response):
        scraped_data = response.xpath("*//h3/a/@href").extract()        
        if self.urls is not None:               #urls has all the different links to be crawled.
            yield scrapy.Request(urls[self.k],callback=self.parse,dont_filter=True)
            self.k = self.k + 1
        else:
            yield self.logger.info("next page unavailable|LIMIT REACHED")

如何克服这种重复的抓取?

【问题讨论】:

  • 您能否提供更多蜘蛛代码和一些日志(使用 LOG_LEVEL='DEBUG')显示重复的 URL 被获取?此外,您可以在 yield scrapy.Request 之前添加一个 self.logger.debug(urls[self.k]) 语句,以确保您实际上正在排队您打算的请求。

标签: web-scraping scrapy scrapy-spider


【解决方案1】:

你的循环在这里有缺陷,你有一堆未定义的变量:

def parse(self,response):
    links = response.xpath("*//h3/a/@href").extract()       
    if urls is not None:  #  urls is not even defined
        yield scrapy.Request(url[k],callback=self.parse,dont_filter=True)
        k = k + 1   # k is not defined either
    else:
        yield self.logger.info("next page unavailable|LIMIT REACHED")

试试这样的方法:

def parse(self,response):
    links = response.xpath("*//h3/a/@href").extract()       
    for link in links:
        yield scrapy.Request(link, callback=self.parse)
    if not links:
        yield self.logger.info("next page unavailable|LIMIT REACHED")

如果你想避免重复,你也应该避免dont_filter标志。

【讨论】:

  • 这里很抱歉,urls 和 k 是实例变量。为了简单起见,我跳过了他们的细节。我已经编辑了原始问题。如果我避免 dont_filter 我只得到一个结果,因为尽管获取 url 不同,响应 url 总是相同的。
猜你喜欢
  • 2020-10-17
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多