首页 > 编程语言 >【Python】爬虫代理IP的使用+建立代理IP池

【Python】爬虫代理IP的使用+建立代理IP池

时间:2023-11-14 15:32:43浏览次数:35  
标签:return Python IP self 代理 proxy pool

前言

在进行网络爬虫开发时,我们很容易遭遇反爬虫机制的阻碍。为了规避反爬虫机制,我们可以使用代理IP。代理IP是指通过代理服务器获取的可用于访问目标网站的IP地址,通过使用代理IP,我们可以隐藏自己的真实IP地址,避免被目标网站封禁。

但是,在使用代理IP时,我们需要注意一些问题:

  1. 代理IP的质量。有些代理IP可能无法正常使用,需要对代理IP进行筛选和测试,确保代理IP的可用性。
  2. 代理IP的多样性。不同位置、不同类型的代理IP都可以使用。我们需要建立起代理IP池,方便灵活地切换代理IP,提高抓取效率。

本文将介绍如何使用python爬虫实现代理IP的使用以及代理IP池的建立。

【Python】爬虫代理IP的使用+建立代理IP池_反爬虫

一、代理IP

  1. 代理IP的获取

我们可以从代理IP供应商处购买或免费获取代理IP,也可以自己搭建代理服务器获取代理IP。

这里以免费获取代理IP为例。我们可以从以下网站获取免费代理IP:

https://www.zdaye.com/
https://www.kxdaili.com/
https://www.ip3366.net/
  1. 代理IP的验证

通过免费获取的代理IP,我们不能保证其全部可用。因此,我们需要对代理IP进行验证。

验证代理IP的代码如下:

import requests

def check_proxy(proxy):
    try:
        res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
        if res.status_code == 200:
            return True
        else:
            return False
    except:
        return False

我们通过访问百度网站来验证代理IP的可用性。如果可以成功访问,则返回True,否则返回False。如果代理IP的可用性值为True,则可以将其添加到代理IP池中,供后续使用。

  1. 代理IP的使用

使用代理IP的代码如下:

import requests

def get_html(url, proxy):
    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'}
    try:
        res = requests.get(url, headers=headers, proxies=proxy, timeout=5)
        if res.status_code == 200:
            return res.text
        else:
            return None
    except:
        return None

我们通过为requests库的get方法传递一个proxies参数来使用代理IP。如果请求成功,则返回响应内容;否则返回None,表示请求失败。

二、建立代理IP池

  1. 代理IP池的建立

我们可以从多个代理IP供应商处获取代理IP。在使用代理IP时,我们随机从代理IP池中选择一个代理IP,保证请求的随机性,提高反爬虫机制的规避效果。

代理IP池的建立代码如下:

import random
import requests

class ProxyPool(object):
    def __init__(self):
        self.pool = []

    def add_proxy(self, proxy):
        if self.check_proxy(proxy):
            self.pool.append(proxy)

    def check_proxy(self, proxy):
        try:
            res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
            if res.status_code == 200:
                return True
            else:
                return False
        except:
            return False

    def get_proxy(self):
        if not self.pool:
            return None
        return random.choice(self.pool)

我们可以通过add_proxy方法往代理IP池中添加代理IP,通过get_proxy方法来随机获取一个可用的代理IP。

  1. 动态维护代理IP池

在使用代理IP时,我们需要不断地维护代理IP池,剔除失效的代理IP,添加新的代理IP。

动态维护代理IP池的代码示例:

import time
from threading import Thread

class ProxyPool(object):
    def __init__(self):
        self.pool = []
        self.check_interval = 600  # 代理IP检查周期,单位为秒
        Thread(target=self.check_proxy_loop).start()

    def add_proxy(self, proxy):
        if self.check_proxy(proxy):
            self.pool.append(proxy)

    def check_proxy(self, proxy):
        try:
            res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
            if res.status_code == 200:
                return True
            else:
                return False
        except:
            return False

    def get_proxy(self):
        if not self.pool:
            return None
        return random.choice(self.pool)

    def check_proxy_loop(self):
        while True:
            for proxy in self.pool:
                if not self.check_proxy(proxy):
                    self.pool.remove(proxy)
                    print('{} removed from proxy pool'.format(proxy))
            time.sleep(self.check_interval)

在代理IP池的构造函数中,我们创建了一个线程来循环检查代理IP池中的代理IP。如果检查到某个代理IP失效,则将其从代理IP池中移除,并在控制台输出信息提示。

三、完整代码

import random
import requests
from threading import Thread
import time

class ProxyPool(object):
    def __init__(self):
        self.pool = []
        self.check_interval = 600  # 代理IP检查周期,单位为秒
        Thread(target=self.check_proxy_loop).start()

    def add_proxy(self, proxy):
        if self.check_proxy(proxy):
            self.pool.append(proxy)

    def check_proxy(self, proxy):
        try:
            res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
            if res.status_code == 200:
                return True
            else:
                return False
        except:
            return False

    def get_proxy(self):
        if not self.pool:
            return None
        return random.choice(self.pool)

    def check_proxy_loop(self):
        while True:
            for proxy in self.pool:
                if not self.check_proxy(proxy):
                    self.pool.remove(proxy)
                    print('{} removed from proxy pool'.format(proxy))
            time.sleep(self.check_interval)

def main():
    proxy_pool = ProxyPool()
    url = 'https://www.baidu.com'
    proxy = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
    html = get_html(url, proxy)
    print(html)

if __name__ == '__main__':
    main()

总结

本文介绍了如何使用python爬虫实现代理IP的使用以及代理IP池的建立。在使用代理IP时,我们需要注意代理IP的质量和多样性。在使用代理IP池时,我们需要不断地维护代理IP池,剔除失效的代理IP,添加新的代理IP,以免影响爬虫的性能。

标签:return,Python,IP,self,代理,proxy,pool
From: https://blog.51cto.com/u_16022798/8370025

相关文章

  • TCPIP 协议族
    TCP/IP协议族通常我说TCP/IP是指TCP/IP协议族。它是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合。例如:http、https、ftp、icmp、arp、rarp、smtp(简单邮件传输协议)一个网络请求是怎么传输的?我们拿访问浏览器举个栗子,如图所示:TCP、UDP有什么区别?各有......
  • Python函数参数传递中的可变参数
    Python函数参数传递中*args和**kargs在Python中,*args和**kwargs是用于处理可变数量的参数的特殊语法。*args:*args是一个元组(tuple),它允许你将不定数量的非关键字参数传递给函数。这意味着你可以在函数定义时指定一些参数,同时允许调用函数时传递不同数量的参数。通常用*......
  • iPhone SE 4即将到来:瞄准CQ9更大电子游戏屏幕与现代化设计
    据新消息透露,预计苹果将于2025年推出全新一代iPhoneSE,标志着4代经济型手机的到来。据称,这款新机的外观将与iPhone14非常相似,而且将带来更现代化的设计风格和更大的屏幕畅玩CQ9在线娱乐游戏。据MacRumors的报道,这款新型号iPhoneSE预计将采用与最近发布的iPhone系列相似的平面设......
  • pip用法汇总
    本教程以安装openpyxl包为例pipdownloadopenpyxl,该命令会下载openpyxl包及其依赖的全量离线安装包到当前所在的目录;在当前的目录,找到包含openpyxl的包,安装包以.whl结尾,例如我这里为openpyxl-3.1.2-py2.py3-none-any.whl和依赖包et_xmlfile-1.1.0-py3-none-any.whl;pip......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇
    1.简介前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试,想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单:就是宏哥在网上找了一个问卷调查例子......
  • 【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(字符串)
    [NOIP2011普及组]数字反转题目描述给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。输入格式一个整数。输出格式一个整数,表示反转后的新数。样例#1样例输入#1123样......
  • 代码随想训练营第三十五天打卡(Python)| 860.柠檬水找零、406.根据身高重建队列、452. 用
    860.柠檬水找零classSolution:deflemonadeChange(self,bills:List[int])->bool:five,ten,twenty=0,0,0forbillinbills:ifbill==5:five+=1elifbill==10:iffive......
  • 基于React使用swiperjs实现竖向滚动自动轮播
    很多文章,都只提供了js部分,包括官方的文档也只有js部分,如果css设置不正确,会导致轮播图不自动播放。使用的swiper版本:v11.0.3文档https://swiperjs.com/get-startedhttps://swiperjs.com/react实现效果使用vite创建react应用pnpmcreatevitereact-app--templatereact完整依赖pac......
  • Python离线引入第三方库
    1、将已安装的软件包名称输入到requirements.txt文件中,命令如下pipfreeze>requirements.txt2、在需要下载包的目录下,放入requirements.txt文件,打开cmd命令,执行命令如下:pipdownload-rrequirements.txt-dpackages3、把packages文件夹复制到内网计算机的项目根目录下,执行如......
  • Python速成计划
    目标:帮助零基础学员快速掌握Python编程语言,能够在实际应用中灵活运用Python解决实际问题。学习周期:1个月(以每周5天,每天2小时的学习时间计算)。学习内容:Python基础语法和变量定义(1周)学习内容:了解Python语言的特点,掌握Python的基本语法,包括变量定义、数据类型、条件语句、循环语句......