刚开始用代理跑爬虫的时候,我以为配代理就是把IP往配置文件里一填,结果不同框架的写法完全不是一回事,Requests、Scrapy、Selenium各有一套。我在这些框架上没少踩坑,有些请求明明配了代理,一查还是本机IP在跑。今天把几个框架的配置经验和容易漏的地方整理一下。
Requests:http和https最好都写上
Requests配代理是通过proxies参数,很多人只写了http,忘了https,结果访问https接口时还是直连。我的习惯是两个都写,哪怕用的是同一个IP,也分别给http和https各配一份。
还有个细节:如果代理需要账号密码,写法和普通IP不一样,得用"协议://用户名:密码@IP:端口"这种格式。第一次配的时候我直接把它当普通IP写,报错报了半天。
Scrapy:在中间件里统一配,比改settings省心
Scrapy配代理可以写在settings里,但如果要动态换IP,最好还是在下载中间件里处理。我在中间件里统一给每个请求设置代理头,然后从代理池里取IP,这样每个请求都能轮换,不用在蜘蛛代码里到处写。
这里我踩过的坑是:代理设置了,但没正确处理异常,遇到失效IP就直接中断。后来加了一层重试,请求失败就换一个IP重发,稳定性好很多。
Selenium:代理要在驱动启动时传进去
Selenium的代理不是打开页面后再配,而是在启动浏览器驱动的时候通过参数传。我早期试过启动之后再改,发现根本不生效。
另外,用无头浏览器跑的时候,最好再检查一下WebRTC这些东西有没有把真实IP漏出去,光配代理不一定够。跑之前拿个返回IP的页面确认一下,比较稳妥。
全局代理最怕"漏配"
不管哪个框架,最容易出问题的其实是漏配。比如用了多线程、异步请求、第三方库,总有那么一两个请求没走代理,真实IP就漏出去了。
我的检查办法很简单:先访问一个能返回IP的接口,看返回的是代理IP还是本机IP。如果混着出现,就说明有请求漏配了,回去挨个查。
我现在配代理的习惯
现在我的做法是:框架里统一做代理中间件,IP来源用API实时提取,配合短效轮换,基本不用手工维护。星月代理支持HTTP、HTTPS、SOCKS5,API提出来直接能用,我配Requests、Scrapy都省事。它家IP池覆盖全国300多个城市,可用率标的90%以上,短效IP自动换,跑长时间任务比较稳。新用户可以先领免费试用IP,把各框架的代理配置都跑一遍、用返回IP的接口验证一下,确认都从代理出口走,再正式开跑。
配置代理这事儿,说到底就两点:别漏配,别配错。把http/https分开、在框架的统一入口设置、启动时传参,再用返回IP验证一遍,基本就稳了。
Requests、Scrapy、Selenium配全局代理各有各的写法,最怕的是http/https漏配、代理没在启动时传入、以及部分请求绕过代理。用返回IP的接口验证一遍,能省下大量排查时间。