
最近在搞一个数据采集项目,发现最头疼的不是写爬虫,而是养IP池——每天手动从各种免费网站复制IP,结果一半不能用,另一半用两次就被封了。于是咬咬牙,花了一周时间搞了个自动化系统,现在IP池能自己采集、验证、更新,终于可以安心喝咖啡了。

一、系统长啥样?
简单说,这个系统就像个“IP流水线”:
(画了个粗糙的架构图,凑合看👇)
mermaidgraph TD
A[爬虫/API抓IP] -->|原始数据| B[异步验证]
B -->|可用IP| C[Redis存储]
C -->|调度请求| D[分配IP]
D -->|监控数据| E[告警看板]有些免费代理网站直接提供免费API接口很方便,有些免费代理网站没有API接口,用JavaScript加载数据,普通爬虫抓不到。我的解决方案是用Playwright模拟浏览器操作,就像人一样点开页面、等待加载、复制IP:
http://api.66daili.com/?format=json
免费代理网站API
python# 用Playwright“手动”操作网页(伪代码)
async with browser.new_page() as page:
await page.goto("https://free-proxy-list.net/")
await page.wait_for_selector("table tbody tr") # 等表格加载完
rows = await page.query_selector_all("tr")
for row in rows[1:]: # 跳过表头
ip = await row.query_selector("td:nth-child(1)").text_content()
port = await row.query_selector("td:nth-child(2)").text_content()
proxies.append(f"{ip}:{port}")如果用同步请求一个一个测IP,1000个IP可能要测半小时。改用aiohttp后,单进程就能同时测1000个,5分钟搞定:
python# 异步验证函数(核心逻辑)
async def test_proxy(ip, port):
proxy = f"http://{ip}:{port}"
try:
async with aiohttp.ClientSession(timeout=10) as session:
async with session.get("https://httpbin.org/get", proxy=proxy) as resp:
if resp.status == 200:
return True # 这个IP能用!
except:
return False
# 批量测试(并发1000)
tasks = [test_proxy(ip, port) for ip, port in raw_proxies]
results = await asyncio.gather(*tasks)
valid_proxies = [p for p, ok in zip(raw_proxies, results) if ok]Sorted Set按IP可用率排序,每次取排名靠前的(就像游戏排行榜):bash# 添加IP(分数=可用率*100) ZADD proxies 95 "192.168.1.1:8080" # 取可用率最高的5个IP ZREVRANGE proxies 0 4 WITHSCORES用到的神器:
Playwright:比Selenium快,还能无头浏览器aiohttp:异步HTTP请求库,并发神器Redis:存储和排序IP的利器Prometheus+Grafana:监控IP池健康度(可选)最后说句大实话: 养IP池真的没必要自己造轮子,但自己搞一遍后,你会明白为什么商业IP服务要收那么贵——原来省下的时间都是钱啊!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。