如何在Python中自动切换代理IP以绕过封IP限制

2023-04-17 00:00:00 切换 代理 绕过

要在Python中自动切换代理IP以避免封IP限制,可以使用第三方模块requests和random模块来帮助实现。

  1. 安装requests模块

如果还没有安装requests模块,可以使用以下命令在终端或命令行界面中安装:

pip install requests
  1. 获取代理IP列表

可以从互联网上找到一些免费的代理IP网站,例如www.89ip.cn。使用requests模块从该网站获取代理IP列表(以HTTP代理为例):

import requests

def get_proxy_list():
    url = 'http://www.89ip.cn/tqdl.html?api=1&num=10&port=&address=&isp='
    response = requests.get(url)
    if response.status_code == 200:
        proxy_list = []
        rows = response.text.strip().split('\n')[1:]
        for row in rows:
            parts = row.strip().split(':')
            proxy = f'http://{parts[0]}:{parts[1]}'
            proxy_list.append(proxy)
        return proxy_list
    else:
        return None

该函数会从http://www.89ip.cn网站获取10个免费代理IP(可以自行修改num参数),并将其保存在一个列表中。

  1. 使用代理IP进行请求

接下来,可以使用这些代理IP进行请求,并在请求失败时切换到下一个代理IP。使用random模块可以随机选择下一个代理IP。

import requests
import random

def get_page(url, proxy_list):
    while len(proxy_list) > 0:
        proxy = random.choice(proxy_list)
        try:
            response = requests.get(url, proxies={'http':proxy})
            if response.status_code == 200:
                return response.text
        except:
            proxy_list.remove(proxy)
    return None

该函数将在proxy_list中随机选择一个代理IP,并使用requests模块进行请求。如果请求成功,则返回响应文本。否则,将从代理IP列表中删除此代理IP,并重试请求直到达到最大尝试次数或代理IP列表为空。

  1. 示例代码

下面是完整的代码示例,其中URL为https://www.pidancode.com。

import requests
import random

def get_proxy_list():
    url = 'http://www.89ip.cn/tqdl.html?api=1&num=10&port=&address=&isp='
    response = requests.get(url)
    if response.status_code == 200:
        proxy_list = []
        rows = response.text.strip().split('\n')[1:]
        for row in rows:
            parts = row.strip().split(':')
            proxy = f'http://{parts[0]}:{parts[1]}'
            proxy_list.append(proxy)
        return proxy_list
    else:
        return None

def get_page(url, proxy_list):
    max_retry_times = 3
    while len(proxy_list) > 0 and max_retry_times > 0:
        proxy = random.choice(proxy_list)
        try:
            response = requests.get(url, proxies={'http':proxy})
            if response.status_code == 200:
                return response.text
        except:
            proxy_list.remove(proxy)
            max_retry_times -= 1
    return None

if __name__ == '__main__':
    url = 'https://www.pidancode.com'
    proxy_list = get_proxy_list()
    page = get_page(url, proxy_list)
    if page:
        print(page)
    else:
        print('Failed to get page')

运行代码时,如果成功获取到页面内容,则会将页面内容打印到控制台。否则,将显示“Failed to get page”。

相关文章