小明最近在做一个数据分析的小项目,需要从某个电商网站上抓一批商品价格数据。他刚学了点爬虫基础,兴致勃勃写了个简单的脚本,一点运行,心里还美滋滋的,想着很快就能拿到数据。
结果还没撑过5分钟,网页直接弹出“403 Forbidden”,说白了就是IP被网站拉黑了。小明不服气,又找了个新IP,重新运行脚本,结果还是一样,再跑5分钟,又被封了。
他一脸懵圈:我也没干啥坏事啊,就是正常访问网页、抓点公开数据,怎么就被网站针对了?

其实原因很简单:小明的爬虫,1秒钟能发几十个请求,跟疯了一样;但正常人浏览网页,1秒钟撑死点一两次,哪有这么快的手速?网站的服务器一看这访问速度,立马就判断出来了——这不是真人,是机器在爬,赶紧启动速率限制,把IP封了再说。
先搞明白:什么是IP速率限制?
不用把它想得多高深,说白了就是网站给你的IP设了“访问速度上限”,就跟我们开车限速一样,超过速度就罚你。常见的限制就三种,特别好记:
- 每秒最多让你发N次请求,多一次都不行;
- 每分钟最多让你发M次请求,超了就警告;
- 一旦超过这个上限,要么暂时封你IP,要么弹出验证码让你验证,就是不让你继续爬。
举个通俗的例子,这就像小区的门禁:你正常刷卡进出,保安不管你;但你要是1秒钟刷10次卡,保安肯定觉得你不对劲,要么拦着你,要么直接不让你进——网站的速率限制,就相当于这个保安。
应对方法一:最简单的招——放慢爬取速度
这是最直接、最不用动脑子的方法,说白了就是让爬虫“慢下来”,装成正常人浏览的样子。
比如在代码里加一行休息的命令,每爬一页就停1秒,代码特别简单:
import time
time.sleep(1) # 每抓取一页,休息1秒但这里有个坑,大家一定要注意:如果要爬的数据多,比如10万页,按这个速度,就得等10万秒,差不多28个小时,太慢了,效率太低,根本不现实。
所以更聪明的做法是“动态调整”:刚开始可以稍微快一点,试探一下网站的底线;一旦发现不对劲,比如网页响应变慢,或者返回429状态码(就是网站明确告诉你“请求太多了”),就自动放慢速度,多休息一会儿。
对应的代码也很简单,直接加个判断就行:
if response.status_code == 429: # Too Many Requests,请求太频繁
time.sleep(30) # 被限制了就多等一会儿,比如休息30秒再继续应对方法二:最实用的招——搞个代理IP池,换着IP爬
一个IP容易被封,那我们就多搞几个IP,轮着用,相当于换着“身份”去访问网站,这样每个IP的请求频率都在安全范围内,网站自然就不会封你了。
代理IP池的原理特别简单,不用懂复杂的技术:你先找一批代理IP,放进一个“池子”里,爬虫每发几次请求,就换一个IP。比如IP A发10次请求,就换成IP B,IP B发10次,再换成IP C,循环往复,这样每个IP都不会超标。
市面上的代理IP就两种,免费的和付费的,新手别踩坑:
免费代理IP,看着省钱,其实特别坑——稳定性差,经常用着用着就失效了,而且很多免费IP本身就被网站拉黑了,你用它爬,刚启动就被封,纯属浪费时间,甚至还有数据泄露的风险,你的请求信息可能会被代理服务器记录下来;
付费代理IP就靠谱多了,比如站大爷、开心代理这些,虽然要花点钱,但稳定性高,很少失效,而且有售后,遇到问题能找客服解决,适合长期用。
另外,实际操作的时候,有3个小细节一定要注意,不然代理IP也白搭:
1. 定期检查代理IP的有效性,把失效的IP及时从池子里删掉,别让爬虫用死IP;
2. 一旦请求失败,比如返回403、429,就自动切换下一个代理IP,别死磕一个;
3. 做好请求重试机制,有时候请求失败不是IP的问题,可能是网络波动,重试一次就好了。
应对方法三:最能蒙混过关的招——装成真人,别被一眼看穿
现在很多网站都变精了,不只是看请求频率,还会分析你的“行为模式”,判断你是不是真人。
比如你要是让爬虫每隔2、3秒就发一次请求,太规律了,一看就是机器——我们真人浏览网页,有时候点得快,有时候会停下来看内容,间隔是随机的。
所以第一个小技巧,就是给请求间隔加个“随机抖动”,让爬虫的行为更像真人,代码也很简单:
import random
time.sleep(random.uniform(0.5, 2.5)) # 随机休息0.5到2.5秒,不规律才像真人第二个小技巧,就是完善浏览器请求头。咱们用浏览器访问网站时,会自动发送很多信息(比如User-Agent、Accept、Referer这些),但很多新手写爬虫,只发最简单的请求头,网站一眼就能看出来是爬虫,直接就封了。
正确的做法是:从自己的浏览器里复制完整的请求头,填到爬虫代码里,而且要定期更换User-Agent(相当于换不同的浏览器访问),别一直用同一个。
还有更绝的,就是加上Cookie、Session维持登录状态,甚至用Selenium、Playwright这些工具——这些工具能模拟真实的浏览器操作,比如点击、滑动,虽然爬得慢一点,但几乎不可能被识别成爬虫,适合对付反爬严格的网站。
应对方法四:最省心的招——用现成的工具,不用自己折腾
如果不想自己搞代理池、调代码,嫌麻烦,那直接用现成的解决方案就好,省时又省力,适合新手或者不想花太多时间折腾的人。
给大家推荐3种常用的,按需选择:
1. Scrapy框架:这个框架本身就自带自动限速和代理切换的功能,不用自己额外写代码,配置一下就能用;
2. 代理中间件:比如Scrapy-rotating-proxy,能自动管理IP轮换,你只需要把代理IP填进去,它就会自动帮你切换,不用手动操作,省了很多事;
3. 付费爬虫API服务:比如ScraperAPI、ZenRows,这些服务相当于“代爬”,你把要爬的网址给它,它直接帮你处理限流、反爬问题,返回给你数据,不用自己管IP、管速度,就是按月收费,适合预算充足、不想自己折腾的场景。
总结
上面这4个方法,能帮你绕开大部分网站的IP速率限制,但有3件事,大家一定要记在心里,别踩坑,不然技术再厉害也没用。
第一,一定要尊重robots.txt。每个网站的根目录里,都有一个叫robots.txt的文件,里面写清楚了哪些内容可以爬、哪些不能爬,还有建议的访问频率。你要是无视这个文件,不光没礼貌,要是爬了不该爬的内容,还可能惹上官司。
第二,别给人家网站添乱。就算你不怕IP被封,也要考虑网站服务器的承受能力。别在网站高峰期(比如电商大促)去爬,也别把并发开太高,要是把人家服务器搞崩了,不光不地道,还可能承担法律责任。
第三,法律底线绝对不能碰。爬取公开的商品价格、新闻这些数据,通常没问题;但如果爬用户隐私、版权内容,或者频繁爬取导致网站损失,就可能触犯法律了。2019年国内就有几个做爬虫的,因为爬了不该爬的内容,直接进去了,大家一定要引以为戒。
其实说到底,技术是死的,人是活的。做爬虫,慢一点、守规矩一点,反而更高效——毕竟被封IP后,你折腾换IP、调代码的时间,可能比你慢慢爬要长得多。
再回到小明的故事,他后来听了建议,调整了策略:每分钟只发30个请求,给请求间隔加了随机抖动(1-3秒),又搞了10个付费代理IP轮流用。虽然爬得比之前慢了一点,但安安稳稳跑了一整夜,顺利拿到了所有数据。
慢,但稳了,这才是成熟爬虫该有的样子,也是新手最该学会的道理。
