Python爬虫:多线程收集/验证IP从而搭建有效IP代理池

一、前言

在网络爬虫中,IP代理池的作用非常重要。网络爬虫需要大量的IP地址来发送请求,同时为了降低被封禁的风险,使用代理IP来发送请求也是一个不错的选择。但是由于代理IP的性质,代理IP的可用性非常低,需要经常更新和验证。因此,本文介绍如何使用Python实现一个多线程的IP代理池,以便于我们在爬虫中使用。

二、IP池的实现

  1. 收集代理IP

我们可以从各大免费IP代理网站上获取代理IP。具体获取方法可以通过网页分析获取代理IP的API接口,然后使用Python的requests库发送请求获取代理IP的列表。获取的代理IP可以通过保存到文件中或者直接保存到数据库中,在使用时需要进行解析。

下面是一个从站大爷免费代理网站获取代理IP的代码:

import requests
from lxml import etree

# 获取代理IP的函数
def get_proxies():
    url = 'https://www.zdaye.com/free/'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
    response = requests.get(url, headers=headers)
    html = etree.HTML(response.text)
    trs = html.xpath('//table[@id="ip_list"]//tr')[1:]  # 去除表头
    proxies = []
    for tr in trs:
        ip = tr.xpath('.//td[2]/text()')[0]  # IP
        port = tr.xpath('.//td[3]/text()')[0]  # 端口
        proxies.append(f'http://{ip}:{port}')
    return proxies
  1. 验证代理IP可用性

代理IP的可用性很难保证,因此我们需要通过验证来筛选可用的代理IP。验证代理IP的方法可以通过发送一个请求来判断代理IP是否能够正常工作。如果代理IP无法正常工作,则需要将其从代理IP池中删除。下面是一个验证代理IP可用性的代码:

python
复制代码
import requests

# 验证代理IP的可用性
def verify_proxies(proxy):
    url = 'http://httpbin.org/get'
    try:
        response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=5)
        if response.status_code == 200:
            return True
        else:
            return False
    except:
        return False
  1. 搭建IP代理池

在IP池中,我们需要保存可用的代理IP。可以使用列表或者队列的方式来保存代理IP。当池中可用的代理IP数量低于一定阈值时,需要重新获取新的代理IP并验证,保证代理IP池中的可用代理数量不低于一定阈值。下面是一个简单的IP代理池的代码:

python
复制代码
import threading
import time

class ProxyPool:
    def __init__(self, threshold=10):
        self.proxies = []  # 代理IP列表
        self.threshold = threshold  # 可用代理IP阈值
        self.lock = threading.Lock()  # 线程锁

    # 获取可用代理IP
    def get_proxy(self):
        while True:
            self.lock.acquire()  # 加锁
            try:
                if len(self.proxies) < self.threshold:
                    self.update_proxy()  # 更新代理IP
                if len(self.proxies) > 0:
                    proxy = self.proxies.pop()  # 弹出代理IP
                    if verify_proxies(proxy):  # 验证代理IP是否可用
                        print(f'使用代理IP: {proxy}')
                        return proxy
            finally:
                self.lock.release()  # 解锁

    # 更新代理IP
    def update_proxy(self):
        new_proxies = get_proxies()
        for proxy in new_proxies:
            self.lock.acquire()  # 加锁
            try:
                if proxy not in self.proxies:
                    self.proxies.append(proxy)
            finally:
                self.lock.release()  # 解锁

# 测试
p = ProxyPool(5)  # 初始化代理IP池,可用代理IP的阈值为5
while True:
    p.get_proxy()
    time.sleep(1)

三、多线程实现

在实际的网络爬虫中,需要同时发送多个请求,这就需要使用多线程来实现并发。多线程可以极大地提高爬虫的效率,尤其是在获取代理IP时,可以同时获取多个代理IP,从而进一步提高获取代理IP的速度。

下面是一个多线程的代理IP池的代码:

python
复制代码
import threading
import time

class ProxyPool:
    def __init__(self, threshold=10):
        self.proxies = []  # 代理IP列表
        self.threshold = threshold  # 可用代理IP阈值
        self.lock = threading.Lock()  # 线程锁

    # 获取可用代理IP
    def get_proxy(self):
        while True:
            self.lock.acquire()  # 加锁
            try:
                if len(self.proxies) < self.threshold:
                    self.update_proxy()  # 更新代理IP
                if len(self.proxies) > 0:
                    proxy = self.proxies.pop()  # 弹出代理IP
                    if verify_proxies(proxy):  # 验证代理IP是否可用
                        print(f'使用代理IP: {proxy}')
                        return proxy
            finally:
                self.lock.release()  # 解锁

    # 更新代理IP
    def update_proxy(self):
        new_proxies = get_proxies()
        threads = []  # 线程列表
        for proxy in new_proxies:
            thread = threading.Thread(target=self.verify_proxy, args=(proxy,))  # 创建新的线程
            threads.append(thread)
            thread.start()  # 启动线程
        for thread in threads:
            thread.join()  # 等待线程结束

    # 验证代理IP的可用性
    def verify_proxy(self, proxy):
        if verify_proxies(proxy):
            self.lock.acquire()  # 加锁
            try:
                if proxy not in self.proxies:
                    self.proxies.append(proxy)
            finally:
                self.lock.release()  # 解锁

# 测试
p = ProxyPool(5)  # 初始化代理IP池,可用代理IP的阈值为5
while True:
    p.get_proxy()
    time.sleep(1)

在上面的代码中,我们在更新代理IP时,为每个代理IP创建了一个新的线程。这样可以让更新代理IP的操作并发处理,从而提高获取代理IP的效率。

四、代理IP的使用

在使用代理IP时,我们需要将代理IP配置在请求头中,从而让HTTP请求使用代理IP进行请求。下面是一个使用代理IP发送HTTP请求的代码:

python
复制代码
import requests

p = ProxyPool(5)  # 初始化代理IP池,可用代理IP的阈值为5
while True:
    proxy = p.get_proxy()
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, headers=headers, proxies=proxies, timeout=5)
    print(response.text)
    time.sleep(1)

在上面的代码中,我们将获取的代理IP配置到requests库的proxies参数中,从而使用代理IP发送请求。

五、总结

在本文中,我们介绍了如何使用Python实现一个多线程的IP代理池,以便于我们在网络爬虫中使用代理IP。通过使用代理IP,我们可以增加发送请求的IP数量,从而提高爬虫的效率,同时降低被封禁的风险。但是由于代理IP的可用性较低,需要经常更新和验证。因此,需要定期获取新的代理IP,并验证其可用性。同时,在实际的网络爬虫中,需要同时发送多个请求,这就需要使用多线程来实现并发。

在使用代理IP时,我们需要将代理IP配置在HTTP请求头中,从而让HTTP请求使用代理IP进行请求。但是需要注意,代理IP并不是绝对可靠的,有可能代理IP的服务器在使用过程中会出现故障或者被封禁。因此,在网络爬虫中使用代理IP时,需要做好容错处理,当代理IP无法使用时,及时更换代理IP或者等待代理IP恢复使用。同时,还需要对代理IP的有效性进行定期检测和更新。

总之,通过使用一个多线程的IP代理池,可以大大提高网络爬虫的效率和稳定性,有效降低被封禁的风险,是网络爬虫中不可缺少的一个重要工具。

如果你对Python感兴趣的话,可以试试我整理的这份Python全套学习资料,微信扫描下方二维码免费领取

包括:Python永久使用安装包、Python web开发,Python,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!
在这里插入图片描述

零基础Python学习资源介绍

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python学习软件

工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
在这里插入图片描述

三、Python入门学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

四、Python练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

五、Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~在这里插入图片描述

六、Python面试资料

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

七、资料领取

上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码输入“领取资料”免费领取!!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据链路层协议

文章目录 一.链路层解决的问题二.以太网协议1.认识以太网2.以太网帧格式3.认识MAC地址4.对比理解MAC地址和IP地址5.认识MTU6.MTU对IP协议的影响7.MTU对UDP协议的影响8.MTU对TCP协议的影响9.数据跨网络传输的过程 二.ARP协议1.ARP协议的作用2.ARP数据的格式3.ARP协议的工作流程 …

最新AIGC创作系统ChatGPT系统源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图,图片对话理解功能

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

印刷企业数字工厂管理系统建设方案

随着科技的飞速发展&#xff0c;传统印刷企业正面临着前所未有的挑战。产能短缺、质量控制不足、成本控制不力以及服务质量不高等问题成为了制约企业发展的瓶颈。为了解决这些问题&#xff0c;印刷企业需要积极拥抱数字化转型&#xff0c;构建数字工厂管理系统。 一、印刷企业数…

C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))

题目描述 Redraiment小时候走路喜欢蹦蹦跳跳&#xff0c;他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶&#xff0c;请你计算一下Redraiment从第0阶到第N阶共有几种走法。 输入&#xff1a;输入包括多组数据。 每组数据包括一…

集成GPT-4的Cursor智能代码生成器,如何免费使用?

Cursor是一个集成了 GPT-4 的国内直接可以访问的&#xff0c;优秀而强大的免费代码生成器&#xff0c;可以帮助你快速编写、编辑和讨论代码。 它支持多种编程语言&#xff0c;如 Python, Java, C#, JavaScript 等&#xff0c;并且可以根据你的输入和需求自动生成代码片段。 Cur…

视频集中存储EasyCVR平台使用海康SDK,播放出现串流情况是什么原因?

视频监控平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码H.264、平台级联等。为了便于用户二次开发、调用与集成&#xff0c;我…

腾讯云COS+picgo+typora 图床搭建与自动上传

1、腾讯云 COS 腾讯云活动 COS新用户专享 COS 操作步骤 1、点击 创建桶&#xff0c;完善信息 点击下一步&#xff0c;剩下的配置可自己配置 2、picgo 官网地址 2.3.1版本下载地址 现在稳定版本是2.3.1 相关连接 腾讯云密钥设置地址picgo官网地址2.3.1版本下载地址

报错注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

php字符串处理函数的使用

php字符串处理函数的使用 trim() trim()函数的功能用于去除字符串首尾的空白字符(包括空格、制表符、换行符等&#xff09;。它可以用于清理用户输入的数据或去除字符串中的多余空格。 <?php $char" holle world! ";echo trim($char) ?>str_repl…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构&#xff0c;该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标&#xff0c;Tiva™C系列架构提供了一个具有FPU的80…

pr视频剪辑素材,免费下载

找剪辑素材就上这几个网站&#xff0c;视频、音效、图片素材都非常齐全&#xff0c;还能免费下载&#xff0c;赶紧收藏起来。 视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#x…

CNP实现应用CD部署

上一篇整体介绍了cnp的功能&#xff0c;这篇重点介绍下CNP产品应用开发的功能。 简介 CNP的应用开发&#xff0c;主要是指的应用CD部署的配置管理。 应用列表&#xff0c;用来创建一个应用&#xff0c;一般与项目对应&#xff0c;也可以多个应用对应到一个项目。具体很灵活。…

【Python】可再生能源发电与电动汽车的协同调度策略研究

1 主要内容 之前发布了《可再生能源发电与电动汽车的协同调度策略研究》matlab版本程序&#xff0c;本次发布的为Python版本&#xff0c;采用gurobi作为求解器&#xff0c;有需要的可以下载对照学习研究。 首先详细介绍了优化调度模型的求解方案&#xff0c;分别采用二次规划…

WPF TextBox实现placeholder

WPF里TextBox没有placeholder&#xff0c;需要自己实现&#xff0c;本篇博客介绍WPF TextBox实现placeholder&#xff0c;效果如下&#xff1a; 实现技巧是在 TextBox 控件的 Style 中使用触发器&#xff08;Triggers&#xff09;来显示和隐藏placeholder文本。xmal代码如下&am…

虾皮网同行数据丨虾皮数据工具-知虾:监控竞争对手数据的利器

在如今的电商竞争激烈的市场中&#xff0c;了解竞争对手的销售情况和策略对于制定自己的营销策略至关重要。虾皮网作为一家知名的电商平台&#xff0c;提供了一款强大的同行数据工具-知虾&#xff0c;可以帮助卖家监控竞争对手的数据&#xff0c;为自己的业务发展提供有力支持。…

部署Kubernetes Dashboard

Dashboard简介 Dashboard 是基于网页的 Kubernetes 用户界面。 可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 Dashboard创建 #创建pods kubectl apply -f https://raw.githubusercontent.com/kub…

动手学深度学习(三)---Softmax回归

文章目录 一、理论知识 softmax回归 一、理论知识 回归估计一个连续值分类预测一个离散类别 回归单连续数值输出自然区间R跟真实值的区别作为损失 分类通常多个输出输出i是预测为第i类的置信度 一般我们使用交叉熵用来衡量两个概率的区别 将它作为损失 其梯度是真实概率和…

重磅解读 | 阿里云 云网络领域关键技术创新

云布道师 10 月 31 日&#xff0c;杭州云栖大会&#xff0c;阿里云技术主论坛带来了一场关于阿里云主力产品与技术创新的深度解读&#xff0c;阿里云网络产品线负责人祝顺民带来《云智创新&#xff0c;网络随行》的主题发言&#xff0c;针对阿里云飞天洛神云网络&#xff08;下…

CMake 判断操作系统类型

上回的CMakeLists.txt里面有一句,if (WIN32)......endif(WIN32); 根据资料,这是判断操作系统是否是Windows; 下面单独看一下; 一个CMakeLists.txt文件如下; if(WIN32)# 如果是 Windowsmessage("当前操作系统为 Windows") elseif(UNIX AND NOT APPLE)# 如果…

【Mysql学习笔记】- 2 多表查询

一、加强查询 where子句&#xff0c;oder by子句 -- 查询加强 -- ■ 使用where子句 -- ?如何查找1992.1.1后入职的员工 -- 老师说明&#xff1a; 在mysql中,日期类型可以直接比较, 需要注意格式 SELECT * FROM empWHERE hiredate > 1992-01-01 -- ■ 如何使用like操作符…