python开发实战——ip池

news2024/11/23 8:33:14

前言

代理IP池是一组可用的代理IP地址,用于访问网站或执行其他网络请求。它可以帮助我们在网络请求时隐藏我们的真实IP地址,从而提高网络安全性、匿名性和稳定性。同时,代理IP池还可以通过定时更新和测试代理IP,保证代理IP的有效性和稳定性。

 

本文将介绍如何使用Python编写代理IP池,包括如何获取代理IP、测试代理IP有效性和管理代理IP池等内容。

1. 获取代理IP

获取代理IP的方法有很多种,比如从代理IP提供商购买,或者从免费代理IP网站爬取。在本文中,我们将使用爬虫从免费代理IP网站爬取代理IP。

首先,我们需要选择一个免费代理IP网站,比如`https://www.zdaye.com/`。在该网站中,我们可以找到各种类型的代理IP,如HTTP、HTTPS和SOCKS等。我们可以通过爬虫来获取这些代理IP。

在Python中,我们可以使用requests和BeautifulSoup库来实现爬取代理IP的功能。以下是一个示例代码:

import requests
from bs4 import BeautifulSoup

url = "https://www.zdaye.com/nn/"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
}

response = requests.get(url, headers=headers)

soup = BeautifulSoup(response.text, 'html.parser')

ip_list = soup.select("#ip_list tr")
for ip in ip_list[1:]:
    tds = ip.select("td")
    ip_address = tds[1].text
    ip_port = tds[2].text
    ip_type = tds[5].text.lower()
    print("{0}://{1}:{2}".format(ip_type, ip_address, ip_port))

上述代码中:

  • `url`定义了要爬取的网页地址。
  • `headers`定义了请求头信息,包括`User-Agent`等信息。
  • `requests.get()`函数用于获取网页内容。
  • `soup.select()`函数用于指定CSS选择器来选取网页中的元素。
  • `tds`变量包含了每个代理IP的IP地址、端口号和类型等信息。
  • `print()`函数用于输出每个代理IP的完整信息。

运行上述代码后,可以获取到一些代理IP,但这些代理IP并不一定都是有效的。因此,我们需要测试代理IP的有效性。

2. 测试代理IP的有效性

测试代理IP的有效性是指检查代理IP是否可以正常使用,比如是否可以访问指定的网站。在Python中,我们可以使用requests库来测试代理IP的有效性。

以下是一个测试代理IP的示例代码:

import requests

# 要访问的网站
url = "https://www.baidu.com"

# 代理IP
proxies = {
    "http": "http://117.91.138.139:9999",
    "https": "https://117.91.138.139:9999",
}

# 请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
}

try:
    response = requests.get(url, proxies=proxies, headers=headers, timeout=5)
    if response.status_code == 200:
        print("Valid proxy:", proxies)
    else:
        print("Invalid proxy:", proxies)
except:
    print("Invalid proxy:", proxies)

上述代码中:

  • `url`定义了要访问的网站。
  • `proxies`定义了要测试的代理IP地址和端口号。
  • `requests.get()`函数用于发送GET请求。
  • `response.status_code`用于获取响应的状态码,如果是200,则说明代理IP有效。
  • `timeout`参数用于设置请求超时时间。
  • `try-except`语句用于捕获异常,如果发生异常,则说明代理IP无效。

使用以上方法爬取代理IP并测试后可以得到一些有效的代理IP。但由于代理IP的有效期很短,而且有些代理IP可能会因为多次请求导致被封禁,因此我们需要定时更新代理IP池。

3. 管理代理IP池

管理代理IP池是指将获取到的代理IP存储在一个容器中,并定时更新这个容器中的代理IP。在Python中,我们可以使用列表或数据库来存储代理IP。

以下是一个使用列表管理代理IP池的示例代码:

import time
import requests
from bs4 import BeautifulSoup

url = "https://www.zdaye.com/nn/"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
}

# 代理IP池
proxy_pool = []

def get_proxies():
    global proxy_pool

    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    ip_list = soup.select("#ip_list tr")

    for ip in ip_list[1:]:
        tds = ip.select("td")
        ip_address = tds[1].text
        ip_port = tds[2].text
        ip_type = tds[5].text.lower()
        proxy = "{0}://{1}:{2}".format(ip_type, ip_address, ip_port)

        # 测试代理IP是否有效
        if test_proxy(proxy):
            proxy_pool.append(proxy)

def test_proxy(proxy):
    # 要访问的网站
    url = "https://www.baidu.com"

    # 代理IP
    proxies = {
        "http": proxy,
        "https": proxy,
    }

    # 请求头信息
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
    }

    try:
        response = requests.get(url, proxies=proxies, headers=headers, timeout=5)
        if response.status_code == 200:
            return True
        else:
            return False
    except:
        return False

def update_proxies():
    global proxy_pool

    while True:
        # 每隔5分钟更新一次代理IP池
        time.sleep(5 * 60)

        # 更新代理IP池
        proxy_pool = []
        get_proxies()

if __name__ == '__main__':
    # 启动更新代理IP池的线程
    t = threading.Thread(target=update_proxies)
    t.start()

    # 使用代理IP访问网站
    while True:
        if len(proxy_pool) > 0:
            proxy = random.choice(proxy_pool)
            proxies = {
                "http": proxy,
                "https": proxy,
            }
            response = requests.get(url, proxies=proxies, headers=headers, timeout=5)
            if response.status_code == 200:
                print(response.text)
                time.sleep(5)
        else:
            time.sleep(1)

上述代码中:

  • `proxy_pool`列表用于存储代理IP。
  • `get_proxies()`函数用于获取代理IP并添加到`proxy_pool`列表中。
  • `test_proxy()`函数用于测试代理IP是否有效。
  • `update_proxies()`函数用于定时更新`proxy_pool`列表中的代理IP。
  • `time.sleep()`函数用于设置线程的睡眠时间。
  • `random.choice()`函数用于随机选择一个代理IP。
  • `response.status_code == 200`用于检查响应的状态码,如果是200,则说明代理IP有效。

运行上述代码后,可以看到代理IP池中的代理IP会随着时间的推移而不断地更新,并且可以正常使用。

总结

本文介绍了如何使用Python编写代理IP池,包括如何获取代理IP、测试代理IP有效性和管理代理IP池等内容。通过学习本文,您可以更好地了解代理IP的基本概念和实现方法,从而更好地应用代理IP来爬取数据或保护个人隐私。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#生成dll给c++调用 方法二COM方式 vs2022 NO Make Assembly COM-Visible选错了 不需要clr

有些C项目中也用了C语言.c,用方法一就无法使用【不能使用 /clr 选项编译 C 文件】。就用方法2。 方法二:COM方式 参考: https://www.5axxw.com/questions/content/2ozion 1.C# 生成dll using System; using System.Collections.Generic; using System.Linq; usin…

【Linux多线程】基于生产消费模型写的一个实例(附源代码+讲解)

生产消费模型 生产消费模型为何要使用生产者消费者模型生产者消费者模型优点 基于BlockingQueue的生产者消费者模型BlockQueue.cc代码解释 BlockQueue.hpp代码解释 Makefile代码解释 Task.hpp代码解释 生产消费模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个…

tdengine入门详解

TDengine是什么? TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB), 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计,基于C语言开发。 什么是时序数据库?时序数据产生…

三元运算符引发的自动拆装箱问题

文章目录 问题背景问题排查排查过程问题扩展总结 问题背景 生产环境上出现空指针异常,追踪报错位置得知以下代码报错 if (isNull(aiGroup)) {return null;}aiGroup.setNum(isNull(param.getNum()) ? aiGroup.getNum() : param.getNum().doubleValue());问题排查 …

1500-2000元预算性价比吉他推荐,雅马哈FG800和VEAZEN费森VZ90怎么选?评测对比哪一款更适合初学者入门选购!

在2000元价位入门进阶吉他圈里,可谓是群雄角逐,Yamaha 雅马哈入门级FG800系列和VEAZEN 费森VZ90系列是一直都很热销的面单吉他型号,初学者想要在其中挑选出一把合适自己的吉他还是有点难度的。 那么,今天就以它们为本期的评测主角…

企业级高负载web服务器-Tomcat小项目

目录 web静态动态页面区别安装java环境安装Tomcat安装Tomcat包到目录查看Tomcat主目录结构查看Tomcat配置目录结构Tomcat管理Tomcat web管理功能 部署jpress应用 web静态动态页面区别 静态页面: 在网站设计中,纯粹HTML格式的网页(可以包含图…

后端整理(JVM、Redis、反射)

1. JVM 文章仅为自身笔记 详情查看一篇文章掌握整个JVM,JVM超详细解析!!! 1.1 什么是JVM jvm是Java虚拟机 1.2 Java文件的编译过程 程序员编写代码形成.java文件经过javac编译成.class文件再通过JVM的类加载器进入运行时数据…

MFC、Qt、WPF?该用哪个?

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(Microsoft Foundation Class)是微软提供的框架,使用C编写,主要用于Windows…

蔚小理新势力互联网造车在CAN FD硬件主框架及后装控制方案开发

在国内,新势力造车影响已经非常之大,整个造车大潮中,新整车企业蔚来汽车、小鹏汽车、理想汽车无一例外选择了CAN FD作为主要的车载通信总线,特斯拉推出了引领汽车EE架构集中化的趋势,即使在车载以太网EE架构快速发展的…

BES 平台 SDK之充电盒与耳塞串口单工通信

本文章是基于BES2700 芯片,其他BESxxx 芯片可做参考,如有不当之处,欢迎评论区留言指出。仅供参考学习用! BES 平台 SDK之主从耳组队_谢文浩的博客-CSDN博客 关于系统主从耳组队流程可参考上一篇文章。链接如上所示! …

初识集合和背后的数据结构

目录 集合 Java集合框架 数据结构 算法 集合 集合,是用来存放数据的容器。其主要表现为将多个元素置于一个单元中,用于对这些元素进行增删查改。例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)。 Java中有很多种集…

捷码低代码|Modal模态框组件详解

知识补充: 模态组件是一种在用户界面中显示的特殊类型的组件。它们被设计为在应用程序的其他部分被屏蔽或暂停的情况下引导用户完成一个特定的任务或交互。 常见的模态组件包括: 1、弹出窗口(Popup):弹出窗口是一种常见…

Unity中UGUI的 OnPopulateMesh函数与VertexHelper类

Graphics类 当一个UGUI的UI元素生成顶点数据时会调用Graphics类中的 OnPopulateMesh(VertexHelper vh) 函数,我们可以在这个函数中修改顶点的数据或者获取顶点的数据。 UGUI中与显示相关的控件,例如Image、Text、RawImage等都继承自MaskableGraphic类&a…

正则替换windows文件名禁用的特殊字符

背景&#xff1a; windows文件名中不能出现以下提示的特殊字符&#xff0c;因此需要提前替换处理。 解决&#xff1a; // 替换\/:*?"<>|为空 fileName.replaceAll("[\\\\/:*?\"<>|]", "");

Boost开发指南-3.9object_pool

object_pool object_pool是用于类实例&#xff08;对象&#xff09;的内存池&#xff0c;它的功能与pool类似&#xff0c;但会在析构时对所有已经分配的内存块调用析构函数&#xff0c;从而正确地释放资源。 object_pool位于名字空间boost&#xff0c;为了使用object_pool组件…

千元级入门单板吉他推荐,SAGA萨伽SF700、VEAZEN费森VZ200、布鲁克V12、恩雅X1PRO全方面评测对比,哪一款更值得购买!

很多吉他初学者的预算不多&#xff0c;就想要选购平价又好用的吉他&#xff0c;这个想法是很正确的。初学者要注意的是这种平价且高性价比的吉他需要仔细挑选&#xff0c;太便宜的合板吉他保证不了原材料的品质和制作工艺要求&#xff0c;音准手感都无法保证&#xff0c;那么这…

云主机秘钥泄露及利用

前言&#xff1a; 云平台作为降低企业资源成本的工具&#xff0c;在当今各大公司系统部署场景内已经成为不可或缺的重要组成部分&#xff0c;并且由于各类应用程序需要与其他内外部服务或程序进行通讯而大量使用凭证或密钥&#xff0c;因此在漏洞挖掘过程中经常会遇到一类漏洞&…

时间复杂度、空间复杂度实践练习(力扣OJ)

目录 文章目录 前言 题目一&#xff1a;轮转数组 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 题目二&#xff1a;消失的数字 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 题目三&#xff1a;移除元素 思路&#xff1a; 总结 前言 想要编写高效的…

2023年第四届“华数杯”数学建模思路 - 案例:随机森林

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff1f; 随机森林属于 集成学习 中的 Bagging&#xff08;Bootstrap AGgregation 的简称&#xff09; 方法。如果用图来表示他们之…

【技术分享】SSD20X USB摄像头使用

本文主要介绍基于Purple Pi R1演示如何配置USB摄像头&#xff0c;此方法适用于SSD201/202全系列产品。 Purple Pi R1主板&#xff0c;是基于 SigmaStar SSD201 SoC&#xff08;ARM Cortex A7 内核&#xff09;兼容树莓派的开发板&#xff0c;主频高达1.2GHz&#xff0c;256KB …