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

目录

背景

一、什么是本地代理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://www.hqwc.cn/news/9373.html

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

相关文章

计网笔记--网络层

1--网络层概述 网络层主要问题&#xff1a; ① 网络层向运输层提供怎样的服务&#xff1f; &#xff08;可靠或不可靠&#xff09; ② 网络层寻址问题&#xff08;IP 地址&#xff09; ③ 路由选择问题 &#xff08;路径&#xff09; 重点在于&#xff1a;TCP/IP协议栈 2--网络…

Pygame Zero(pgzrun)游戏库介绍

Pygame Zero&#xff08;pgzrun&#xff09;游戏库介绍 pgzero是python的一个第三方库。pgzrun 是 python game zero run 的缩写, 它对 Pygame 进行了封装, 屏蔽了繁琐枯燥的框架代码, 让学习者可以更专注于游戏的实现逻辑, 并且更快看到成果。 官网https://pygame-zero.read…

ASP.Net Core Web API快速搭建后台服务搭载SQLServer+FreeSQL(一)

目录 一.建立WebAPI所需要的环境 1. IDE编辑器&#xff1a;VisualStudio2019 2.数据库安装&#xff1a;SqlServer 3.下载SQL Server Management Studio (SSMS) 二.创建ASP.Net Core Web API工程 1.创建模板工程 2. 试运行案例接口 3.安装FreeSQL工具包 三.设计数据库 启…

【MySQL】不允许你不了解联结表

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

“生鲜蔬”APP的设计与实现

1.引言 在这个科技与网络齐头并进的时代&#xff0c;外卖服务正在飞速发展&#xff0c;人们对外卖APP系统功能需求越来越多&#xff0c;开发APP的人员对自己的要求也要越来越高&#xff0c;要从所做APP外卖系统所实现的功能和用户的需求来对系统进行设计&#xff0c;还需要与当…

python3开发-Word助手

目录 背景 思路 步骤 代码示例 总结 背景 在日常工作和学习中&#xff0c;我们经常需要处理Word文档&#xff0c;例如编辑、提取内容、生成报告等。而Python是一门功能强大的编程语言&#xff0c;它提供了丰富的库和工具&#xff0c;使得我们可以利用Python来处理Word文档…

Git无法上传删除 Commit里面有大文件

1.Bug描述 因为在一次提交中不小心把一个打包的aab文件弄到commit文件里了&#xff0c;于是在上传的时候push rejected 了。 因为GitHub的文件上限是100M&#xff0c;但是打的包太大了&#xff0c;有170M&#xff0c;所以是不能上传的&#xff0c;但是又是已经在Commit历史中了…

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,创新不算大。但是架不住效果太好了,基本刷新了很多NLP的任务…

Postman中读取外部文件

目录 前言&#xff1a; 一、postman中读取外部文件的格式 二、Postman中如何导入文件 三、在Postman读取导入的数据文件 前言&#xff1a; 在Postman中&#xff0c;您可以使用"数据文件"功能来读取外部文件&#xff0c;如CSV、JSON或Excel文件。这使得在测试中使用…

深度学习编译器汇总

深度学习的发展对个科学领域产生了深远的影响。它不仅在自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;等人工智能领域显示出显著的价值&#xff0c;而且在电子商务、智慧城市和药物发现等更广泛的应用领域也取得了巨大的成功。随着卷积神经网…

ch0_汇编介绍

学习参考: https://helijian.blog.csdn.net/article/details/60885095 参考贺利坚老师的汇编课程 1. 汇编作用 1.1 汇编是所有语言的老祖宗 1.2 不可替代的使用场景 汇编语言仍在发挥不可替代的作用: 效率 . 运行效率&#xff1a;开发软件的核心部件&#xff0c;快速执行和实…

【MySQL高级篇笔记-数据库的设计规范(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、为什么要数据库设计 二、范式 1、范式简介 2、范式都包括哪些 3、键和相关属性的概念 4、第一范式(1st NF) 5、第二范式(2nd NF) 6、第三范式(3rd NF) 7、小结 三、反范式化 1、概述 2、 应用举例 3、反范式的新问…