【问题标题】:Scrapy get request url in parseScrapy在解析中获取请求url
【发布时间】:2013-12-03 13:33:50
【问题描述】:

如何在 Scrapy 的 parse() 函数中获取请求 url?我在start_urls 中有很多网址,其中一些将我的蜘蛛重定向到主页,结果我有一个空项目。所以我需要像item['start_url'] = request.url 这样的东西来存储这些网址。我正在使用 BaseSpider。

【问题讨论】:

  • 这个方法有效吗?
  • 在抓取过程中您可以访问requested_url,而不是将它们存储在一边,请查看我的答案

标签: python-2.7 scrapy scrapyd


【解决方案1】:

传递给 parse() 的“响应”变量包含您想要的信息。您不需要覆盖任何内容。

例如。 (已编辑)

def parse(self, response):
    print "URL: " + response.request.url

【讨论】:

  • 但这不是请求url,而是响应url。 Scrapy 的中间件处理重定向,因此您可以获得不同的 url。
  • response.request.url
  • 如果 url 有重定向,那么它给出的重定向 url 不是提供的 url
【解决方案2】:

请求对象可从响应对象访问,因此您可以执行以下操作:

def parse(self, response):
    item['start_url'] = response.request.url

【讨论】:

    【解决方案3】:

    您需要覆盖 BaseSpider 的 make_requests_from_url(url) function 以将 start_url 分配给项目,然后使用 Request.meta special keys 将该项目传递给 parse 函数

    from scrapy.http import Request
    
        # override method
        def make_requests_from_url(self, url):
            item = MyItem()
    
            # assign url
            item['start_url'] = url
            request = Request(url, dont_filter=True)
    
            # set the meta['item'] to use the item in the next call back
            request.meta['item'] = item
            return request
    
    
        def parse(self, response):
    
            # access and do something with the item in parse
            item = response.meta['item']
            item['other_url'] = response.url
            return item
    

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      而不是将请求的 URL 存储在某处,并且经过抓取处理的 URL 的顺序与start_urls 中提供的顺序不同。

      通过以下使用,

      response.request.meta['redirect_urls']
      

      将为您提供重定向列表,例如 ['http://requested_url','https://redirected_url','https://final_redirected_url']

      要访问上面列表中的第一个 URL,您可以使用

      response.request.meta['redirect_urls'][0]
      

      有关更多信息,请参阅doc.scrapy.org 提到:

      重定向中间件

      This middleware handles redirection of requests based on response status.
      

      可以在redirect_urls Request.meta 键中找到请求经过(重定向时)的 url。

      希望对你有帮助

      【讨论】:

      • 我相信你所需要的就是:redirect_urls = response.meta.get("redirect_urls")
      • 这应该是公认的答案。
      【解决方案5】:

      Python 3.5

      Scrapy 1.5.0

      from scrapy.http import Request
      
      # override method
      def start_requests(self):
          for url in self.start_urls:
              item = {'start_url': url}
              request = Request(url, dont_filter=True)
              # set the meta['item'] to use the item in the next call back
              request.meta['item'] = item
              yield request
      
      # use meta variable
      def parse(self, response):
          url = response.meta['item']['start_url']
      

      【讨论】:

        猜你喜欢
        • 2019-08-01
        • 1970-01-01
        • 2014-06-10
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多