
为什么需要自己抓取代理IP?
很多朋友在做数据采集、市场调研或者账号管理时,经常会遇到目标网站封IP的情况。一个请求频率稍微高一点,IP就被限制访问了,工作不得不中断。这时候,大家首先想到的就是去找免费的代理IP来用。网上确实有很多网站提供免费代理列表,但这些IP质量参差不齐,大部分可能已经失效,或者速度极慢,直接拿来用非常耽误事。学会写一个简单的爬虫,自动从这些网站抓取IP,并立即验证其可用性,就成了一项很实用的技能。它能帮你快速建立一个临时可用的IP池,应对一些轻量级、短时间的需求。
核心思路:抓取、验证、存储
整个流程可以分成三步走,就像一条流水线。第一步,爬虫去几个知名的免费代理发布页,把上面列出的IP和端口号抓取下来。第二步,也是最关键的一步,不能假设抓到的IP都是好的,必须立即进行验证。验证方法就是让这个代理IP去访问一个能快速返回你本机IP的网站(比如httpbin.org/ip),如果成功返回了代理IP的地址而不是你本机的真实IP,并且速度在可接受范围内,那这个代理就是有效的。第三步,把验证通过的IP存起来,可以存到文件里,也可以存到数据库,方便后续的程序调用。
Python代码实战:一步步构建爬虫
下面我们用Python来实现这个想法。我们会用到requests库来发送网络请求,用BeautifulSoup库来解析网页提取IP,用concurrent.futures库来并发验证,提高效率。请确保事先安装好这些库:pip install requests beautifulsoup4。
import requests
from bs4 import BeautifulSoup
import concurrent.futures
import time
步骤1:从多个来源抓取代理IP列表
def fetch_proxy_list():
proxy_sources = [
'https://www.free-proxy-list.net/',
'https://www.sslproxies.org/',
可以添加更多免费代理源,注意遵守网站的robots.txt
]
proxies = []
headers = {'User-Agent': 'Mozilla/5.0'} 模拟浏览器访问
for url in proxy_sources:
try:
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
以free-proxy-list为例,解析表格数据
table = soup.find('table', {'id': 'proxylisttable'})
if table:
for row in table.tbody.find_all('tr'):
cols = row.find_all('td')
if len(cols) > 6:
ip = cols[0].text.strip()
port = cols[1].text.strip()
简单过滤,只取HTTP/HTTPS且非透明代理
if cols[4].text.strip() == 'elite proxy' or cols[6].text.strip() == 'yes':
proxies.append(f"{ip}:{port}")
print(f"从 {url} 抓取了 {len(proxies)} 个代理。")
time.sleep(2) 礼貌性延迟,避免对目标网站造成压力
except Exception as e:
print(f"抓取 {url} 时出错: {e}")
continue
return list(set(proxies)) 去重
步骤2:验证单个代理IP是否可用
def validate_proxy(proxy):
test_url = "http://httpbin.org/ip"
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}", 注意:很多免费代理只支持HTTP
}
try:
start = time.time()
设置较短超时时间,快速淘汰慢速代理
resp = requests.get(test_url, proxies=proxies, timeout=5)
end = time.time()
if resp.status_code == 200:
result_ip = resp.json().get('origin')
检查返回的IP是否确实是代理IP(简单验证)
if proxy.split(':')[0] in result_ip:
speed = round((end - start) 1000, 2) 计算响应时间(毫秒)
print(f"代理 {proxy} 验证成功,延迟 {speed}ms")
return (proxy, speed)
except (requests.exceptions.ProxyError,
requests.exceptions.ConnectTimeout,
requests.exceptions.ReadTimeout,
requests.exceptions.SSLError,
requests.ConnectionError):
捕获所有与代理连接相关的异常,说明代理不可用
pass
return None
步骤3:主函数,并发验证并保存结果
def main():
print("开始抓取免费代理IP...")
raw_proxies = fetch_proxy_list()
print(f"共抓取到 {len(raw_proxies)} 个原始代理。")
print("开始并发验证代理IP...")
valid_proxies = []
使用线程池并发验证,max_workers根据自己网络情况调整
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
future_to_proxy = {executor.submit(validate_proxy, proxy): proxy for proxy in raw_proxies}
for future in concurrent.futures.as_completed(future_to_proxy):
result = future.result()
if result:
valid_proxies.append(result)
按速度排序
valid_proxies.sort(key=lambda x: x[1])
print(f"验证完毕!共找到 {len(valid_proxies)} 个有效代理。")
步骤4:将有效代理保存到文件
with open('valid_proxies.txt', 'w') as f:
for proxy, speed in valid_proxies:
f.write(f"{proxy} {speed}ms")
print("有效代理已保存至 'valid_proxies.txt'。")
打印最快的前5个
print("最快的前5个代理:")
for proxy, speed in valid_proxies[:5]:
print(f" {proxy} - {speed}ms")
if __name__ == '__main__':
main()
免费代理的局限性及专业解决方案
通过上面的代码,你确实能筛出一小部分可用的免费代理。但你必须了解它们的局限性:不稳定、速度慢、匿名性差、可用率极低。它们可能几分钟后就失效了,而且很多网站能轻易识别并屏蔽这些公共代理IP。如果你的业务对IP的稳定性、速度、纯净度有要求,比如需要长时间运行爬虫、管理多个社交媒体账号(如TikTok店铺运营)、进行电商价格监控等,那么依赖免费代理几乎是不可行的。
这时候,你就需要一个专业的代理IP服务。比如ipipgo,它提供高质量的住宅代理IP。它的IP来自真实的家庭网络,覆盖非常多国家,目标网站很难将其识别为代理,因此匿名性和成功率要高得多。这对于需要模拟真实用户访问、规避反爬机制的场景至关重要。
常见问题QA
Q1:我运行代码后,一个有效代理都没找到,是哪里出错了?
A:这很正常。免费代理的失效速度非常快,可能你抓取的列表在验证时已经全部失效了。可以尝试增加更多的免费代理源,或者在网络条件更好的环境下(如海外服务器)运行验证。这也恰恰说明了免费代理不可靠。
Q2:如何将验证好的代理用于我的爬虫项目?
A:将保存的valid_proxies.txt文件读入程序,构建一个代理列表。在发送请求时,使用random.choice()随机选取一个代理,或者实现简单的轮询机制。记得要在你的爬虫代码中加入异常处理,当某个代理失败时自动更换。
Q3:代码中的验证网站httpbin.org/ip可以用别的吗?
A:可以。原则是找一个能快速、直接返回你访问IP的接口。你也可以用ipinfo.io/ip或api.ipify.org。注意不要使用百度等国内网站,因为很多免费代理无法访问国内网络。
Q4:我需要大量、稳定、高质量的代理IP,有什么推荐?
A:对于商业或重要项目,强烈建议使用专业服务。例如ipipgo的代理IP服务。它提供动态和静态住宅代理,IP池巨大,纯净度高,支持按国家、城市精准定位,并且提供灵活的计费方式。特别是他们的TikTok解决方案,采用多国原生纯净IP和独享高速通道,非常适合需要稳定访问TikTok进行直播、运营的商家,能有效提升账号安全性和运营效率。对于需要高稳定性的场景,他们的静态住宅代理具备99.9%的可用性,是长期业务的好选择。
Q5:使用ipipgo的代理和用这个免费爬虫抓的,主要区别在哪?
A:核心区别在于质量、稳定性和服务。免费代理是“公共厕所”,谁都能用,脏乱差且不稳定。ipipgo提供的是“专属通道”,IP纯净、速度快、连接稳定,并且有技术支持和售后服务。对于确保业务连续性和数据安全性来说,这是完全不同的两种投入。

