scrapy.Request的旅行
使用代理池跑爬虫时,特别关注每个请求是否使用了代理,所以就有了接下来的收获,也有个问题同大家分享。
spider产生请求,例如在for循环中yield,这个生成器会在进入middlewares或下载器之前就被迭代,放入请求队列。
经过middlewares,队列中每个请求均被处理(如设置cookie,添加proxy),然后传递给下载器。但这里有一个需要关注的点,middlewares处理过的请求,下载器不一定立马执行,具体要参考settings中设置的download_delay/per_ip/per_domain。
队列默认的下载顺序是LIFO(后进先出,后进入队列的请求先被下载器执行)。
⚠️若proxy非长效ip,请求在等待执行时,middlewares给其设置的ip可能会失效!
建议:
DOWNLOAD_TIMEOUT 设置小值(默认是180),减少无效ip造成的时间浪费。
判断retry_times,更换代理ip或长效ip。
问题:
是否可能在每个请求给下载器执行前才设置proxy,减少proxy过期的概率/数量/时间?