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 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数据库中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python练习题(三)

&#x1f4d1;前言 本文主要是【Python】——Python练习题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

学生犯错误老师应该怎么教育

作为一名老师&#xff0c;当学生犯错误时&#xff0c;我们需要采取一些措施来帮助他们改正错误并学习如何更好地处理问题。以下是我作为一名老师会采取的几个步骤&#xff1a; 进行私下谈话&#xff0c;了解他们为什么犯错误。我会听取他们的解释&#xff0c;并尝试理解他们的动…

如何能够对使用ShaderGraph开发的Shader使用SetTextureOffset和SetTextureScale方法

假设在ShaderGraph中的纹理的引用名称为"_BaseMap"&#xff0c;同时对这个"_BaseMap"纹理使用了采样的节点"SampleTexture2D"&#xff0c;然后该采样节点的uv接入的TilingAndOffset节点&#xff0c;此时的关键步骤是新建一个Vector4属性&#xf…

深入解析Linux内核网络-拥塞控制系列(一)

谈起网络拥塞控制&#xff0c;大家可能很熟悉八股文中的"加法增大“、”乘法减小“、”慢开始“、“拥塞避免”、“快重传”、“快恢复”等概念。没错&#xff0c;这是一种经典网络拥塞控制算法的基础理论&#xff0c;但在实际的实现时不同的拥塞控制算法&#xff0c;有很…

I/O口接口扩展----82C55

目录 一.扩展的I/O接口功能 二.端口的编址 1.独立编址 2.统一编制 三.I/O数据的传送方式 四.I/O接口电路----82C55 1.82C55的引脚及其内部结构 2.工作方式选择控制字及端口PC置位/复位控制字 3.82C55的三种工作方式 (1)方式0 (2)方式1 (3)方式2 4.AT89S52单片机与…

树_完全二叉树节点个数

//给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 // // 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位…

安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳?

安卓1.0明显是基于linux内核开发的&#xff0c;安卓1.0是不是linux套壳&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「安卓开发资料从专业入门到高级教程工具包」&#xff0c;点个关注&…

华为OD机试 - 园区参观路径(Java JS Python C)

题目描述 园区某部门举办了Family Day,邀请员工及其家属参加; 将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角; 家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。 输入描述 第一行为园区的长和宽; 后…

王炸cpu-龙芯3A6000

国产 CPU 性能媲美 Intel 酷睿这事儿&#xff0c;可能真的已经实现了。 没错&#xff0c;那颗有着多次爆料拉满大家期待值的龙芯 3A6000&#xff0c;终于正式发布。 就在今天上午&#xff0c;龙芯中科在 2023 年龙芯产品发布暨用户大会上正式带来了这颗 CPU。 整场发布会 PPT …

windows11 调整鼠标灵敏度方法

首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可

「C++」C++11新特性

&#x1f4bb;文章目录 &#x1f4c4;前言右值引用概念右值引用的意义移动构造和移动赋值完美转发 lambada表达式包装器function包装器bind包装器 &#x1f4d3;总结 &#x1f4c4;前言 C标准10年磨一剑&#xff0c;于2011年迎来了它真正意义上的第二个标准&#xff0c;C11能更…

备忘录不小心删了怎么办?如何找回我的备忘录?

如果你的记性不太好&#xff0c;或者每天需要记住、完成的事情很多&#xff0c;那么养成随手记事的好习惯是非常有必要的。因为手机是每个成年人都会随身携带的电子设备&#xff0c;所以直接在手机上记录事情比较简单、便捷。而手机备忘录、便签、笔记等工具类软件&#xff0c;…

Docker快速理解及简介

docker快速理解及简介 1.Docker为什么出现&#xff1f; 迁移一个项目时&#xff0c;运行文档、配置环境、运行环境、运行依赖包、操作系统发行版、内核等都需要重新安装配置&#xff0c;比较麻烦。 2.Docker是什么&#xff1f; Docker是基于Go语言实现的云开源项目。解决了运行…

ToDesk优惠码来了,需要的不容错过

最近发现Todesk也有活动了&#xff0c;很多小伙伴不知道&#xff0c;除了中秋国庆双节&#xff0c;ToDesk另有专享优惠码&#xff0c;输入优惠码最高立减25元&#xff0c;即使是活动日也能折上折&#xff0c;不影响此优惠码的折扣力度&#xff01; Todesk作为国内优良的远程控制…

ssm土家风景文化管理平台源码和论文答辩PPT

摘要 土家风景文化管理平台是土家风景文化管理必不可少的一个部分。在风景文化管理的整个过程中&#xff0c;平台担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类土家风景文化管理平台也在不断改进。本课题所设计的土家风景文化管理平台&#xff0c;使用jav…

LED恒流开关调节器FP7123,提供稳定电流,提升LED产品效果!

目录 一、FP7123概述 二、FP7123功能 LED恒流开关调节器FP7123的优势不仅仅在于提供稳定的电流&#xff0c;还包括以下几个方面&#xff1a; 三、应用领域 随着科技的不断发展&#xff0c;LED照明产品已经成为人们生活中不可或缺的一部分。然而&#xff0c;LED的亮度和稳定性…

mac M系列芯片安装chatGLM3-6b模型

1 环境安装 1.1 mac安装conda. 下载miniconda&#xff0c;并安装 curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh sh Miniconda3-latest-MacOSX-arm64.sh1.2 创建虚拟环境并激活 创建名为chatglm3的虚拟环境&#xff0c;python版本为3.10…

环形链表 2:找出入环的第一个节点

题目描述&#xff1a; 给定一个链表返回链表开始入环的第一个点。如果链表无环&#xff0c;则返回NULL。 为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0开始&#xff09;。如果pos是-1&#xff0c;则在该链表中没有环。…

Autosar标准解析

AUTOSAR&#xff08; Automotive Open System Architecture &#xff09;——汽车开放系统架构&#xff0c;是一家致力于制定汽车电子软件标准的联盟&#xff08;宝马、博世、大陆、戴姆勒、福特、标志雪铁龙、丰田和大众&#xff09;&#xff0c;成立于2003年&#xff0c;是一…

关于自动化测试框架pytest的Fixture固件

什么是固件 Fixture 翻译成中文即是固件的意思。它其实就是一些函数&#xff0c;会在执行测试方法/测试函数之前&#xff08;或之后&#xff09;加载运行它们&#xff0c;常见的如接口用例在请求接口前数据库的初始连接&#xff0c;和请求之后关闭数据库的操作。 我们之前在A…