Python搭建代理IP池实现接口设置与整体调度

目录

前言

1. 搭建免费代理IP爬虫

2. 将获取到的代理IP存储到数据库中

3. 构建一个代理IP池

4. 实现调度器来调度代理IP池

5. 实现带有代理IP池的爬虫

总结


前言

在网络爬虫中,代理IP池是一个非常重要的组件。由于许多网站对单个IP的请求有限制,如果我们一直使用同一个IP去请求数据,我们很快就会被封禁。因此,我们需要一个代理IP池,以便我们可以轮流使用多个代理IP,以避免被封禁的风险。

在本文中,我们将使用Python来构建一个代理IP池。我们将使用requests和BeautifulSoup库来从互联网上抓取免费代理IP,并将它们存储到一个代理IP池中。然后,我们将使用这个代理IP池来访问我们需要的数据。

本文内容涵盖以下几个方面:

  1. 搭建免费代理IP爬虫
  2. 将获取到的代理IP存储到数据库中
  3. 构建一个代理IP池
  4. 实现调度器来调度代理IP池
  5. 实现带有代理IP池的爬虫

本文将涉及到一些网络编程的知识,如果您还不熟悉这些知识,请先补充相关的知识。同时,本文代码也是在Python 3.8环境中运行的。

1. 搭建免费代理IP爬虫

我们需要从互联网上抓取免费代理IP,这里我们使用的是站大爷代理ip网站上的免费代理IP。我们将使用requests和BeautifulSoup来实现爬虫。

爬虫代码如下所示:

import requests
from bs4 import BeautifulSoupdef get_proxy_ips():"""Get the proxy IPs from zdaye.com"""url = 'https://www.zdaye.com/'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.3'}html = requests.get(url, headers=headers).textsoup = BeautifulSoup(html, 'html.parser')ips = soup.find_all('tr')proxy_ips = []for ip in ips[1:]:lst = ip.text.strip().split('\n')proxy_ip = {'ip': lst[0], 'port': lst[1]}proxy_ips.append(proxy_ip)return proxy_ips

2. 将获取到的代理IP存储到数据库中

我们需要将获取到的代理IP存储到数据库中,以便我们在后续的处理中使用。在这里,我们使用MongoDB作为我们的数据库,它是一个非常流行的文档型数据库,特别适合存储非结构化数据。

我们需要安装pymongo库来连接MongoDB。安装命令如下:

pip install pymongo

接下来,我们需要定义一个函数来将代理IP存储到MongoDB中。代码如下所示:

from pymongo import MongoClientdef save_proxy_ips(proxy_ips):"""Save the proxy IPs to MongoDB"""client = MongoClient('mongodb://localhost:27017/')db = client['proxy_ips']coll = db['ips']coll.delete_many({})coll.insert_many(proxy_ips)

上面的代码将获取到的代理IP列表作为参数传递,然后将代理IP列表存储到名为“proxy_ips”的数据库中的“ips”集合中。

3. 构建一个代理IP池

现在我们已经有了一个爬虫和一个数据库,接下来我们将构建一个代理IP池。在这个代理IP池中,我们将从数据库中随机选择一个代理IP,并使用它来访问我们需要的数据。如果代理IP无法使用,则需要从池中删除该代理IP。如果池中的代理IP数量太少,则需要重新从互联网上抓取免费代理IP,并将其存储到数据库中。

实现代码如下所示:

import randomclass ProxyPool:def __init__(self, threshold=5):"""Initialize the proxy pool"""self.threshold = thresholdself.client = MongoClient('mongodb://localhost:27017/')self.db = self.client['proxy_ips']self.coll = self.db['ips']def get_proxy_ip(self):"""Get a random proxy IP from the pool"""count = self.coll.count_documents({})if count == 0:return Noneproxy_ips = self.coll.find({}, {'_id': 0})ips = [proxy_ip for proxy_ip in proxy_ips]proxy_ip = random.choice(ips)ip = 'http://' + proxy_ip['ip'] + ':' + proxy_ip['port']return {'http': ip}def delete_proxy_ip(self, proxy_ip):"""Delete the proxy IP from the pool"""self.coll.delete_one(proxy_ip)def check_proxy_ip(self, proxy_ip):"""Check if the given proxy IP is available"""proxies = {'http': 'http://' + proxy_ip['ip'] + ':' + proxy_ip['port']}try:requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)return Trueexcept:return Falsedef update_pool(self):"""Update the proxy pool"""count = self.coll.count_documents({})if count < self.threshold:proxy_ips = get_proxy_ips()save_proxy_ips(proxy_ips)

上面的代码中,我们定义了一个名为ProxyPool的类。这个类有四个方法:

  • get_proxy_ip:从代理IP池中获取一个随机代理IP。
  • delete_proxy_ip:从代理IP池中删除一个代理IP。
  • check_proxy_ip:检查给定的代理IP是否可用。
  • update_pool:检查池中的代理IP数量是否低于阈值,如果低于阈值,则从互联网上获取新的代理IP列表,并将其存储到数据库中。

值得注意的是,我们使用了MongoDB作为代理IP池的存储介质。因此,我们需要安装MongoDB数据库,并确保它在运行。

4. 实现调度器来调度代理IP池

为了使用代理IP池,我们需要实现一个调度器来调度代理IP池。调度器需要获取一个随机的代理IP,并将其传递给请求。如果请求返回状态码为403(表示无权访问),则需要从代理IP池中删除该代理IP,并重新获取一个代理IP。

实现代码如下所示:

class Scheduler:def __init__(self):self.proxy_pool = ProxyPool()def request(self, url):"""Send a request to the given url using a random proxy IP"""while True:proxy_ip = self.proxy_pool.get_proxy_ip()if proxy_ip is None:return Nonetry:response = requests.get(url, proxies=proxy_ip, timeout=5)if response.status_code == 200:return responseelif response.status_code == 403:self.proxy_pool.delete_proxy_ip(proxy_ip)else:continueexcept:self.proxy_pool.delete_proxy_ip(proxy_ip)def run(self):"""Run the scheduler to update the proxy pool"""self.proxy_pool.update_pool()

上面的代码中,我们定义了一个名为Scheduler的类。这个类有两个方法:

  • request:使用随机代理IP发送请求。
  • run:运行调度器来更新代理IP池。

当我们向调度器发出请求时,调度器将从代理IP池中获取一个随机代理IP,并将其作为请求的代理IP。如果请求返回状态码为200,则说明代理IP可用,可以将响应返回给调用者。如果状态码为403,则需要从代理IP池中删除该代理IP,并重新获取一个代理IP。如果请求发生异常,则也需要从代理IP池中删除该代理IP。

5. 实现带有代理IP池的爬虫

现在我们已经有了一个代理IP池和一个调度器,接下来我们将实现一个带有代理IP池的爬虫。在这个爬虫中,我们将使用调度器来调度代理IP池,并将获取到的数据存储到MongoDB数据库中。

实现代码如下所示:

import timeclass Spider:def __init__(self):self.scheduler = Scheduler()self.client = MongoClient('mongodb://localhost:27017/')self.db = self.client['data']self.coll = self.db['info']def crawl(self):"""Crawl data using the proxy pool"""while True:response = self.scheduler.request('https://www.example.com/')if response is not None:html = response.text# parse the html to get the datadata = {}self.coll.insert_one(data)time.sleep(1)def run(self):"""Run the spider to crawl data"""while True:self.scheduler.run()self.crawl()time.sleep(10)

上面的代码中,我们定义了一个名为Spider的类。这个类有两个方法:

  • crawl:使用代理IP池来爬取数据,并将数据存储到MongoDB数据库中。
  • run:运行爬虫来爬取数据。

当我们运行爬虫时,它将首先运行调度器来更新代理IP池。然后,它将使用代理IP池来爬取数据,并将数据存储到MongoDB数据库中。最后,它将休眠10秒钟,然后重复这个过程。

总结

在本文中,我们使用Python来构建了一个代理IP池。我们首先使用requests和BeautifulSoup库来从互联网上抓取免费代理IP,并将其存储到MongoDB数据库中。然后,我们构建了一个代理IP池,从中随机选择代理IP,并使用它来访问我们需要的数据。如果代理IP无法使用,则从池中删除该代理IP。如果池中的代理IP数量太少,则重新从互联网上获取新的代理IP列表。

最后,我们实现了一个带有代理IP池的爬虫,使用调度器来调度代理IP池。该爬虫将获取数据,并将数据存储到MongoDB数据库中。

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

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

相关文章

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

iphone/安卓手机如何使用burp抓包

iphone 1. 电脑 ipconfig /all 获取电脑网卡ip&#xff1a; 192.168.31.10 2. 电脑burp上面打开设置&#xff0c;proxy&#xff0c;增加一条 192.168.31.10:8080 3. 4. 手机进入设置 -> Wi-Fi -> 找到HTTP代理选项&#xff0c;选择手动&#xff0c;192.168.31.10:8080 …

AI:95-基于卷积神经网络的艺术品风格分类

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

一套rk3588 rtsp服务器推流的 github 方案及记录 -01

我不生产代码&#xff0c;我只是代码的搬运工&#xff0c;相信我&#xff0c;看完这个文章你的图片一定能变成流媒体推出去。 诉求&#xff1a;使用opencv拉流&#xff0c;转成bgr数据&#xff0c;需要把处理后的数据&#xff08;BGR&#xff09;编码成264&#xff0c;然后推流…

测试Centos上用Gunicorn启动的Django-Web服务在Django源文件有改变的情况下能否自动重载最新源码下的web服务

01-先上传最新的源码文件 参考博文 https://blog.csdn.net/wenhao_ir/article/details/134762966 进行 02-先在Django直接开web服务下修改源码测试 这是没有问题的&#xff0c;会自己重置。 03-开启gunicorn服务 cd /djangoproject/mmdj01/ gunicorn -c /djangoproject/mm…

如何跑AI模型—ultralytics

这里以跑 ultralytics 为示例&#xff0c;记录了如何从 0-1 跑个简单的模型&#xff0c;包括环境搭建。我的是 Window 系统&#xff0c;其他系统也类似。 主要流程是环境搭建&#xff0c;找个官网的 demo&#xff0c;收集好所需素材&#xff08;模型&#xff0c;图片等&#x…

炫酷不止一面:探索JavaScript动画的奇妙世界(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

口袋参谋:运营必备的生意参谋指数免费转换工具!

​至少99.99%的商家都知道&#xff0c;淘宝天猫上交易的指数越高&#xff0c;宝贝的热度就高&#xff0c;那就代表着入店的流量就会有很多。 01 在哪里可以看到指数呢&#xff1f; 其实我们在生意参谋后台&#xff0c;在市场板块或者竞争板块中&#xff0c;是可以看到访问人气…

智慧能源:数字孪生压缩空气储能管控平台

压缩空气储能在解决可再生能源不稳定性和提供可靠能源供应方面具有重要的优势。压缩空气储能&#xff0c;是指在电网负荷低谷期将电能用于压缩空气&#xff0c;在电网负荷高峰期释放压缩空气推动汽轮机发电的储能方式。通过提高能量转换效率、增加储能密度、快速启动和调节能力…

第21章网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封 装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可 以编写出高质量的网络通信程序…

第二十一章总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机&#xff1b;如图所示&#xff1a; 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;…

JavaScript中的发布订阅和观察者模式:如何优雅地处理事件和数据更新

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-订阅观察者模式 目录 说说你对发布订阅、观察者模式的理解&#xff1f;…

【Java Web学习笔记】4 - DOM文档对象模型

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/javascript 零、在线文档 JavaScript HTML DOM 一、HTML DOM基本介绍 1. DOM全称是Document Object Model文档对象模型 文档<---映射--->对象 2.就是把文档中的标签&#xff0c;属性&#xf…

【链表OJ—反转链表】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1、反转链表题目&#xff1a; 2、方法讲解&#xff1a; 解法一&#xff1a; 解法二&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太…

FPGA时序分析与约束(0)——目录与传送门

一、简介 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭&#xff0c;似乎只有理解了时序约束才能算是真正入门了FPGA&#xff0c;对于FPGA从业者或者未来想要从事FPGA开发的工程师来说&#xff0c;时序约束可以说是一道躲不过去的坎&#xff0c;所以这个系列我们会详细介…

搭建React项目,基于Vite+React+TS+ESLint+Prettier+Husky+Commitlint

基于ViteReactTSESLintPrettierHuskyCommitlint搭建React项目 node: 20.10.0 一、创建项目 安装包管理器pnpm npm i pnpm -g基于Vite创建项目 pnpm create vitelatest web-gis-react --template react-ts进入项目目录安装依赖 $ cd web-gis-react $ pnpm i启动项目 $ pnpm…

SpringBoot3-创建自定义启动器,使用自定义starter启动器

1、创建自定义启动工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

三星有一个特有的重置电脑的应用程序,方便快捷,那就是三星恢复

本文介绍如何将三星笔记本电脑重置为出厂设置。它涵盖了两种方法,它们都适用于Windows 11和Windows 10。 如何用“三星恢复(Samsung Recovery)”重置三星笔记本电脑 许多三星笔记本电脑附带一种名为“三星恢复”的实用程序。这是一个比Windows“重置此电脑”过程更快、更不…

数据结构初阶之二叉树性质练习与代码练习

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 1.前言 2.性质练习 3…

高效便捷的淘宝商品详情关键词搜索API接口

联讯数据可以介绍一些高效便捷的淘宝商品详情关键词搜索API接口。 以下是一些可以考虑使用的API接口&#xff1a; 阿里云搜索引擎API&#xff1a;阿里云搜索引擎API是一个基于云计算技术的搜索引擎&#xff0c;提供商品详情关键词搜索功能。它支持中文搜索&#xff0c;并且具…