• 如何在Python爬虫中使用IP代理以避免反爬虫机制


    目录

    前言

    一、IP代理的使用

    1. 什么是IP代理?

    2. 如何获取IP代理?

    3. 如何使用IP代理?

    4. 如何避免IP代理失效?

    5. 代理IP的匿名性

    二、代码示例

    总结


    前言

    在进行爬虫时,我们很容易会遇到反爬虫机制。网站的反爬虫机制可能会限制请求频率、锁定账号、封禁IP等。为了避免反爬虫机制的限制,我们可以使用IP代理来隐藏本机IP地址。本文将介绍如何在Python爬虫中使用IP代理以避免反爬虫机制。

    一、IP代理的使用

    1. 什么是IP代理?

    IP代理是一种将本机IP地址隐藏起来,使用其他IP地址进行网络请求的技术。通过使用IP代理,我们可以避免被网站封禁IP或限制请求频率。

    2. 如何获取IP代理?

    我们可以通过以下几种方式获取IP代理:

    1. 购买付费IP代理:在网络上有许多提供付费IP代理服务的公司,我们可以通过购买这些服务来获取IP代理。
    2. 免费IP代理网站:在网络上也有许多提供免费IP代理的网站,我们可以通过这些网站来获取IP代理,例如:https://www.zdaye.com/。
    3. 自己搭建代理服务器:如果有一台自己的服务器或者VPS,我们可以通过搭建代理服务器来获取IP代理。

    在获取IP代理时,需要注意代理IP的可用性。有些IP代理质量较差或者已经被封禁,需要通过检测代理IP可用性来筛选可用的代理IP。

    3. 如何使用IP代理?

    在Python爬虫中,我们一般使用requests库来进行网络请求。requests库提供了一个proxies参数,可以用来指定使用代理IP进行请求。proxies参数是一个字典,键为代理类型(http或https等),值为代理IP和端口号的字符串,格式为:{‘http’: ‘http://xxx.xxx.xxx.xxx:xxxx’, ‘https’: ‘https://xxx.xxx.xxx.xxx:xxxx’}。下面是使用代理IP进行网络请求的示例代码:

    1. import requests
    2. url = 'http://www.baidu.com'
    3. proxies = {
    4.     'http': 'http://xxx.xxx.xxx.xxx:xxxx',
    5.     'https': 'https://xxx.xxx.xxx.xxx:xxxx'
    6. }
    7. response = requests.get(url, proxies=proxies)

    在这个示例代码中,我们使用requests库向百度发送了一个请求,并通过proxies参数指定使用代理IP进行请求。

    4. 如何避免IP代理失效?

    IP代理有时候会失效或者被封禁,这时候我们需要更换代理IP。下面是一些常用的避免IP代理失效的方法:

    1. 使用多个代理IP进行轮流使用。
    2. 在使用代理IP之前,先检测代理IP的可用性。
    3. 在使用代理IP时,限制请求频率,避免过于频繁的请求。
    4. 在使用代理IP时,尽量模拟人的行为,例如:使用代理IP进行登录时,需要先发送登录页面的请求,获取到登录所需要的参数,再发送登录请求。
    5. 代理IP的匿名性

    IP代理有不同的匿名性等级,分为透明、匿名和高匿,其中高匿的匿名性最高。代理IP提供商一般会说明代理IP的匿名性等级。在使用代理IP时,需要根据需求选择不同匿名性等级的代理IP。

    二、代码示例

    下面给出一个完整的Python爬虫示例代码,包括如何获取IP代理、如何使用IP代理以及如何避免IP代理失效。这个示例代码通过爬取豆瓣电影Top250页面来演示如何使用IP代理。

    1. import requests
    2. from bs4 import BeautifulSoup
    3. import random
    4. import time
    5. import threading
    6. # 获取代理IP
    7. def get_proxies():
    8.     url = 'https://www.zdaye.com/'
    9.     headers = {
    10.         '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'}
    11.     response = requests.get(url, headers=headers)
    12.     soup = BeautifulSoup(response.text, 'html.parser')
    13.     proxy_list = []
    14.     for tr in soup.find_all('tr')[1:]:
    15.         tds = tr.find_all('td')
    16.         ip = tds[1].text.strip()
    17.         port = tds[2].text.strip()
    18.         protocol = tds[5].text.strip().lower()
    19.         proxy = {'protocol': protocol, 'ip': ip, 'port': port}
    20.         proxy_list.append(proxy)
    21.     return proxy_list
    22. # 检测代理IP可用性
    23. def check_proxy(proxy, protocol='http'):
    24.     proxies = {protocol: protocol + '://' + proxy['ip'] + ':' + proxy['port']}
    25.     headers = {
    26.         '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'}
    27.     try:
    28.         response = requests.get('http://www.baidu.com', headers=headers, proxies=proxies, timeout=10)
    29.         if response.status_code == 200:
    30.             print(proxy, 'is OK')
    31.             return True
    32.         else:
    33.             print(proxy, 'is not OK')
    34.             return False
    35.     except Exception as e:
    36.         print(proxy, 'is not OK', e)
    37.         return False
    38. # 获取页面HTML
    39. def get_html(url, proxies=None):
    40.     headers = {
    41.         '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'}
    42.     try:
    43.         response = requests.get(url, headers=headers, proxies=proxies)
    44.         response.raise_for_status()
    45.         response.encoding = response.apparent_encoding
    46.         return response.text
    47.     except Exception as e:
    48.         print(e)
    49.         return None
    50. # 获取电影信息
    51. def get_movie_info(html):
    52.     soup = BeautifulSoup(html, 'html.parser')
    53.     movie_list = soup.find_all('div', class_='info')
    54.     for movie in movie_list:
    55.         title = movie.find('span', class_='title').text.strip()
    56.         rating = movie.find('span', class_='rating_num').text.strip()
    57.         print(title, rating)
    58.     return len(movie_list)
    59. # 主函数
    60. def main():
    61.     # 获取代理IP列表
    62.     proxy_list = get_proxies()
    63.     # 筛选可用代理IP
    64.     usable_proxies = []
    65.     for proxy in proxy_list:
    66.         if check_proxy(proxy):
    67.             usable_proxies.append(proxy)
    68.     # 如果可用代理IP为空,则退出程序
    69.     if len(usable_proxies) == 0:
    70.         print('No usable proxies')
    71.         return
    72.     # 循环使用代理IP爬取页面
    73.     url = 'https://movie.douban.com/top250'
    74.     count = 0
    75.     while count < 5:
    76.         # 随机选择一个可用的代理IP
    77.         proxy = random.choice(usable_proxies)
    78.         # 获取页面HTML
    79.         html = get_html(url, proxies={proxy['protocol']: proxy['protocol'] + '://' + proxy['ip'] + ':' + proxy['port']})
    80.         # 如果获取页面HTML失败,则更换代理IP
    81.         while not html:
    82.             print(f'{proxy} failed, try another proxy')
    83.             usable_proxies.remove(proxy)
    84.             if len(usable_proxies) == 0:
    85.                 print('No usable proxies')
    86.                 return
    87.             proxy = random.choice(usable_proxies)
    88.             html = get_html(url, proxies={proxy['protocol']: proxy['protocol'] + '://' + proxy['ip'] + ':' + proxy['port']})
    89.         # 解析页面HTML
    90.         count += get_movie_info(html)
    91.         # 每隔5秒获取一次页面
    92.         time.sleep(5)
    93.     print('Done!')
    94. if __name__ == '__main__':
    95.     main()

    在这个示例代码中,首先使用get_proxies函数获取代理IP列表,然后使用check_proxy函数筛选出可用的代理IP,并保存到usable_proxies列表中。接着在循环中随机选择一个可用的代理IP,使用get_html函数获取页面HTML。如果获取页面HTML失败,则更换代理IP,直到获取成功。使用get_movie_info函数解析页面HTML,获取电影信息。每隔5秒获取一次页面,总计获取5次页面。

    总结

    在Python爬虫中使用IP代理可以避免反爬虫机制,通过获取代理IP并使用代理IP进行网络请求,从而隐藏本机IP地址,避免被网站封禁IP或限制请求频率。可以使用付费IP代理、免费IP代理网站或自己搭建代理服务器获取IP代理。在使用代理IP时,需要注意代理IP的可用性、匿名性等级以及避免IP代理失效的方法。使用IP代理可以有效提高爬虫的稳定性和可用性。

  • 相关阅读:
    webrtc 安卓端多人视频会议
    一台机器下,多个Java版本的粗放与精细管理
    C++字符串操作【超详细】
    (附源码)计算机毕业设计Java宠物销售管理系统
    信号与线性系统分析(吴大正,郭宝龙)(5-系统定义与典型系统)
    LeetCode.39. 组合总和
    前端测试:自动化测试知识扫盲
    Python3的安裝
    【框架学习 | 第五篇】SpringMVC(常用注解、获取请求参数、域对象共享数据、拦截器、异常处理、上传/下载文件)
    vscode 乱码解决
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/134246464