• 【Python爬虫笔记】爬虫代理IP与访问控制


    一、前言

    在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方案之一。

    本文主要介绍如何在爬虫程序中使用代理IP以应对反爬虫机制,以及如何进行访问控制,保障程序的正常运行。

    二、什么是代理IP

    代理IP即为代理服务器的IP地址,在爬虫程序中,我们可以使用代理IP来隐藏真实的IP地址,从而达到访问网站的目的。使用代理IP可以解决以下问题:

    1. 突破访问限制:有些网站会限制某些地区的访问,使用代理IP可以突破这些限制。
    2. 绕过反爬虫机制:有些网站会根据同一IP访问频率的高低来判断是否为爬虫行为,使用代理IP可以隐藏真实IP地址,从而防止被封禁或检测。
    3. 提高访问速度:使用代理IP可以使得请求被代理服务器缓存,从而提高访问速度。

    三、如何获取代理IP

    有许多免费或收费的代理IP提供商,我们可以在这些网站上获取代理IP,这里推荐一个:

    站大爷代理ip:https://www.zdaye.com

    获取代理IP后,我们需要进行有效性检测、筛选和存储,以确保代理IP的可用性。

    下面是一个Python代码示例,可以实现对代理IP的有效性检测并存储可用的代理IP:

    1. import requests
    2. import time
    3. def check_proxy(proxy):
    4.     """
    5.     检测代理IP的有效性
    6.     :param proxy: 代理IP
    7.     :return: True or False
    8.     """
    9.     proxies = {
    10.         'http': proxy,
    11.         'https': proxy,
    12.     }
    13.     try:
    14.         response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)
    15.         if response.status_code == 200:
    16.             return True
    17.         else:
    18.             return False
    19.     except:
    20.         return False
    21. def save_proxy(ip, port, protocol='http'):
    22.     """
    23.     存储可用代理IP
    24.     :param ip: IP地址
    25.     :param port: 端口号
    26.     :param protocol: 协议类型
    27.     :return: None
    28.     """
    29.     with open('proxies.txt', 'a+', encoding='utf-8') as f:
    30.         f.write('{}://{}:{}\n'.format(protocol, ip, port))
    31. def main():
    32.     for page in range(1, 11):  # 获取前10页的代理IP
    33.         url = 'https://www.zdaye.com/nn/{}'.format(page)
    34.         headers = {
    35.             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
    36.                           'Chrome/89.0.4389.82 Safari/537.36'
    37.         }
    38.         response = requests.get(url, headers=headers)
    39.         if response.status_code == 200:
    40.             html = response.text
    41.             proxy_list = html.split('\n')
    42.             for proxy in proxy_list:
    43.                 if proxy:
    44.                     ip = proxy.split(':')[0]
    45.                     port = proxy.split(':')[1]
    46.                     if check_proxy(proxy):
    47.                         save_proxy(ip, port)
    48. if __name__ == '__main__':
    49.     main()
    50.     print('Done!')

    上述代码使用了requests库来请求代理IP网站,获取到代理IP后进行有效性检测,并将可用的代理IP存储到本地文件中。

    四、如何应用代理IP

    在爬虫程序中使用代理IP,可以使用requests库提供的proxies参数,示例代码如下:

    1. import requests
    2. def get_page(url, proxy):
    3.     """
    4.     使用代理IP请求网页
    5.     :param url: 网页url
    6.     :param proxy: 代理IP
    7.     :return: 网页内容
    8.     """
    9.     proxies = {
    10.         'http': proxy,
    11.         'https': proxy,
    12.     }
    13.     headers = {
    14.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
    15.                       'Chrome/89.0.4389.82 Safari/537.36'
    16.     }
    17.     try:
    18.         response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
    19.         if response.status_code == 200:
    20.             return response.text
    21.         else:
    22.             return None
    23.     except:
    24.         return None
    25. def main():
    26.     url = 'https://www.baidu.com/'
    27.     proxy = 'http://121.69.46.218:9000'
    28.     page = get_page(url, proxy)
    29.     print(page)
    30. if __name__ == '__main__':
    31.     main()

    上述代码使用了requests库提供的proxies参数,将代理IP传入访问请求中,从而实现了使用代理IP请求网页的功能。

    五、如何进行访问控制

    在使用代理IP进行访问时,我们需要进行访问控制,以确保程序的正常运行。具体来说,我们可以通过以下方式进行访问控制:

    1. 控制请求频率:通过设置时间间隔、请求次数等方式,控制爬虫的访问速度,避免给网站带来过大的压力。
    2. 轮流使用代理IP:通过存储多个可用的代理IP,并轮流使用它们,以分散访问压力。
    3. 随机使用代理IP:从可用代理IP池中随机选择一个进行使用,增加反爬虫的难度。

    下面是一个Python代码示例,可以实现访问控制并轮流使用代理IP:

    1. import requests
    2. import time
    3. def get_proxy():
    4.     """
    5.     从代理IP池中取出一个代理IP
    6.     :return: 代理IP
    7.     """
    8.     proxy_list = []
    9.     with open('proxies.txt', 'r', encoding='utf-8') as f:
    10.         for line in f:
    11.             proxy = line.strip()
    12.             proxy_list.append(proxy)
    13.     return proxy_list[0]
    14. def check_proxy(proxy):
    15.     """
    16.     检测代理IP的有效性
    17.     :param proxy: 代理IP
    18.     :return: True or False
    19.     """
    20.     proxies = {
    21.         'http': proxy,
    22.         'https': proxy,
    23.     }
    24.     try:
    25.         response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)
    26.         if response.status_code == 200:
    27.             return True
    28.         else:
    29.             return False
    30.     except:
    31.         return False
    32. def save_proxy(ip, port, protocol='http'):
    33.     """
    34.     存储可用代理IP
    35.     :param ip: IP地址
    36.     :param port: 端口号
    37.     :param protocol: 协议类型
    38.     :return: None
    39.     """
    40.     with open('proxies.txt', 'a+', encoding='utf-8') as f:
    41.         f.write('{}://{}:{}\n'.format(protocol, ip, port))
    42. def rotate_proxy():
    43.     """
    44.     从代理IP池中轮流取出一个代理IP
    45.     :return: 代理IP
    46.     """
    47.     proxy_list = []
    48.     with open('proxies.txt', 'r', encoding='utf-8') as f:
    49.         for line in f:
    50.             proxy = line.strip()
    51.             proxy_list.append(proxy)
    52.     while True:
    53.         for proxy in proxy_list:
    54.             yield proxy
    55. def main():
    56.     proxy_generator = rotate_proxy()
    57.     headers = {
    58.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
    59.                       'Chrome/89.0.4389.82 Safari/537.36'
    60.     }
    61.     for i in range(10):  # 控制访问次数
    62.         proxy = next(proxy_generator)
    63.         while not check_proxy(proxy):  # 检测代理IP是否可用
    64.             proxy = next(proxy_generator)
    65.         try:
    66.             url = 'https://www.baidu.com/'
    67.             response = requests.get(url, headers=headers, proxies={'http': proxy, 'https': proxy}, timeout=10)
    68.             if response.status_code == 200:
    69.                 print(response.text)
    70.         except:
    71.             pass
    72.         time.sleep(1)  # 控制请求间隔
    73. if __name__ == '__main__':
    74.     main()
    75.     print('Done!')

    上述代码使用了生成器和yield语句实现了轮流取出可用代理IP的功能,并增加了时间间隔控制,确保爬虫程序不会过于频繁地请求。同时,代码也实现了对代理IP的有效性检测,确保使用的代理IP都是可用的。

    六、总结

    本文主要介绍了如何在爬虫程序中使用代理IP进行反爬虫机制的应对,以及如何进行访问控制,保障程序的正常运行。实现代理IP使用和访问控制需要理解网络爬虫的原理和反爬虫机制,同时应当遵守网站的访问规则,以确保不会对网站造成过大的负担。

  • 相关阅读:
    Docker自定义镜像
    【Rust日报】2023-10-02 改进 Rust 宏中的自动完成功能
    c++ 类修饰指针
    金仓数据库KingbaseES客户端编程接口指南-ado.net(3. KingbaseES 驱动在 .NET 平台的配置)
    开啥玩笑?一个SSD硬盘可以使用100多年?MTBF正解
    一般做家庭用电的考什么样式的电工证?应急管理厅低压电工
    MySql——sql优化
    磨金石教育插画技能干货分享|插画怎么配色才好看?
    3DGS语义分割之LangSplat
    大连大学计算机考研资料汇总
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/132689944