kohnv
2016-07-16 10:30:42 +08:00
说说当时遇到的一些问题和解决方案吧.
1. 验证代理可不可用可以用这个代理去抓取某个很短的网页, 例如我当时是从百度主页随便找了一个 ajax 请求的 URL, 然后比较爬到的内容是不是正常. 这样可以剔除掉不可用的代理, 并把可用的加到代理池中. 这里所谓的不可用其实有多种可能, 例如超时, 返回 501 等异常状态码, 返回广告页面等. 光测试 ip 响应时间是不行的, 只能检查到超时的情况. 这样做确实验证的速度很慢, 但是实际运行过程中好几小时才需要抓取新代理, 然后验证, 因此对吞吐量的影响并不大. 这里的前提是只在加入到代理池时验证一次, 在使用过程中不再定期验证, 否则的话会极大的影响效率.
2. 网上的免费代理有效时间不长, 例如刚刚验证过能用的代理, 可能过了十几分钟不能用了. 所以哪怕是经过了验证的代理也仍然是不能完全信任的, 代理池中需要在发现代理不能用的时候剔除不可用的代理. 如何发现代理不能用其实是个问题, 对于超时, 501 等状态码可以再代理池中检查, 但是有些代理返回广告页面, 那么代理池在不知道用户想爬什么内容的情况是无法分辨取到的 response 是正常的还是代理返回的广告. 因此这里需要有爬虫在 parse 过程中发现异常之后主动通知代理池代理不可用. 当然你也完全可以假设, 通过第一步中验证的代理哪怕不可用了也只是超时, 不会出现刚开始可用, 后来返回广告这种情况.
3. 有些代理会缓存页面, 导致爬到的内容是旧的, 这个目前我也没想到办法. 不过好在我爬的页面不会频繁更新, 爬到过期的数据也无所谓.