• 【Python爬虫实战】爬虫封你ip就不会了?ip代理池安排上


    前言

    在进行网络爬取时,使用代理是经常遇到的问题。由于某些网站的限制,我们可能会被封禁或者频繁访问时会遇到访问速度变慢等问题。因此,我们需要使用代理池来避免这些问题。本文将为大家介绍如何使用IP代理池进行爬虫,并带有代码和案例。

    1. 什么是IP代理池

    IP代理池是一种能够动态获取大量代理IP地址的服务,通过不断更新代理IP列表和检测可用性,避免爬虫访问被封禁。代理池通常由多个代理服务器组成,而这些代理服务器提供的IP地址是不断变化的。

    2. 如何使用IP代理池进行爬虫

    使用IP代理池进行爬虫有以下几个步骤:

    2.1 获取代理IP

    获取代理IP的方法有多种,比如购买第三方代理服务、自己搭建代理服务器、爬取免费代理网站等。其中,爬取免费代理网站是最为常见的方法,但是免费代理大多数不稳定,质量也参差不齐,所以购买第三方代理服务或者自己搭建代理服务器会更加可靠。

    2.2 构建代理池

    将获取到的代理IP存储在一个代理池中,通常可以使用List或Queue等数据结构存储,然后按照一定的时间间隔进行检测,将失效的IP进行移除或重新获取新的IP存入池中。

    2.3 在爬虫中使用代理IP

    在爬虫的请求中使用代理IP,可以使用requests库或者Scrapy框架中的代理中间件进行实现。以requests库为例,需要在请求头中添加代理IP,如下所示:

    1. import requests
    2. proxies = {
    3.   'http': 'http://ip:port',
    4.   'https': 'http://ip:port',
    5. }
    6. response = requests.get(url, proxies=proxies)
    2.4 异常处理

    在爬虫的过程中,由于代理IP的稳定性和可用性不同,可能会遇到一些错误或异常情况。比如请求超时、代理IP失效、网络波动等。这时我们需要进行异常处理,可以设置重试请求、更换代理IP等方式来保证程序的正常运行。

    3. 代码实现

    以下是一个简单的IP代理池实现代码:

    1. import requests
    2. import threading
    3. import time
    4. from queue import Queue
    5. # 获取代理IP
    6. def get_proxies():
    7.     # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    8.     url ="https://www.zdaye.com/"
    9.     response = requests.get(url).json()
    10.     return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]
    11. # 测试代理IP是否可用
    12. def test_proxy(proxy, q):
    13.     try:
    14.         proxies = {
    15.           'http': proxy,
    16.           'https': proxy
    17.         }
    18.         response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=5)
    19.         if response.status_code == 200:
    20.             q.put(proxy)
    21.             print(f"{proxy}可用")
    22.     except:
    23.         print(f"{proxy}不可用")
    24. # 构建代理池
    25. def build_proxies_pool():
    26.     proxies_list = get_proxies()
    27.     pool = Queue()
    28.     threads = []
    29.     # 开启多个线程对代理IP进行测试
    30.     for proxy in proxies_list:
    31.         t = threading.Thread(target=test_proxy, args=(proxy, pool))
    32.         threads.append(t)
    33.         t.start()
    34.     for t in threads:
    35.         t.join()
    36.     return pool
    37. # 在爬虫中使用代理IP
    38. def spider_request(url, proxies):
    39.     try:
    40.         response = requests.get(url, proxies={'http': proxies, 'https': proxies}, timeout=5)
    41.         if response.status_code == 200:
    42.             print(response.text)
    43.     except:
    44.         print(f"{proxies}请求失败")
    45. if __name__ == '__main__':
    46.     while True:
    47.         pool = build_proxies_pool()
    48.         if not pool.empty():
    49.             proxies = pool.get()
    50.             spider_request('http://httpbin.org/ip', proxies)
    51.         time.sleep(5)

    4. 案例分析

    以爬取知乎用户信息为例,演示IP代理池的使用。

    1. import requests
    2. import random
    3. import time
    4. # 构造请求头
    5. headers = {
    6.     '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'}
    7. # 获取代理IP
    8. def get_proxies():
    9.     # 这里使用免费代理网站进行获取,实际使用中需要替换成其他方式获取
    10.     url ="https://www.zdaye.com/"
    11.     response = requests.get(url).json()
    12.     return [f"{i['protocol']}://{i['ip']}:{i['port']}" for i in response['data']['data_list']]
    13. # 构造代理池
    14. proxies_pool = get_proxies()
    15. # 爬虫主体程序
    16. def get_user_info(user_url):
    17.     # 从代理池中随机选择一个代理IP
    18.     proxies = random.choice(proxies_pool)
    19.     try:
    20.         response = requests.get(user_url, headers=headers, proxies={'http': proxies, 'https': proxies})
    21.         if response.status_code == 200:
    22.             print(response.text)
    23.     except:
    24.         print(f"{proxies}请求失败")
    25. if __name__ == '__main__':
    26.     user_list = ['https://www.zhihu.com/people/xie-ke-bai-11-86-24-2/followers',
    27.                  'https://www.zhihu.com/people/gong-xin-10-61-53-51/followers',
    28.                  'https://www.zhihu.com/people/y-xin-xin/followers']
    29.     for user_url in user_list:
    30.         get_user_info(user_url)
    31.         time.sleep(5)

    以上是一个简单的知乎用户信息爬虫程序,其中使用了IP代理池,避免了访问速度受限和访问被封禁的问题。

    5. 总结

    本文介绍了如何使用IP代理池避免被封禁和访问受限的问题,通过获取代理IP、构建代理池、在爬虫中使用代理IP以及异常处理等步骤进行实现。同时,结合了一个简单的案例进行演示,希望对大家有所帮助。

  • 相关阅读:
    3. 使用PyTorch深度学习库训练第一个卷积神经网络CNN
    5.Docker 私有库及镜像推送
    解决线程安全问题&&单例模式
    Java基础 --- 注解
    32 道 Spring 常见面试总结(附详细参考答案),我经常拿来面试别人
    Android 13.0 SystemUI下拉状态栏增加响铃功能
    GD32E103 USB官方库 + STM32CubeMX
    SpringMVC学习笔记——2
    sm2加密算法
    脑神经网络构建过程视频,神经网络的构建过程
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/132805025