先说个扎心的事实:你的爬虫大概率活不过第三页
我见过太多人,兴冲冲写了两百行Python,本地测试跑通了,一上真实目标页面,翻到第三页就开始403,第五页直接IP被拉黑。你查了半天代码逻辑,没问题;你换了个User-Agent,还是不行。问题出在哪?你的出口IP已经被目标站点标记了。
说白了,任何公开数据源都有基础的访问频率管控。你一个人用同一个IP连续请求几十次,在对方看来跟异常流量没什么区别。这时候代理IP就不是"锦上添花",而是你爬虫能不能跑起来的前提条件。
这篇文章不跟你扯什么分布式架构、什么异步并发模型,就讲一件事:一个刚接触代理IP的新手,怎么在二十分钟内把爬虫跑起来,并且让它稳定地跑下去。
动手之前,先判断你到底需不需要代理IP
不是所有爬虫都得挂代理。如果你只是抓个公开文档、跑个内部接口测试,本地IP完全够用。但下面这几种情况,你基本绕不开代理IP:
第一,你的目标站点有明确的频率限制,比如同一IP每分钟只能请求十几次。第二,你需要采集的数据分布在多个城市节点,需要不同地区的出口IP来获取本地化内容。第三,你的采集任务持续时间较长,单个IP用久了必然被风控。
如果你命中了上面任何一条,那就别硬扛了,老老实实上代理IP。省下来的调试时间够你多睡两觉。
选IP这件事,比写代码本身还容易踩坑
很多人一上来就问"哪个代理IP便宜",这个思路本身就偏了。你花三块钱买了个IP池,结果可用率只有七八成,跑着跑着就超时,你以为是代码的问题,折腾一晚上发现是IP本身就不行。这种坑我见得太多了。
选代理IP服务商,我建议你重点看这几个维度,别光看价格:
| 关注点 | 为什么重要 | 怎么判断 |
|---|---|---|
| IP来源是否正规 | 来路不明的IP随时可能失效,甚至带来法律风险 | 看是否标注了运营商授权信息 |
| 可用率/纯度 | 直接决定你爬虫的稳定性 | 问清楚实测可用率,别只看宣传数字 |
| IP时效 | 短效IP适合高频采集,长效IP适合需要持续会话的场景 | 根据自己任务时长选,别一刀切 |
| 城市覆盖 | 如果你需要特定地区的数据,IP池里得有对应节点 | 确认是否支持城市级定位 |
| API集成难度 | 你不想每次手动复制IP地址吧 | 看有没有现成的API文档和示例 |
我目前用得比较顺手的是神龙HTTP,简单说下为什么:它是国内三大运营商正规授权的,IP资源池有3000万+,每天更新去重,实测可用率能到99.9%这个水平。而且它支持HTTP/HTTPS/SOCKS5三种协议,你不管用什么语言写爬虫,基本都能接上。300多个城市级定位节点,如果你需要指定某个省或某个城市出口,直接API里传参数就行,不用自己折腾。
具体到套餐选择,新手我建议从短效动态IP池开始。它的IP存活时间是3到30分钟(可以定制),延迟很低,计费方式灵活,包量包时都行。你刚开始跑,用量不大,按量买最划算,不用一上来就包月。等你的采集任务稳定了、量上来了,再考虑长效静态IP或者固定IP,那时候你对自己的用量模式已经有感觉了。
实操:用Python加神龙HTTP跑一个能用的爬虫
下面这段代码是完整的,你复制过去改改目标URL就能跑。我故意写得简单,不整花活,你就看核心逻辑。
先装依赖:
pip install requests
然后写主程序:
import requests
import time
import random
神龙HTTP的API提取地址(在个人中心获取)
PROXY_API = "http://api.shenlongip.com/getip?num=1&format=json&protocol=http"
def get_proxy():
"""从神龙HTTP提取一个可用的代理IP"""
try:
resp = requests.get(PROXY_API, timeout=5)
data = resp.json()
返回格式类似: {"ip": "1.2.3.4", "port": 8080}
proxy = f"{data['ip']}:{data['port']}"
return proxy
except Exception as e:
print(f"提取IP失败: {e}")
return None
def fetch_page(url, proxy):
"""用代理IP请求目标页面"""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/125.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
}
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}"
}
try:
resp = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if resp.status_code == 200:
return resp.text
else:
print(f"状态码异常: {resp.status_code}")
return None
except requests.exceptions.ProxyError:
print(f"代理IP {proxy} 不可用,需要换一个")
return None
except requests.exceptions.Timeout:
print(f"代理IP {proxy} 超时")
return None
def main():
target_url = "https://example.com/page/1" 换成你的目标地址
total_pages = 5 你要抓几页
success_count = 0
for page in range(1, total_pages + 1):
url = target_url.replace("1", str(page))
print(f"--- 正在采集第 {page} 页 ---")
每页换一个IP,别贪心用同一个
proxy = get_proxy()
if not proxy:
time.sleep(3)
proxy = get_proxy()
if not proxy:
print("连续提取失败,稍后重试")
time.sleep(10)
continue
print(f"当前使用代理: {proxy}")
html = fetch_page(url, proxy)
if html:
success_count += 1
这里写你的解析逻辑,比如用BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
items = soup.select(".target-class")
print(f"第 {page} 页采集成功,内容长度: {len(html)}")
else:
print(f"第 {page} 页采集失败,换IP重试")
失败重试一次
time.sleep(2)
proxy = get_proxy()
if proxy:
html = fetch_page(url, proxy)
if html:
success_count += 1
print(f"重试成功,第 {page} 页已获取")
请求间隔,别太猛
time.sleep(random.uniform(1.5, 3.5))
print(f"===== 采集完成 =====")
print(f"成功: {success_count}/{total_pages}")
if __name__ == "__main__":
main()
几个关键点我单独拎出来说:
每页换IP。这是最核心的一条。短效动态IP本身就是设计来高频轮换的,你没必要死磕一个IP。神龙HTTP的短效池IP存活时间最短3分钟,你每页请求间隔两到三秒,一个IP完全够用,但为了安全起见,每页换一个新的更稳。
请求间隔别设太短。代码里我写的是1.5到3.5秒的随机间隔。你设成0.1秒,IP再干净也扛不住。这个值你根据目标站点的实际容忍度调,一般两到四秒是比较安全的区间。
失败要有重试机制。代理IP不是100%可用的,哪怕可用率99.9%,你跑一万次请求也会有十几次失败。代码里我做了简单的重试,实际项目中你可以加个重试队列,把失败的URL丢进去稍后再跑。
跑起来之后,这几个细节决定你能不能稳定出数据
代码能跑通只是第一步。真正让你头疼的是跑着跑着就出问题了。下面这几个点,我按重要程度排:
第一,监控你的IP消耗速度。神龙HTTP的个人中心有可视化的数据统计面板,你能看到IP的使用量、使用趋势、剩余配额。我建议你跑之前先设个心理预期:这个任务大概要消耗多少个IP?如果跑了一半发现配额快用完了,提前续上,别等任务中断了再手忙脚乱。
第二,记录每次请求的IP和结果。哪怕你只是往本地txt文件里写一行"时间-IP-状态码",跑完之后你也能快速定位问题。比如你发现某个时段的失败率突然升高,大概率是那批IP质量有问题,而不是你的代码逻辑变了。
第三,别在代码里硬编码IP地址。一定走API动态提取。硬编码的IP过几分钟就失效了,你改一次代码跑一次,效率很低。神龙HTTP的API接口兼容主流爬虫语言,Python、Java、Go、Node.js都有现成的调用方式,文档里也有示例代码,照着改就行。
第四,注意协议匹配。你的目标站点是HTTPS的话,代理也要走HTTPS或者支持HTTPS的HTTP代理。神龙HTTP三种协议都支持,你在API提取的时候指定protocol参数就行,别搞混了。
新手最容易忽略的三件事
说点"废话",但真的是血泪教训。
别一上来就追求高并发。我见过有人第一天就开二十个线程同时请求,IP池再大也经不住这么造。你先把单线程跑稳了,数据解析逻辑确认没问题了,再考虑加并发。加并发的时候,每个线程独立提取IP,别共用一个。
别忽略IP的"地域属性"。有些数据源的内容是按地区展示的。你用一个北京IP和一个成都IP去请求同一个页面,返回的内容可能不一样。如果你的采集需求涉及多地区数据,在神龙HTTP提取IP的时候指定城市参数,别用默认的混播。300多个城市节点随便你挑。
别把代理IP当万能药。如果你的目标站点有验证码、有登录态、有复杂的反爬机制,光换IP解决不了问题。代理IP解决的是"IP被标记"和"频率限制"这两个层面的问题。更复杂的场景,你可能还需要配合Cookie管理、请求头随机化、甚至人工介入。别指望换个IP就万事大吉。
常见问题
Q:我刚开始用,不知道要买多少IP量,怎么估算?
给你一个粗略的算法:你的总请求次数除以每个IP的可用请求次数,就是你需要的大概IP数量。短效IP一般能撑几十到一两百次请求(取决于目标站点的严格程度)。比如你要请求5000个页面,每个IP用50次,那你大概需要100个IP。神龙HTTP的短效动态IP池支持包量计费,你按这个数买,留个20%的余量应对失败重试,基本就够用了。跑完第一轮你对自己的消耗速度就有感觉了,后面调整起来很直观。
Q:我的爬虫是Java写的,神龙HTTP能接吗?
能。神龙HTTP的API是标准的HTTP接口,你不管用什么语言,只要能发HTTP请求就能调。Java里用HttpClient或者OkHttp发个GET请求到API地址,拿到返回的JSON里解析出IP和端口,塞进你的代理配置里就行。文档里有各语言的示例,你搜Java那个tab,复制改改参数就能用。技术团队是7×24小时在线的,集成过程中遇到任何卡点直接问就行,不用自己死磕。
Q:短效IP和长效IP到底怎么选?我两个都看上了。
看你的任务特征。如果你的采集是"请求完就走",比如抓个列表页、抓个详情页,每个请求之间没有会话关联,用短效动态IP就够了,便宜、灵活、IP池大。如果你的任务需要维持一个会话,比如登录后连续操作、或者需要同一个IP持续请求一段时间来保持Cookie有效,那用长效静态IP(1到24小时存活)更合适。还有一种情况:你的IP需求量不大(比如一天就几十个),但要求很高稳定性,那固定IP是更好的选择,它基于云主机,纯净度99.83%,存活时间长,按个数买,适合小量但求稳的场景。
Q:跑着跑着突然大量超时,是IP的问题还是我代码的问题?
先别急着改代码。打开神龙HTTP个人中心的监控面板,看一下那个时间段的IP使用趋势和异常标记。如果面板显示IP状态正常,那大概率是你代码的问题(比如超时时间设太短、DNS解析卡了)。如果面板显示某一批IP连通率下降,那就是IP侧的问题,你换一批IP继续跑就行。另外检查一下你的网络环境,本地网络抖动也会导致大面积超时,换个网络节点试试能不能排除。
最后说两句
代理IP这个东西,说复杂也复杂,说简单也就简单。核心就三件事:选对IP类型、控制好请求节奏、做好失败兜底。你把这三件事做扎实了,爬虫的稳定性至少能提升一个量级。
别一上来就搞什么百万级并发、什么自动IP轮换调度系统。先把一个单线程的脚本跑稳,数据能持续、干净地落盘,你就已经超过80%的新手了。剩下的优化,等你真的遇到瓶颈了再说,那时候你才知道自己到底需要什么。
去跑吧。跑通了记得回来看看监控面板,养成看数据的习惯,比看代码debug高效得多。


