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

news2024/12/28 17:57:06

目录

前言

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 BeautifulSoup

def 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).text
    soup = 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 MongoClient

def 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 random

class ProxyPool:
    def __init__(self, threshold=5):
        """
        Initialize the proxy pool
        """
        self.threshold = threshold
        self.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 None

        proxy_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 True
        except:
            return False

    def 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 None
            try:
                response = requests.get(url, proxies=proxy_ip, timeout=5)
                if response.status_code == 200:
                    return response
                elif response.status_code == 403:
                    self.proxy_pool.delete_proxy_ip(proxy_ip)
                else:
                    continue
            except:
                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 time

class 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 data
                data = {}
                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.coloradmin.cn/o/1282649.html

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

相关文章

对点云进行凸包提取

void getConcaveHull(PointCloud::Ptr& cloud,const pcl::PointCloud<PointXYZ>::Ptr &hull) {if(cloud->points.size()<3){return ;}PointCloud ::Ptr cloud_filtered(new PointCloud());downSample(cloud,cloud_filtered);// 创建凹包提取对象pcl::Conca…

安科瑞参加全国建筑电气设计技术协作及情报交流网2023年会-安科瑞 蒋静

2023年11月19日~20日&#xff0c;广州市东方宾馆内人潮涌动&#xff0c;热闹非凡&#xff0c;全国建筑电气设计技术协作及情报交流网2023年年会暨“建筑电气传承与创新”高峰论坛在此盛大举办。 会议由全国建筑电气设计技术协作及情报交流网、中国建筑东北设计研究院有限公司主…

【numpy】np.triu的使用

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 np.triu使用&#xff0c;参数辨析 1. 正文 import numpy as nparr np.ones((3,3)) print(arr)print(np.triu(arr,0))0时&#xff0c;包含对角线上的元…

【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试

本文主要介绍go语言使用Minio对象存储&#xff0c;首先介绍搭建minio&#xff0c;创建bucket等&#xff0c;然后讲解封装minio客户端接口&#xff0c;包括但不限于&#xff1a;上传文件&#xff0c;下载&#xff0c;获取对象url&#xff0c;最后测试开发的接口 文章目录 前言Mi…

【机器学习】线性模型之逻辑回归

文章目录 逻辑回归Sigmoid 函数概率输出结果预测值与真实标签之间的并不匹配交叉熵逻辑回归模型 梯度下降逻辑回归模型求解编程求解sklearn 实现&#xff0c;并查看拟合指标 逻辑回归 逻辑回归是一种广义线性模型&#xff0c;形式上引入了 S i g m o i d Sigmoid Sigmoid 函数…

php之zip文件中压缩、解压、增加文件、删除

官方文档 PHP: Zip - Manual 在PHP中&#xff0c;zip扩展提供了处理ZIP文件的功能。它允许你创建、读取、更新和提取ZIP文件。 首先&#xff0c;确保你的PHP环境已经安装了zip扩展。你可以在php.ini文件中找到以下行来检查&#xff1a; extensionzip 如果没有注释掉&#xf…

分享76个节日PPT,总有一款适合您

分享76个节日PPT&#xff0c;总有一款适合您 76个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1pUnIoIUhzyXAB_5LnKGnNg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值&#xff0c;则新的连接无法建立。建议每天检查连…

日志模块Loguru

安装 Loguru 仅支持 Python 3.5 及以上的版本&#xff0c;使用 pip 安装即可&#xff1a; pip install loguru开箱即用 Loguru 的主要概念是只有一个&#xff1a;logger from loguru import loggerlogger.info("This is log info!") logger.warning("This i…

06、基于内容的过滤算法Tensorflow实现

06、基于内容的过滤算法Tensorflow实现 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 05、基于梯度下降的协同过滤算法中已经介绍了协同过滤算法的基本实现方法&#xff0c;但是这种方法仅…

《视觉SLAM十四讲 从理论到实践(第2版)》

书中代码&#xff1a;GitHub - gaoxiang12/slambook2: edition 2 of the slambook 书籍PDF&#xff1a;关注【Learn from Zero】回复【SLAM142】即可领取

变配电智能监控系统

变配电智能监控系统是一种能够实时监测电力变压器和配电柜、配电箱运行状态的智能设备。这种系统利用先进的传感器和数据通信技术&#xff0c;能够实时监测电力设备的运行状态&#xff0c;包括电压、电流、温度、湿度等参数&#xff0c;并且能够对这些数据进行处理和分析&#…

2024版软件测试面试100问(答案+文档)

软件测试面试百题 1、问&#xff1a;你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一个bug&#xff0c;你应该怎样解决? 首先&#xff0c;将问题提交到缺陷管理库里面进行备案。 然后&#xff0c;要获取判断的依据和标准&#xff1a; 根据需求说明书、产品说…

AI时代的C++编程方向

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

UOS打印任务监控

UOS系统下如何对一个打印任务进行监控呢? 首先,UOS系统是支持这个功能。比如说我们打印一个任务后,UOS自带的打印管理器是能知道打印任务的状态的: 经过研究,最终发现了他的监控原理。 还得是DBus 没错,还是得通过DBus来实现打印任务监控。 话不多说,直接上代码: …

SystemVerilog基础:并行块fork-join、join_any、join_none(一)

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html?spm1001.2014.3001.5482 有关Verilog中顺序块和并行块的相关内容已经在之前的Verilog基础的文章讲过&#xff0c;如下所示。 Verilog基础&#xff1a;块语句https://blog.csdn.net…

Linux进程通信——内存映射mmap

Linux进程通信——内存映射mmap 1、创建内存映射区2、进程间通信2.1 有血缘关系2.2 没有血缘关系 3、拷贝文件 原文链接 1、创建内存映射区 如果想要实现进程间通信&#xff0c;可以通过函数创建一块内存映射区&#xff0c;和管道不同的是管道对应的内存空间在内核中&#xf…

知识点滴 - 什么是半透膜和渗透压

半透膜和渗透作用 1748年的一天&#xff0c;法国物理学家诺勒为了改进酒的制作水平&#xff0c;设计了这样一个试验&#xff1a;在一个玻璃圆筒中装满酒精&#xff0c;用猪膀胱封住&#xff0c;然后把圆筒全部浸在水中。当他正要做下一步的工作时&#xff0c;突然发现&#xff…

MySQL 的 NULL 是怎么存储的?

目录 一、MySQL介绍 二、什么是NULL 三、MySQL 的 NULL 是怎么存储的 一、MySQL介绍 MySQL是一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种开源软件&#xff0c;由瑞典MySQL AB公司开发&#xff0c;后被Sun Microsystems收购&#xff0c;现在…