写爬虫最烦的就是代码跑着跑着突然报错。一看日志,IP被封了。那种感觉就像你正好好排队买奶茶,店员突然说你长得像坏人,不卖给你。真的挺无语的。
反爬虫最常用的三板斧就是封IP、看User-Agent、还有验证码。验证码比较麻烦,但前两个其实很好糊弄。我刚开始学爬虫的时候,一个循环跑200个网页,跑到第50个就挂了。后来加了time.sleep,能撑到第80个。再往后就不行了。网站发现你一个IP疯狂请求,它就是觉得你不正常。
那时候我想,要是有个能换IP的工具就好了。后来才知道有代理池这个东西。简单说就是准备一批IP,每次请求换一个。有的IP被封了,自动换下一个。这个逻辑不复杂,但真的管用。
再就是User-Agent,也就是浏览器标识。很多爬虫新手会忘了改这个,或者一直用同一个。网站一查,发现你是个“僵尸浏览器”,直接拉黑。所以要做随机UA。把自己伪装成Chrome、Firefox、Safari,换来换去。网站就不好判断你是人是机器。
我自己试过,用固定UA加单一IP,爬一个新闻网站大概能拿到200条数据。加了随机UA和代理池之后,同样那个网站,轻轻松松拿到2000条。差距就这么大。而且代码不需要多复杂。requests库就能搞定。把代理和UA放在headers里,每次请求前随机选一个就行。
有人担心代理池搭建麻烦。其实不用自己养一堆IP。网上有很多现成的代理服务,几块钱就能买几百个。写个循环检测一下哪些能用,存到列表里。请求的时候从列表随机取一个。被屏蔽了就删掉这个IP,换下一个。整个过程代码不超过50行。
还有一点很重要。别把爬虫写得太“急”。哪怕你有100个代理,也别一秒发100个请求。网站的管理员也不是傻子,流量异常还是能看出问题的。控制一下请求间隔,比如0.5到1.5秒随机。这样既快又安全。数据拿到手才是目的,不是为了跟网站硬刚。
我见过一个哥们,写爬虫的时候代理和UA都准备了。结果他为了追求速度,每0.1秒发一个请求。代理IP消耗得飞快。后来他改成每1秒一个,数据量只少了五分之一,但IP消耗降了一大半。这就是性价比。
说到底,反爬和爬虫就是一场猫鼠游戏。网站想尽办法拦你,你就想办法绕过去。代理池和随机UA就是最基础也最有效的两招。先把这两个搞定,大部分网站的数据你都能爬得到。至于那些要登录、要验证码的,那是另一个话题了。先把基础打好,别让IP和UA卡住你的第一步。