基础起步:在requests中接入代理IP
写Python爬虫的朋友都知道,现在网站的反爬策略越来越聪明。你刚抓几页数据,本机IP可能就被限制访问了,页面提示“访问频繁”或者直接返回403。这时候,代理IP就成了必备工具。到了2026年,简单的代理设置已经不够用了,咱们得学会从基础的requests配置到搭建高效的IP池。今天就来手把手教大家怎么搞。
很多新手刚接触爬虫时,习惯用requests库直接请求。其实给它加上代理非常简单,只需要在请求参数里加上proxies字段就行。咱们来看个最基础的写法。
import requests
目标网址
url = 'https://example.com'
设置代理IP(这里以HTTP代理为例)
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080'
}
try:
response = requests.get(url, proxies=proxies, timeout=5)
print(f"状态码: {response.status_code}")
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
这里有个关键点要注意:代理IP的格式必须和你的请求协议对应上。如果你用的是HTTP代理,但访问的是HTTPS网站,有时候就会报错。所以最好找那种同时支持HTTP/HTTPS/SOCKS5协议的服务商,省去协议不匹配的烦恼。
告别单打独斗:为什么你的爬虫需要IP池?
用上面的方法,你买了一个代理IP,填进去,确实能跑通。但问题是,现在的网站对单一IP的访问频率卡得很严。一个IP用不了多久就会被封掉。如果你的爬虫任务比较重,总不能每次IP失效了都手动去改代码吧?
这时候,IP池的概念就出来了。简单来说,IP池就是一个存放大量可用代理IP的“仓库”。你的爬虫每次发请求前,先从仓库里挑一个IP出来用。如果发现这个IP不能用了,就把它从仓库里扔掉,再换一个新的。这样一来,你的爬虫就能自己处理IP失效的问题,实现长时间稳定运行。
一个合格的IP池应该具备这几个功能:自动获取IP、定时检测存活、剔除失效IP、按需分配。自己从零开始写一套完善的调度系统比较费劲,对于大多数开发者来说,直接调用服务商提供的API接口来维护一个本地小池子是最划算的。
动手实践:搭建一个简易的本地代理IP池
搭IP池听起来高大上,其实核心逻辑就三步。咱们可以写个简单的Python脚本来实现。你需要一个靠谱的代理IP来源。这里以咱们神龙HTTP为例,通过它的API接口,你可以直接获取到一批可用的代理IP。
import requests
import time
模拟从神龙HTTP API获取到的IP列表
api_url = "你的神龙HTTP API提取链接"
try:
resp = requests.get(api_url, timeout=10)
假设返回的是每行一个ip:port的文本
ip_list = resp.text.strip().split('')
except Exception as e:
print(f"获取IP失败: {e}")
ip_list = []
简易IP池
ip_pool = []
验证并加入IP池
for ip_port in ip_list:
proxies = {
'http': f'http://{ip_port}',
'https': f'http://{ip_port}'
}
try:
用百度做个简单的连通性测试
test_resp = requests.get('https://www.baidu.com', proxies=proxies, timeout=3)
if test_resp.status_code == 200:
ip_pool.append(ip_port)
print(f"IP {ip_port} 验证通过,已加入池子")
except:
print(f"IP {ip_port} 无法使用,丢弃")
使用IP池进行请求
def fetch_data(url):
if not ip_pool:
print("IP池空了!")
return None
取出一个IP
current_ip = ip_pool.pop(0)
proxies = {
'http': f'http://{current_ip}',
'https': f'http://{current_ip}'
}
try:
res = requests.get(url, proxies=proxies, timeout=5)
return res.text
except Exception as e:
print(f"IP {current_ip} 请求失败,准备换下一个")
return fetch_data(url) 递归重试
实际抓取
data = fetch_data('https://target-site.com')
这段代码虽然简单,但已经具备了IP池的雏形。在实际应用中,你还可以加上多线程验证、数据库存储等功能,让IP池更健壮。自己维护IP池终究需要耗费服务器资源和精力,如果业务量大,建议直接选用自带池化管理能力的高品质代理服务。
稳定之源:如何挑选合适的代理IP服务
自己写代码搭IP池是一方面,但池子里的水(IP质量)好不好,还得看源头。市面上免费的代理IP基本不能用,存活率很低,还会拖慢爬虫速度。做正经的数据采集,还是得找正规的服务商。
这里给大家推荐咱们神龙HTTP。它家是国内三大运营商正规授权的,IP资源库超3000万,每个IP都经过严格筛选,可用率高达99.9%。对于爬虫来说,高可用率意味着你的代码不用频繁处理报错,效率会高很多。而且它支持HTTP/HTTPS/SOCKS5协议,不管你的爬虫是怎么写的,都能轻松对接。神龙HTTP的API接口兼容各种主流编程语言,提供详尽文档和示例代码,724小时技术支持,集成起来非常顺手。
为了满足不同场景的需求,神龙HTTP提供了几种不同的套餐,大家可以按需选择:
| 套餐类型 | 特点说明 | 适用场景 |
|---|---|---|
| 短效动态IP池 | 存活期短(3-30分钟可定制),每日更新去重,低延迟,支持高并发提取。 | 适合高频次、大规模的数据抓取任务。 |
| 长效静态IP池 | 存活期长(1-24小时可定制),每日去重,支持指定省市定位,纯净度高。 | 适合需要保持会话、登录状态的数据采集。 |
| 固定IP池 | 基于高性能云主机构建,ISP正式分配,很高稳定性,按个数售卖。 | 适合IP需求量不大,但追求很高稳定性的业务。 |
常见问题QA
Q1: 为什么我设置了代理IP,爬虫还是经常报超时错误?
A1: 报超时通常有两个原因。一是你用的代理IP本身延迟太高,或者已经失效了。这时候建议在代码里加上超时重试机制,发现超时就更换一个IP。二是你本地网络环境波动。如果是代理质量问题,建议换用像神龙HTTP这种低延迟、高连通率的服务商,并且利用其个人中心的可视化数据统计功能,直观掌握IP使用情况,及时调整策略。
Q2: 我的爬虫并发量很大,应该选哪种代理套餐比较好?
A2: 如果并发量大,说明你需要在短时间内发出大量请求。这种情况最适合用神龙HTTP的短效动态IP池。它支持高并发提取,IP存活时间短但更新快,非常适合高频次的数据抓取任务。灵活的包量或包时计费方式也能很好地控制成本。


