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 = 'http://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.mzph.cn/news/195840.shtml

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

相关文章

客户满意的黄金法则:10个让您一击即中的服务技巧!

在当今日益竞争激烈的商业世界中&#xff0c;提供出色的客户服务是保持企业成功的关键。无论您是一家大型公司、一家小型创业企业&#xff0c;还是个人品牌&#xff0c;客户服务都是建立持久关系、增加忠诚度和获取推荐的必备条件。 那么&#xff0c;如何做好客户服务呢&#x…

练习11-简单卷积器的设计

简单卷积器的设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;明确设计任务2.1,目前这部分代码两个文件没找到&#xff0c;见第5、6节&#xff0c;待解决中。 &#xff0c;卷积器的设计&#xff0c;RTL&#xff1a;con1.v4&#xff0c;前仿真和后仿真&#xff0c;测试信号…

JVM垃圾回收机制GC

一句话介绍GC&#xff1a; 自动释放不再使用的内存 一、判断对象是否能回收 思路一&#xff1a;引用计数 给这个对象里安排一个计数器&#xff0c; 每次有引用指向它&#xff0c; 就把计数器1&#xff0c; 每次引用被销毁&#xff0c;计数器-1&#xff0c;当计数器为0的时候…

文献速递 | CAR-T细胞助力增强前列腺癌肿瘤细胞抗肿瘤能力

前列腺癌是男性泌尿生殖系统最常见的恶性肿瘤&#xff0c;在全球&#xff0c;前列腺癌的发病率在男性所有恶性肿瘤中高居第2位&#xff0c;仅次于肺癌。免疫检查点分子转化生长因子受体II&#xff08;TGFβRII&#xff09;、T细胞免疫球蛋白和粘蛋白结构域3&#xff08;TIM3&am…

【带讲解】同校不同命,差个代号差好多!

今天分享的是23年哈尔滨工程大学815的信号与系统试题及解析。同样是哈尔滨工程大学&#xff0c;信号部分810着实比815难了很多&#xff01;但是815还有一门电路&#xff0c;压力也不小&#xff0c;两个代号各有利弊&#xff01; 小马哥Tips&#xff1a; 本套试卷难度分析&…

通过流量分析,明确医院重要主机中毒详情

故障现象 医院系统内部发现有一台重要主机持续产生了大量的连接失败数&#xff0c;主机IP为192.xxx.xxx.37&#xff0c;持续时间从2023年11月23日20&#xff1a;00持续到2023年11月24日10&#xff1a;00&#xff0c;十点后管理人员发现并封禁了该IP地址。 分析目的 针对医院…

项目部署到线上服务器后,报 Redis error: ERR unknown command del 错误

查了很多资料&#xff0c;终于解决了&#xff0c;问题出在redis.conf里&#xff0c;该文件里被添加了新的命令如下&#xff1a; 在这几句命令前加 # 号注释掉&#xff0c;重启即可解决 另附上相关redis的命令&#xff1a; 停止Redis&#xff1a;systemctl stop redis启动Redis…

【算法刷题】Day11

文章目录 面试题 08.01. 三步问题题干&#xff1a;算法原理&#xff1a;1、状态表示2、状态转移方程3、初始化4、填表顺序5、返回值 代码&#xff1a; 209. 长度最小的子数组题干&#xff1a;算法原理&#xff1a;1、暴力枚举出所有的子数组的和2、利用单调性&#xff0c;使用“…

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学习…

100G数据中心升级改造策略

视频流媒体的兴起和物联网设备的大幅增长带来数据量爆炸性增长&#xff0c;人们对算力的需求越来越大&#xff0c;网络的升级改造也成为每个数据中心关注的重点。为了应对网络压力&#xff0c;数据中心需要升级到100G及以上速率&#xff0c;为企业和用户提供高性能计算、存储和…

Python读写XML文件:深入解析与技术实现

目录 一、引言 二、XML文件基础 1、XML文件结构 2、XML文件语法规则 三、Python读取XML文件 1、使用内置库xml.etree.ElementTree 2、使用第三方库lxml 四、Python写入XML文件 1、使用内置库xml.etree.ElementTree 五、注意事项 六、总结 一、引言 XML&#xff08;…

JS前端逆向

前言 js逆向一直没有相关了解&#xff0c;虽然目前渗透遇见的不是很多&#xff0c;大多数遇见的要么不加密&#xff0c;要么无法实现其加密流程&#xff0c;不过最近看到了一个较为简单的站点正好能够逆向出来&#xff0c;就做了简单记录。本文旨在介绍js逆向的一些基础思路&am…

spring cache 学习 —— @Cacheable 使用详解

1. 功能说明 Cacheable 注解在方法上&#xff0c;表示该方法的返回结果是可以缓存的。也就是说&#xff0c;该方法的返回结果会放在缓存中&#xff0c;以便于以后使用相同的参数调用该方法时&#xff0c;会返回缓存中的值&#xff0c;而不会实际执行该方法。 注意&#xff0c;这…

蓝桥杯真题:四平方和

import java.io.*;/*先找后两个数for(int i 0; 2 * i * i < n;i)for(int j i; i * i j * j < n;j ) 再找前两个数 for(int i 0;4 * i * i < n; i )for(int j i;2 * (j * j i * i) < n;j )//这样就可以让后两个数尽量大,前两个数尽量小 这样就可以确定后…

HTML5+CSS3+Vue小实例:浪漫的心形文字动画特效

实例:浪漫的心形文字动画特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…

行业分析:2023年藜麦市场竞争格局及发展现状分析

藜麦是藜科藜属植物。穗部可呈红、紫、黄&#xff0c;植株形状类似灰灰菜&#xff0c;成熟后穗部类似高粱穗。植株大小受环境及遗传因素影响较大&#xff0c;从0.3-3米不等&#xff0c;茎部质地较硬&#xff0c;可分枝可不分。单叶互生&#xff0c;叶片呈鸭掌状&#xff0c;叶缘…

Pytorch CIFAR10图像分类 Swin Transformer篇

Pytorch CIFAR10图像分类 Swin Transformer篇 文章目录 Pytorch CIFAR10图像分类 Swin Transformer篇4. 定义网络&#xff08;Swin Transformer&#xff09;Swin Transformer整体架构Patch MergingW-MSASW-MSARelative position biasSwin Transformer 网络结构Patch EmbeddingP…

数据结构学习笔记——二叉树的遍历和链式存储代码实现二叉树

目录 一、二叉树的遍历&#xff08;一&#xff09;二叉树的先序遍历&#xff08;DLR&#xff09;&#xff08;二&#xff09;二叉树的中序遍历&#xff08;LDR&#xff09;&#xff08;三&#xff09;二叉树的后序遍历&#xff08;LRD&#xff09;&#xff08;四&#xff09;先…

如何使用群晖管家结合内网穿透实现公网远程访问本地黑群晖

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…