Python爬虫——怎么搭建和维护一个本地IP池

article/2025/10/24 7:24:59

目录

背景

一、什么是本地代理IP池

二、代理IP池功能架构图

三、各个组件功能说明及示例代码

1. IP池管理器

2. 代理IP获取器

3. IP质量检测器

4、数据存储器

5、API接口层

6、应用程序

总结


背景

在我们进行爬虫工作时,经常需要使用代理IP。大多数代理IP服务商为了保障服务器的持久稳定性,提供的代理IP往往都有最小提取间隔限制,虽然很合理,但有些特殊要求需要0间隔提取代理IP的业务就无法使用,那么建立本地IP池,可以很好的实现0间隔提取代理IP。

 

一、什么是本地代理IP池

代理IP池是一种由多个代理IP构成的集合,可以通过接口等方式随时获取可用的代理IP通俗地打个比方,它就是一个池子,里面装了很多代理ip。代理IP具有以下几个特征:

      1、池子里的ip是有生存周期的,它们将被定期验证,其中失效的将被剔除。

      2、池子里的ip是有补充渠道的,不断会有新的代理ip加入其中。

      3、池子中的代理ip是可以被随机取出来使用的。

这样,代理池中始终有多个不断更换的、有效的代理ip,且我们可以无间隔随机从池子中取出代理ip,然后让爬虫程序使用代理ip访问目标网站,解决在爬虫或其他应用中遇到的封禁、限制等问题。

二、代理IP池功能架构图

自建代理IP池的功能架构图包括以下组件:

  1. IP池管理器:用于管理IP池,包括IP地址的添加、删除、查询和更新等操作。

  2. 代理IP获取器:用于从外部资源中获取代理IP,例如从公开代理IP网站上爬取代理IP、从代理服务商订购代理IP等。

  3. IP质量检测器:用于检测代理IP的质量,包括代理IP的连接速度、稳定性、匿名性等特征。

  4. 数据存储器:用于存储IP池和代理IP的数据,例如使用MySQL等关系型数据库、Redis等非关系型数据库等。

  5. API接口层:用于接收来自应用程序的请求,调用IP池管理器、代理IP获取器、IP质量检测器和数据存储器等组件进行处理,并返回相应的数据结果。

  6. 应用程序:用于调用API接口层,实现代理IP的使用、监控和管理等功能。

 

三、各个组件功能说明及示例代码

1. IP池管理器

IP池管理器的作用是管理IP池,它可以实现以下功能:

- 添加新的IP地址到IP池中;
- 删除不需要的IP地址;
- 查询IP池中的可用IP地址;
- 更新IP池中的IP地址信息。

这里以Python语言举例,实现一个简单的IP池管理器:

class IPPoolManager:def __init__(self, db):self.db = db  # 数据库连接def add_ip(self, ip, port, protocol='http', source='', status='new'):''' 添加新的IP地址到IP池 '''cursor = self.db.cursor()sql = "INSERT INTO ip_pool(ip, port, protocol, source, status) VALUES(%s, %s, %s, %s, %s)"data = (ip, port, protocol, source, status)cursor.execute(sql, data)self.db.commit()return cursor.lastrowid  # 返回添加记录的IDdef delete_ip(self, ip_id):''' 从IP池中删除不需要的IP地址 '''cursor = self.db.cursor()sql = "DELETE FROM ip_pool WHERE id=%s"cursor.execute(sql, (ip_id,))self.db.commit()def get_ip(self, status='new'):''' 查询IP池中的可用IP地址 '''cursor = self.db.cursor()sql = "SELECT * FROM ip_pool WHERE status=%s ORDER BY id DESC LIMIT 1"cursor.execute(sql, (status,))result = cursor.fetchone()return resultdef update_status(self, ip_id, status):''' 更新IP池中的IP地址信息 '''cursor = self.db.cursor()sql = "UPDATE ip_pool SET status=%s WHERE id=%s"cursor.execute(sql, (status, ip_id))self.db.commit()

2. 代理IP获取器

 负责定时(最小提取间隔)从代理IP服务商那里调用API接口获取代理IP。当然也可以爬取免费代理IP,但为了提高工作效率,建议购买优质代理IP,这里使用了站大爷代理IP(https://www.zdaye.com)。注册后可以免费试用所有的套餐2小时,生成API接口后,就可以提取到代理IP。

这里以站大爷代理IP接口为例,实现一个简单的代理IP获取器(需要使用requests库):

import requestsdef get_ip():url = "https://www.zdaye.com" //在后台的实例管理里面可以直接生成api接口,选择JSON格式res = requests.get(url)# print(res.text)for i in json.loads(res.text)["data"]:print(i, type(i))ip = {"http": str(i["ip"]) + ":" + str(i["port"]),"https": str(i["ip"]) + ":" + str(i["port"])} return ip

注意:我们拿到的代理是 {"ip":"117.57.91.154","port":40021} 这种样子的;

爬虫使用的代理要装成:{'http': '163.125.104.6:40011', 'https': '163.125.104.6:40011'}这种样子。

3. IP质量检测器

IP质量检测器的作用是检测代理IP的质量,包括代理IP的连接速度、稳定性、匿名性等特征。这里以验证代理IP的可用性为例,实现一个简单的IP质量检测器。

import requestsclass IPChecker:def __init__(self):self.timeout = 5  # 设置超时时间self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}def check_ip(self, ip, port):''' 验证代理IP的可用性 '''proxies = {'http': 'http://%s:%s' % (ip, port), 'https': 'https://%s:%s' % (ip, port)}try:response = requests.get('http://www.baidu.com', headers=self.headers, proxies=proxies, timeout=self.timeout)if response.status_code == 200:return Trueelse:return Falseexcept:return False

上面的代码使用requests库发送HTTP请求,通过设置proxies参数和timeout参数来验证代理IP是否可用,如果能正常访问百度网站,则验证通过返回True,否则返回False。

4、数据存储器

数据存储器的作用是存储IP池和代理IP的数据,例如使用MySQL等关系型数据库、Redis等非关系型数据库等。这里以MySQL为例,实现一个简单的数据存储器。

import pymysqlclass MySQLDataStorage:def __init__(self, host, port, user, password, database):self.host = hostself.port = portself.user = userself.password = passwordself.database = databasedef connect(self):''' 连接数据库 '''self.db = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, database=self.database)def disconnect(self):''' 断开数据库连接 '''self.db.close()def create_table(self):''' 创建IP池表 '''cursor = self.db.cursor()sql = '''CREATE TABLE IF NOT EXISTS ip_pool (id INT(11) NOT NULL AUTO_INCREMENT,ip VARCHAR(50) NOT NULL,port VARCHAR(10) NOT NULL,protocol VARCHAR(10) NOT NULL,source VARCHAR(50) NOT NULL,status VARCHAR(10) NOT NULL,created_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'''cursor.execute(sql)self.db.commit()def insert(self, ip, port, protocol, source, status):''' 添加新的IP地址到IP池 '''cursor = self.db.cursor()sql = "INSERT INTO ip_pool(ip, port, protocol, source, status) VALUES(%s, %s, %s, %s, %s)"data = (ip, port, protocol, source, status)cursor.execute(sql, data)self.db.commit()return cursor.lastrowid  # 返回添加记录的IDdef delete(self, ip_id):''' 从IP池中删除不需要的IP地址 '''cursor = self.db.cursor()sql = "DELETE FROM ip_pool WHERE id=%s"cursor.execute(sql, (ip_id,))self.db.commit()def select(self, status='new'):''' 查询IP池中的可用IP地址 '''cursor = self.db.cursor()sql = "SELECT * FROM ip_pool WHERE status=%s ORDER BY id DESC LIMIT 1"cursor.execute(sql, (status,))result = cursor.fetchone()return resultdef update(self, ip_id, status):''' 更新IP池中的IP地址信息 '''cursor = self.db.cursor()sql = "UPDATE ip_pool SET status=%s WHERE id=%s"cursor.execute(sql, (status, ip_id))self.db.commit()

上面的代码封装了MySQL的连接、断开连接、创建表、增删改查等操作,可以通过调用接口实现IP池数据库的交互。注意,这里使用了execute()函数的带参数方式来防止SQL注入攻击。

5、API接口层

API接口层的作用是提供API接口,让其他程序可以与IP池系统进行交互,例如查询可用代理IP、获取新的代理IP等。这里以Python Flask框架为例,实现一个简单的API接口层。```

from flask import Flask, jsonify
from ip_pool_manager import IPPoolManagerapp = Flask(__name__)
manager = IPPoolManager()  # 初始化IP池管理器@app.route('/')
def hello_world():return 'Hello, World!'@app.route('/get')
def get_proxy():''' 查询可用代理IP '''result = manager.get_ip()if result:ip = result['ip']port = result['port']protocol = result['protocol']manager.update_status(result['id'], 'using')  # 更新IP状态为使用中return jsonify({'ip': ip, 'port': port, 'protocol': protocol})else:# 如果没有可用IP,则返回空return ''@app.route('/add/<ip>/<port>')
def add_proxy(ip, port):''' 添加新的代理IP '''manager.add_ip(ip, port)return 'ok'@app.route('/delete/<int:id>')
def delete_proxy(id):''' 删除不需要的代理IP '''manager.delete_ip(id)return 'ok'if __name__ == '__main__':app.run()

上面的代码使用了Flask框架实现了三个接口:

- /get:查询可用代理IP;
- /add:添加新的代理IP;
- /delete:删除不需要的代理IP。

其中,get_proxy()函数从IP池管理器中获取可用代理IP,并更新IP状态为使用中,返回JSON格式的数据;add_proxy()函数向IP池管理器中添加新的代理IP;delete_proxy()函数从IP池管理器中删除不需要的代理IP。启动Flask应用程序后,其他程序可以通过HTTP请求调用这些接口与IP池系统进行交互。

6、应用程序

以下是一个简单的应用程序示例。它使用IP池系统提供的可用代理IP,并使用requests库实现了一个简单的爬虫示例。

import requests
from bs4 import BeautifulSoup
from ip_checker import IPChecker
from ip_pool_manager import IPPoolManager
import timedef main():checker = IPChecker()manager = IPPoolManager()while True:ip_info = manager.get_ip()  # 获取可用代理IPif ip_info:ip = ip_info.get('ip')port = ip_info.get('port')protocol = ip_info.get('protocol')if checker.check_ip(ip, port):print(f'使用代理IP {ip}:{port} 获取数据')proxies = {'http': f'{protocol}://{ip}:{port}', 'https': f'{protocol}://{ip}:{port}'}response = requests.get('http://www.baidu.com', proxies=proxies)# 这里可以根据需要解析返回的数据soup = BeautifulSoup(response.text, 'html.parser')print(soup.title.string)time.sleep(5)  # 延迟5秒后继续获取else:# 如果代理IP不可用,则将其状态设置为失效manager.update_status(ip_info['id'], 'invalid')else:# 如果没有可用代理IP,则等待一段时间后再尝试获取time.sleep(60)if __name__ == '__main__':main()

以上代码的主函数中使用IP池系统提供的可用代理IP,使用requests库发送HTTP请求,获取返回的数据。如果返回的数据解析成功,控制台输出网站的标题,然后等待5秒后继续获取。如果代理IP不可用或者IP池中没有可用的IP,程序会等待一段时间后再尝试获取。

总结

有了本地IP池,可以更加方便的管理和使用代理IP,不仅可以0间隔提取代理IP,还能提高爬虫的工作效率。


http://chatgpt.dhexx.cn/article/lCEW3vKB.shtml

相关文章

搭建代理IP池的方法

突破次数的限制就可以使爬虫更高效的工作,代理IP是突破次数限制,提高爬虫高效工作的最好的工具。所以,很多人都想通过建立IP池的方法,实现换IP突破限制,那么这IP池如何进行搭建呢? 一,免费搭建代理IP池的方法 1.主要用途 当进行数据爬取的时候,有一部分网站是设置了一些…

scrapy中添加ip池的方法

scrapy中添加ip池的方法 我使用的是scrapy2.2 setting 中写下ip池 IPPOOL [{ipaddr:221.230.72.165:80}, {ipaddr:175.154.50.162:8118}, {ipaddr:111.155.116.212:8123},]在在中间件midllewares添加代码 from mypython.settings import IPPOOLfrom scrapy import signals …

Python爬虫 教程:IP池的使用

一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施&#xff0c;例如很多网站会检测某一段时间某个IP的访问次数&#xff0c;如果访问频率太快以至于看起来不像正常访客&#xff0c;它可能就会禁止这个IP的访问。所以我们需要设置一些代理IP&#xff0c;每隔一…

如何建立爬虫代理ip池

目录 一、为什么需要建立爬虫代理ip池 二、如何建立一个爬虫代理ip池 原文地址&#xff1a;https://www.cnblogs.com/TurboWay/p/8172246.html 一、为什么需要建立爬虫代理ip池 在众多的网站防爬措施中&#xff0c;有一种是根据ip的访问频率进行限制的&#xff0c;在…

requests模块代理IP池搭建视频爬取

requests模块&代理IP池搭建 一 requests模块使用1.1 get请求1.2 url编码和解码1.3 携带请求头1.4 携带cookie1.5 发送post请求1.6 requests.session1.7 Response1.8 获取二进制数据1.9 解析json 二 使用代理三 django后端获取客户端ip地址四 爬取视频网站五 爬取新闻六 Bau…

Python之爬虫 搭建代理ip池

文章目录 前言一、User-Agent二、发送请求三、解析数据四、构建ip代理池&#xff0c;检测ip是否可用五、完整代码总结 前言 在使用爬虫的时候&#xff0c;很多网站都有一定的反爬措施&#xff0c;甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip被禁&#xff0c;…

如何构建一个自己的代理ip池

一、默认自动切换IP 登录线程IP池客户端时&#xff0c;默认情况下会自动切换IP。 如果不想自动切换IP&#xff0c;或者还没有准备开始使用&#xff0c;请在客户端右侧将“在IP过期前几秒自动申请切换”设置为“0”。 0无效。 二.默认情况下不需要授权 默认情况下&#xff0c…

搭建代理IP池

目录 爬取前的准备 爬取有IP内容 检查IP的可用性 上一期讲到在爬取豆瓣电影Top250时&#xff0c;出现ip被封的情况&#xff0c;解决方案给出了两种&#xff1a; 1. 换个WiFi或者热点&#xff1b; 2. 搭建代理IP池。 那么这期就来搭建代理IP池。通常来说&#xff0c;搭建代理…

python搭建ip池

在爬取网站的时候我们有时候会遭受封ip等显现&#xff0c;因此我们需要搭建自己的ip池用于爬虫。 代码过程简述&#xff1a; 1、爬取代理ip网站信息 2、将获取的信息处理得到ip等关键信息 3、保存首次获取的ip信息并检测其是否可用 4、检测完毕将可用ip保存&#xff0c;搭…

搭建免费代理IP池

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;i新木优子&#x1f440; &#x1f389;欢迎关注&#x1f50d;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f9da;‍♂️寄语:成功的秘诀就是每天都比别人多努力一点&#x1f463; ✨有任何疑问欢迎评论探讨 先声明一下&…

python搭建ip池(多线程)

之前有讲过怎么搭建ip池&#xff0c;但由于单线程的效率太低&#xff0c;于是我们升级改造一下&#xff0c;将单线程变成多线程来搭建ip池&#xff0c;之前的方法可以参考一下&#xff1a;python搭建ip池 &#xff08;如果会简单的request和提取文字就可以直接不看&#xff09;…

教你自己搭建一个IP池(绝对超好用!!!!)

随着我们爬虫的速度越来越快&#xff0c;很多时候&#xff0c;有人发现&#xff0c;数据爬不了啦&#xff0c;打印出来一看。 不返回数据&#xff0c;而且还甩一句话 是不是很熟悉啊&#xff1f; 要想想看&#xff0c;人是怎么访问网站的&#xff1f; 发请求&#xff0c;对…

Python爬虫实战(二):爬取快代理构建代理IP池

目录 &#x1f339;前言构建IP池的目的爬取目标准备工作代码分析第一步第二步第三步第四步第五步完整代码使用方法 &#x1f339;前言 博主开始更新爬虫实战教程了&#xff0c;期待你的关注&#xff01;&#xff01;&#xff01; 第一篇&#xff1a;Python爬虫实战&#xff08;…

ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'

MySQL> update user set host% where user root; ERROR 1062 (23000): Duplicate entry %-root for key PRIMARY 然后查看了下数据库的host信息如下&#xff1a; host已经有了%这个值&#xff0c;所以直接运行命令&#xff1a; 复制代码 代码如下: MySQL>flush priv…

Mysql 报错 ERROR 1062 (23000): Duplicate entry ‘%-root‘ for key ‘PRIMARY‘

文章目录 错误详情错误原因解决方案最后 错误详情 今天在云主机上配置Hive时&#xff0c;设置远程连接的权限报错如下&#xff1a; 错误原因 之前电脑上已经有了%&#xff0c; 解决方案 查看一下电脑中是否已经具有% select host,user from user where userroot;如果已经存…

ORA-20000

exec dbms_stats.gather_database_stats(ESTIMATE_PERCENT>100, method_opt > FOR ALL INDEXED COLUMNS SIZE AUTO, cascade>true, degree>120);在12c和19c中&#xff0c;想要启用资源管理&#xff0c;必须先把并发收集统计信息禁用。 alter system set resource_…

mysql一张表复制到另外一张表,报错[23000][1062] Duplicate entry ‘1‘ for key ‘big_2.PRIMARY‘

mysql一张表复制到另外一张表 insert into big_2 select * from big_4 报错 [23000][1062] Duplicate entry 1 for key big_2.PRIMARY 看报错&#xff0c;是big_2的主键已经有1了&#xff0c;不能再插入相同的值&#xff0c;我这边id是自增字段&#xff0c;指定插入字段就能解决…

我32岁,花23000元从雕刻员转行程序员,承诺保底6K,选IT是成功了吧

我从22岁起&#xff0c;就开始在县城一家雕刻厂做流水线工人&#xff0c;从厂房门口看过去&#xff0c;雕刻厂的一切都是灰色的&#xff0c;到处落满花岗岩的灰屑。 一边是师傅们趴在石料上无休止地劳作&#xff0c;一边是新安装的数控雕刻机发出尖刻的响声&#xff0c;我是这…

Mysql出现问题:ERROR 1451 (23000): Cannot delete or updatea parent row: a foreign key constraint fail解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

Mysql出现问题:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…