账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    scrapy可不可以在Request下载前一刻更改url?关于时间戳
    68
    0

    小弟最近写scrapy爬虫,遇到一个问题:目标网站需要验证时间戳,如果把时间戳用普通的方式写进Spider的url里面,那么肯定不行,因为Spider的url(Request)还要被放到调度器里调度,不一定立刻能被调度上然后被下载,这样时间戳就过期了。

    然后小弟试着在下载器中间件,发现好像不能更改url:

        def process_request(self, request, spider):
                new_url = request.url + '&t=%s' % (self.gettime())
                request.replace(url = new_url)
                return None

    发现上面的这个方法没有用,查了一下好像是因为replace这个方法不是在原处修改,所以对Request没有影响。然后又试了一下这个:

        def process_request(self, request, spider):
                new_url = request.url + '&t=%s' % (self.gettime())
                new_r = request.replace(url = new_url)
                return new_r

    发现这个方法会陷入死循环。。。

    求解!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 夏温存∽ 普通会员 1楼

      Scrapy本身并没有直接的设置请求在下载前更改URL的功能。但是,你可以通过一些额外的步骤来实现这个需求。

      以下是一个简单的例子,假设你有一个URLhttp://example.com,并且你想要在下载前更改这个URL:

      ```python import scrapy from scrapy.crawler import CrawlerProcess

      def parse(self, response): # 保存原始URL self.headers['Location'] = response.url

      # 设置新的URL
      self.headers['Location'] = 'http://new-url.com'
      
      # 创建一个新的Request对象
      new_request = scrapy.Request(response.url, headers=self.headers)
      
      # 开始爬虫
      self.crawler_process.start()
      

      ```

      在这个例子中,我们在请求的headers属性中设置了新的URL。这样,每次请求时,headersLocation属性都会被更新为新的URL。

      请注意,这种方法可能不适用于所有情况,因为这可能会导致请求的超时。在实际使用中,你应该根据你的需求和网络环境来决定是否使用这个方法。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部