【问题标题】:scrapy how to set referer urlscrapy如何设置referer url
【发布时间】:2012-10-15 17:04:23
【问题描述】:

我需要设置referer url,在抓取站点之前,该站点使用基于refering url的身份验证,因此如果referer无效,则不允许我登录。

有人可以告诉如何在 Scrapy 中执行此操作吗?

【问题讨论】:

    标签: screen-scraping scrapy


    【解决方案1】:

    如果您想更改蜘蛛请求中的引用者,可以在 settings.py 文件中更改 DEFAULT_REQUEST_HEADERS

    DEFAULT_REQUEST_HEADERS = {
        'Referer': 'http://www.google.com' 
    }
    

    【讨论】:

      【解决方案2】:

      你应该完全按照@warwaruk 的指示做,下面是我对爬行蜘蛛的详细说明:

      from scrapy.spiders import CrawlSpider
      from scrapy import Request
      
      class MySpider(CrawlSpider):
        name = "myspider"
        allowed_domains = ["example.com"]
        start_urls = [
            'http://example.com/foo'
            'http://example.com/bar'
            'http://example.com/baz'
            ]
        rules = [(...)]
      
        def start_requests(self):
          requests = []
          for item in self.start_urls:
            requests.append(Request(url=item, headers={'Referer':'http://www.example.com/'}))
          return requests    
      
        def parse_me(self, response):
          (...)
      

      这应该会在您的终端中生成以下日志:

      (...)
      [myspider] DEBUG: Crawled (200) <GET http://example.com/foo> (referer: http://www.example.com/)
      (...)
      [myspider] DEBUG: Crawled (200) <GET http://example.com/bar> (referer: http://www.example.com/)
      (...)
      [myspider] DEBUG: Crawled (200) <GET http://example.com/baz> (referer: http://www.example.com/)
      (...)
      

      与 BaseSpider 相同。最后start_requests方法是BaseSpider方法,CrawlSpider继承自该方法。

      Documentation 解释了 Request 中除了 headers 之外的更多选项,例如:cookies、回调函数、请求的优先级等。

      【讨论】:

        【解决方案3】:

        只需在请求标头中设置Referer url

        class scrapy.http.Request(url[, method='GET', body, headers, ...

        headers (dict) – the headers of this request. The dict values can be strings (for single valued headers) or lists (for multi-valued headers).

        例子:

        return Request(url=your_url, headers={'Referer':'http://your_referer_url'})

        【讨论】:

          【解决方案4】:

          覆盖 BaseSpider.start_requests 并在那里创建您的自定义 Request 并将您的 referer 标头传递给它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-13
            • 2015-05-19
            • 1970-01-01
            • 2011-12-16
            • 2012-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多