小弟最近写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
发现这个方法会陷入死循环。。。
求解!
由于request.url是只读的属性,所以不能直接更改。
但看了一下源码,可以尝试在下载器中间件中这样写: