IPIPGO ip代理 python代理ip爬虫代码示例:自动抓取免费代理验证

python代理ip爬虫代码示例:自动抓取免费代理验证

为什么需要自己抓取代理IP? 很多朋友在做数据采集、市场调研或者账号管理时,经常会遇到目标网站封IP的情况。一个请求频率稍微高一点,IP就被限制访问了,工作不得不中断。这时候,大家首先想到的就是去找…

python代理ip爬虫代码示例:自动抓取免费代理验证

为什么需要自己抓取代理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/ipapi.ipify.org。注意不要使用百度等国内网站,因为很多免费代理无法访问国内网络。

Q4:我需要大量、稳定、高质量的代理IP,有什么推荐?
A:对于商业或重要项目,强烈建议使用专业服务。例如ipipgo的代理IP服务。它提供动态和静态住宅代理,IP池巨大,纯净度高,支持按国家、城市精准定位,并且提供灵活的计费方式。特别是他们的TikTok解决方案,采用多国原生纯净IP和独享高速通道,非常适合需要稳定访问TikTok进行直播、运营的商家,能有效提升账号安全性和运营效率。对于需要高稳定性的场景,他们的静态住宅代理具备99.9%的可用性,是长期业务的好选择。

Q5:使用ipipgo的代理和用这个免费爬虫抓的,主要区别在哪?
A:核心区别在于质量、稳定性和服务。免费代理是“公共厕所”,谁都能用,脏乱差且不稳定。ipipgo提供的是“专属通道”,IP纯净、速度快、连接稳定,并且有技术支持和售后服务。对于确保业务连续性和数据安全性来说,这是完全不同的两种投入。

我们的产品仅支持在境外网络环境下使用(除TikTok专线外),用户使用IPIPGO从事的任何行为均不代表IPIPGO的意志和观点,IPIPGO不承担任何法律责任。
IPIPGO-动态住宅ip全新升级

专业国外代理ip服务商—IPIPGO

联系我们

联系我们

13260757327

在线咨询: QQ交谈

邮箱: hai.liu@xiaoxitech.com

工作时间:周一至周五,9:30-18:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部
zh_CN简体中文