手把手教你用HTTPX异步请求玩转代理IP
最近在爬虫群里看到不少小伙伴抱怨,用requests做数据采集总被封IP。今天咱们换个新武器——HTTPX库,这玩意儿的异步请求功能贼好用,配合代理IP简直如虎添翼。咱就用自家代理服务ipipgo来演示,手把手教你怎么避开反爬机制。
HTTPX基础操作三连击
先装个库再说:pip install httpx
。基础用法跟requests差不多,但多了异步支持。看这段代码:
import httpx
普通GET请求
with httpx.Client() as client:
response = client.get('https://example.com')
print(response.status_code)
加代理的姿势(重点看这里!)
proxies = "http://用户名:密码@gateway.ipipgo.com:9021"
response = httpx.get("https://ip.ipipgo.com", proxies=proxies)
print(f"当前IP:{response.json()['ip']}")
注意代理地址里的gateway.ipipgo.com是咱们的服务入口,不同套餐端口不一样。用自家服务的好处是IP池够大,自动更换不用操心。
异步请求的正确打开方式
遇到要批量抓取的时候,同步请求能急死人。上异步!看这段神操作:
import asyncio
import httpx
async def fetch(url):
async with httpx.AsyncClient(
proxies="http://user:pass@gateway.ipipgo.com:9021"
) as client:
resp = await client.get(url)
return resp.text
同时开100个请求不卡顿
urls = ["https://example.com/page/{}".format(i) for i in range(100)]
results = asyncio.run(asyncio.gather([fetch(url) for url in urls]))
这里用了ipipgo的长效代理套餐,特别适合这种高频请求场景。记得要用异步客户端,普通客户端会拖后腿。
代理IP实战避坑指南
实际开发中经常遇到的几个坑:
问题现象 | 解决方案 |
---|---|
连接超时 | 切换ipipgo的不同机房节点 |
返回407错误 | 检查账号密码是否带特殊字符 |
响应速度慢 | 开启HTTPX的链路复用功能 |
推荐在代码里加个重试机制,用ipipgo的自动切换IP功能更省事。他们的API支持按失败次数自动换IP,这点对做大规模采集特别友好。
QA时间:高频问题汇总
Q:代理用着用着就失效了咋办?
A:建议使用ipipgo的动态住宅IP套餐,每个请求自动换IP,根本不给对方封禁的机会。
Q:异步请求突然卡住不动了?
A:检查是不是没设置超时参数,HTTPX默认无限等待。加上timeout=30参数就稳了。
Q:需要高匿名代理怎么办?
A:直接选用ipipgo的企业级代理服务,请求头里完全不会暴露代理特征,亲测过某东的严格检测。
终极配置方案
最后放个大招,这是我常用的配置模板:
client = httpx.AsyncClient(
proxies={
"http://": "http://user:pass@gateway.ipipgo.com:9021",
"https://": "http://user:pass@gateway.ipipgo.com:9021"
},
timeout=30.0,
limits=httpx.Limits(max_connections=100),
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
)
这样配置后,用ipipgo的代理做百万级请求都没压力。他们家的IP池更新频率够高,基本不会遇到验证码轰炸的情况。最后提醒下,做数据采集要遵守网站规则,用代理不是为了搞破坏哈。