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


    目录

    前言

    一、代理IP

    1. 代理IP的获取

    2. 代理IP的验证

    3. 代理IP的使用

    二、建立代理IP池

    1. 代理IP池的建立

    2. 动态维护代理IP池

    三、完整代码

    总结


    前言

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

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

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

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


    一、代理IP

    1. 代理IP的获取

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

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

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

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

    验证代理IP的代码如下:

    1. import requests
    2. def check_proxy(proxy):
    3.     try:
    4.         res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
    5.         if res.status_code == 200:
    6.             return True
    7.         else:
    8.             return False
    9.     except:
    10.         return False

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

    3. 代理IP的使用

    使用代理IP的代码如下:

    1. import requests
    2. def get_html(url, proxy):
    3.     headers = {
    4.         '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'}
    5.     try:
    6.         res = requests.get(url, headers=headers, proxies=proxy, timeout=5)
    7.         if res.status_code == 200:
    8.             return res.text
    9.         else:
    10.             return None
    11.     except:
    12.         return None

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


    二、建立代理IP池

    1. 代理IP池的建立

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

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

    1. import random
    2. import requests
    3. class ProxyPool(object):
    4.     def __init__(self):
    5.         self.pool = []
    6.     def add_proxy(self, proxy):
    7.         if self.check_proxy(proxy):
    8.             self.pool.append(proxy)
    9.     def check_proxy(self, proxy):
    10.         try:
    11.             res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
    12.             if res.status_code == 200:
    13.                 return True
    14.             else:
    15.                 return False
    16.         except:
    17.             return False
    18.     def get_proxy(self):
    19.         if not self.pool:
    20.             return None
    21.         return random.choice(self.pool)

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

    2. 动态维护代理IP池

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

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

    1. import time
    2. from threading import Thread
    3. class ProxyPool(object):
    4.     def __init__(self):
    5.         self.pool = []
    6.         self.check_interval = 600  # 代理IP检查周期,单位为秒
    7.         Thread(target=self.check_proxy_loop).start()
    8.     def add_proxy(self, proxy):
    9.         if self.check_proxy(proxy):
    10.             self.pool.append(proxy)
    11.     def check_proxy(self, proxy):
    12.         try:
    13.             res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
    14.             if res.status_code == 200:
    15.                 return True
    16.             else:
    17.                 return False
    18.         except:
    19.             return False
    20.     def get_proxy(self):
    21.         if not self.pool:
    22.             return None
    23.         return random.choice(self.pool)
    24.     def check_proxy_loop(self):
    25.         while True:
    26.             for proxy in self.pool:
    27.                 if not self.check_proxy(proxy):
    28.                     self.pool.remove(proxy)
    29.                     print('{} removed from proxy pool'.format(proxy))
    30.             time.sleep(self.check_interval)

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

    三、完整代码

    1. import random
    2. import requests
    3. from threading import Thread
    4. import time
    5. class ProxyPool(object):
    6.     def __init__(self):
    7.         self.pool = []
    8.         self.check_interval = 600  # 代理IP检查周期,单位为秒
    9.         Thread(target=self.check_proxy_loop).start()
    10.     def add_proxy(self, proxy):
    11.         if self.check_proxy(proxy):
    12.             self.pool.append(proxy)
    13.     def check_proxy(self, proxy):
    14.         try:
    15.             res = requests.get('http://www.baidu.com', proxies=proxy, timeout=5)
    16.             if res.status_code == 200:
    17.                 return True
    18.             else:
    19.                 return False
    20.         except:
    21.             return False
    22.     def get_proxy(self):
    23.         if not self.pool:
    24.             return None
    25.         return random.choice(self.pool)
    26.     def check_proxy_loop(self):
    27.         while True:
    28.             for proxy in self.pool:
    29.                 if not self.check_proxy(proxy):
    30.                     self.pool.remove(proxy)
    31.                     print('{} removed from proxy pool'.format(proxy))
    32.             time.sleep(self.check_interval)
    33. def main():
    34.     proxy_pool = ProxyPool()
    35.     url = 'https://www.baidu.com'
    36.     proxy = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
    37.     html = get_html(url, proxy)
    38.     print(html)
    39. if __name__ == '__main__':
    40.     main()

    总结

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

  • 相关阅读:
    promise原理
    Object.defineProperty基本用法
    vue实现按需加载的多种方式
    架构师必修设计模式——结构型模式
    SpringCloud gateway自定义请求的 httpClient
    离线安装腾讯x5内核(附安装包下载地址)
    el-table自适应列宽实现
    【实战技能】初级软件开发工程师常见问题
    java中的Properties配置文件操作[61]
    蓝桥杯倒计时 36天-DFS练习2
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/134397503