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

目录

一、前言

二、IP池的实现

1. 收集代理IP

2. 验证代理IP可用性

3. 搭建IP代理池

三、多线程实现

四、代理IP的使用

五、总结


一、前言

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

二、IP池的实现

1. 收集代理IP

我们可以从各大免费IP代理网站上获取代理IP。具体获取方法可以通过网页分析获取代理IP的API接口,然后使用Python的requests库发送请求获取代理IP的列表。获取的代理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]  # IPport = tr.xpath('.//td[3]/text()')[0]  # 端口proxies.append(f'http://{ip}:{port}')return proxies
2. 验证代理IP可用性

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

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 Trueelse:return Falseexcept:return False
3. 搭建IP代理池

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

import threading
import timeclass ProxyPool:def __init__(self, threshold=10):self.proxies = []  # 代理IP列表self.threshold = threshold  # 可用代理IP阈值self.lock = threading.Lock()  # 线程锁# 获取可用代理IPdef get_proxy(self):while True:self.lock.acquire()  # 加锁try:if len(self.proxies) < self.threshold:self.update_proxy()  # 更新代理IPif len(self.proxies) > 0:proxy = self.proxies.pop()  # 弹出代理IPif verify_proxies(proxy):  # 验证代理IP是否可用print(f'使用代理IP: {proxy}')return proxyfinally:self.lock.release()  # 解锁# 更新代理IPdef 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池的代码:

import threading
import timeclass ProxyPool:def __init__(self, threshold=10):self.proxies = []  # 代理IP列表self.threshold = threshold  # 可用代理IP阈值self.lock = threading.Lock()  # 线程锁# 获取可用代理IPdef get_proxy(self):while True:self.lock.acquire()  # 加锁try:if len(self.proxies) < self.threshold:self.update_proxy()  # 更新代理IPif len(self.proxies) > 0:proxy = self.proxies.pop()  # 弹出代理IPif verify_proxies(proxy):  # 验证代理IP是否可用print(f'使用代理IP: {proxy}')return proxyfinally:self.lock.release()  # 解锁# 更新代理IPdef 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请求的代码:

import requestsp = 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代理池,可以大大提高网络爬虫的效率和稳定性,有效降低被封禁的风险,是网络爬虫中不可缺少的一个重要工具。

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

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

相关文章

史上最全 结构型模式之 桥接 外观 组合 享元模式

史上最全 结构型模式之 代理 适配器 装饰者 模式-CSDN博客 5.4 桥接模式 5.4.1 概述 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系&#xff1a; 我们可以发现有很多的类&#xff0c;假…

colab切换目录的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

0基础学习VR全景平台篇 第106篇:认识调色软件Lightroom

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 正式开讲之前需要先引出一个概念&#xff1a;到底什么是调色? 比如说上面这张照片&#xff0c;你可能会具体的指出照片中的元素有天空、山脉、草地等…… 如果我们跳出我们的固…

第83步 时间序列建模实战:Catboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍Catboost回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

Android Fragment中使用Arouter跳转到Activity后返回Fragment不回调onActivityResult

Fragment中通过路由跳转到Activity 跳转传递参数 通过Arouter跳转 Postcard postcard ARouter.getInstance().build(RouterConstant.ACTION_TRANSMANAGERACTIVITY1);Bundle bundle new Bundle();bundle.putInt("code", 404);postcard.with(bundle); //设置bundlef…

如何查看端口占用(windows,linux,mac)

如何查看端口占用&#xff0c;各平台 一、背景 如何查看端口占用&#xff1f;网上很多&#xff0c;但大多直接丢出命令&#xff0c;没有任何解释关于如何查看命令的输出 所谓 “查端口占用”&#xff0c;即查看某个端口是否被某个程序占用&#xff0c;如果有&#xff0c;被哪…

Vuex的使用,详细易懂

目录 一.前言 二.Vuex的简介 三.vuex的使用 3.1 安装Vuex 3.2 使用Vuex的步骤&#xff1a; 四.vuex的存值取值&#xff08;改变值&#xff09; 五.vuex的异步请求 好啦&#xff0c;今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.前言 今天我们继续前面的E…

导引服务机器人 通用技术条件

声明 本文是学习GB-T 42831-2023 导引服务机器人 通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 检验规则 6.1 检验项目 检验分为型式检验和出厂检验。检验项目见表2。 表 2 检验项目 序号 检验项目 技术要求 检验方法 出厂检验 型…

天锐绿盾加密软件——企业数据防泄密-CAD图纸、文档、源代码加密管理系统@德人合科技

天锐绿盾是一款专门为企业提供数据防泄密和文档加密管理的软件。该软件通过加密技术保护企业的核心数据&#xff0c;防止数据泄露和侵权行为&#xff0c;同时提供了全方位的文档加密管理系统&#xff0c;实现了对企业数据的安全保障和有效管理。 PC访问地址&#xff1a; isite…

睿趣科技:抖音店铺怎么取名受欢迎

抖音作为国内最大的短视频平台&#xff0c;其商业价值不容忽视。许多商家和创作者都在抖音上开设了自己的店铺&#xff0c;而一个富有创意和吸引力的店铺名字&#xff0c;往往能带来更多的客流量。那么&#xff0c;如何为抖音店铺取个好名字呢?以下是一些有用的建议。 明确定位…

【MATLAB源码-第44期】基于matlab的2*2MIMO-LDPC系统的误码率仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 2x2 MIMO&#xff08;多输入多输出&#xff09;和LDPC&#xff08;低密度奇偶校验码&#xff09;编码是在通信系统中常用的技术&#xff0c;它们通常用于提高无线通信系统的性能和可靠性。 1. 2x2 MIMO&#xff1a; 2x2 MIMO…

【RabbitMQ 实战】09 客户端连接集群生产和消费消息

一、部署一个三节点集群 下面的链接是最快最简单的一种集群部署方法 3分钟部署一个RabbitMQ集群 上的的例子中&#xff0c;没有映射端口&#xff0c;所以没法从宿主机外部连接容器&#xff0c;下面的yml文件中&#xff0c;暴露了端口。 每个容器应用都映射了宿主机的端口&…

Vscode进行远程开发

之前用的是pycharm&#xff0c;但是同事说pycharm太重了&#xff0c;连接远程服务器的时候给远程服务器的压力比较大&#xff0c;有时候远程服务器可能都扛不住&#xff0c;所以换成了vscode。 参考博客 手把手教你配置VS Code远程开发工具&#xff0c;工作效率提升N倍 - 知…

词云图大揭秘:如何从文本中挖掘热点词汇?

随着互联网的普及&#xff0c;大量的文本信息在网络上被产生和传播。如何从这些海量的文本中提取出有价值的信息&#xff0c;成为了人们关注的焦点。在这个信息爆炸的时代&#xff0c;词云图作为一种直观、形象的数据可视化手段&#xff0c;越来越受到人们的喜爱。本文手把手教…

设计模式 - 七大软件设计原则

目录 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 1.2.2、单一职责原则 1.2.3、里氏替换原则 1.2.4、迪米特原则 1.2.5、接口隔离原则 1.2.6、依赖倒转原则 1.2.7、合成/聚合复用原则 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 开闭原则&#xff1a;对扩…

双周赛114(模拟、枚举 + 哈希、DFS)

文章目录 双周赛114[2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)模拟 [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)哈希 枚举 [2871. 将数…

Docker--harbor私有仓库部署与管理

目录 一、Harbor简介 1、什么是Harbor 2、Harbor的特性 3、Haebor的构成 二、搭建本地私有仓库 1、本地私有仓库创建 2、将镜像上传至本地私有仓库 三、搭建Harbor仓库 1. 部署 Docker-Compose 服务 2、部署 Harbor 服务 3、启动Harbor 4、创建一个新项目 5、在其他…

并发、并行、同步、异步、阻塞、非阻塞

一、多核、多cpu &#xff08;一&#xff09;多核 Multicore 核是CPU最重要的部分。负责运算。核包括控制单元、运算单元、寄存器等单元。 多核就是指单个CPU中有多个核。 &#xff08;二&#xff09;多cpu Multiprocessor 多cpu就是一个系统拥有多个CPU。每个CPU可能有单个核…

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商?

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商? 股票注册开户是非常简单的&#xff0c;在2015年前也就是互联网还不发达的时候&#xff0c;投资者只能去券商的营业部柜台办理&#xff0c;而自从各大券商都可以网上开户后&#xff0c;更多的投资者会选择网上开户…

【运维】一些团队开发相关的软件安装。

gitlab 安装步骤 (1) 下载镜像&#xff0c;并且上传到服务器 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm &#xff08;2&#xff09;rpm -i gitlab-ce-16.2.8-ce.0.el7.x86_64.rpm &#xff08;3&#xff09;安装成功后…