python爬虫学习进程(四)

Python 爬虫中代理的使用

1. 为什么需要使用代理?

在爬虫工作中,频繁使用同一 IP 地址向目标服务器发起请求容易被识别为爬虫行为,可能导致:

  • IP 被封禁:服务器拒绝该 IP 的后续请求。
  • 访问频率限制:限制单位时间内来自同一 IP 的请求数量。
  • 验证码挑战:要求用户输入验证码以证明非机器人操作。

使用代理服务器可以:

  1. 隐藏真实 IP:目标服务器看到的是代理服务器的 IP。
  2. 绕过 IP 限制:通过更换代理 IP 来规避封禁或频率限制。
  3. 访问地域限制内容:选择特定地区的代理 IP 来访问地理限制的内容。
  4. 提高匿名性:增加追踪真实用户身份的难度。

2. 代理的类型

常见的代理协议包括:

  • HTTP 代理:主要用于 HTTP 流量。
  • HTTPS 代理:主要用于 HTTPS 流量(也常能处理 HTTP)。
  • SOCKS 代理:通用性更强,可处理各种类型流量(HTTP, HTTPS, FTP 等)。常见版本有 SOCKS4 和 SOCKS5(支持 UDP 和认证)。

3. Python 中使用代理的方式

3.1 使用 requests

requests 库是最常用的 HTTP 库之一,通过 proxies 参数设置代理。

  • 基本用法

    python 复制代码
    import requests
    
    # 定义代理字典,格式为 {'协议': '代理地址'}
    proxies = {
        'http': 'http://127.0.0.1:8080',  # HTTP 代理
        'https': 'https://127.0.0.1:8080', # HTTPS 代理
    }
    
    try:
        response = requests.get('https://www.example.com', proxies=proxies, timeout=10)
        print(response.text)
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
  • 带认证的代理

    如果代理服务器需要用户名和密码认证:

    python 复制代码
    proxies = {
        'http': 'http://username:password@127.0.0.1:8080',
        'https': 'https://username:password@127.0.0.1:8080',
    }
  • SOCKS 代理

    需要额外安装 requests[socks]

    bash 复制代码
    pip install requests[socks]

    使用方式:

    python 复制代码
    proxies = {
        'http': 'socks5://127.0.0.1:1080',
        'https': 'socks5://127.0.0.1:1080',
    }
3.2 使用 urllib

Python 标准库 urllib 也支持代理。

  • 设置代理

    python 复制代码
    import urllib.request
    
    # 创建代理处理器
    proxy_handler = urllib.request.ProxyHandler({
        'http': 'http://127.0.0.1:8080',
        'https': 'https://127.0.0.1:8080',
    })
    
    # 创建使用代理的 opener
    opener = urllib.request.build_opener(proxy_handler)
    
    # 使用 opener 发送请求
    try:
        response = opener.open('https://www.example.com', timeout=10)
        print(response.read().decode('utf-8'))
    except urllib.error.URLError as e:
        print(f"请求出错: {e}")
  • 带认证的代理

    需要使用 HTTPBasicAuthHandlerProxyBasicAuthHandler(可能需要自定义):

    python 复制代码
    import urllib.request
    
    # 创建密码管理器
    password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    password_mgr.add_password(None, 'http://127.0.0.1:8080', 'username', 'password')
    password_mgr.add_password(None, 'https://127.0.0.1:8080', 'username', 'password')
    
    # 创建认证处理器
    auth_handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
    proxy_handler = urllib.request.ProxyHandler({
        'http': 'http://127.0.0.1:8080',
        'https': 'https://127.0.0.1:8080',
    })
    
    # 组合处理器并创建 opener
    opener = urllib.request.build_opener(proxy_handler, auth_handler)
    
    # 使用 opener
    response = opener.open('https://www.example.com')

4. 代理池的使用

对于大规模爬虫,单个代理不够用,需要代理池来管理多个代理 IP。

代理池的基本思路

  1. 获取代理:从免费代理网站或购买付费代理 API 获取 IP 列表。
  2. 验证代理:定期检测代理是否可用、速度如何、是否匿名。
  3. 存储代理:将验证通过的代理存入数据库(如 Redis)或队列。
  4. 调度使用:爬虫请求时,从代理池中随机或按策略(如轮询)取出一个代理使用。
  5. 异常处理:如果使用代理请求失败(连接超时、返回错误码),将该代理标记为无效或移出池子。

简单示例代码片段

python 复制代码
import requests
from random import choice

# 假设我们有一个从某处获取并验证过的代理列表
proxy_pool = [
    'http://111.111.111.111:8080',
    'http://222.222.222.222:8080',
    'socks5://333.333.333.333:1080',
    # ... 更多代理
]

def get_with_proxy(url):
    while proxy_pool:  # 确保还有代理可用
        proxy = choice(proxy_pool)  # 随机选择一个代理
        proxies = {'http': proxy, 'https': proxy}
        try:
            response = requests.get(url, proxies=proxies, timeout=10)
            if response.status_code == 200:
                return response.text
            else:
                # 非200状态码,可能代理有问题,移除
                proxy_pool.remove(proxy)
        except requests.exceptions.RequestException:
            # 请求异常,代理不可用,移除
            proxy_pool.remove(proxy)
    # 所有代理都试过了还是失败
    raise Exception("没有可用的代理了!")

# 使用
content = get_with_proxy('https://www.targetsite.com')
print(content)

5. 重要注意事项

  1. 代理来源:免费代理不稳定、速度慢、失效快,适合低要求场景。付费代理通常更可靠高效。
  2. 代理质量检测:务必在使用前或定期验证代理的匿名性(是否透露真实 IP)、速度、稳定性。
  3. 错误处理:务必对代理请求失败进行捕获和处理(超时、连接错误、代理拒绝连接等),并做好代理失效的标记或移除。
  4. 遵守规则 :尊重目标网站的 robots.txt 协议,合理控制请求频率,避免对目标服务器造成过大负担。
  5. HTTPS 与证书 :使用 HTTPS 代理时,注意证书验证问题(可能需要设置 verify=False,但这会降低安全性)。
  6. 响应时间:代理会增加请求的响应时间,设置合理的超时时间。

使用代理是爬虫应对反爬机制的重要手段之一。合理选择和轮换代理 IP,结合请求头设置、Cookies 管理等其他技巧,能显著提高爬虫的稳定性和成功率。

相关推荐
Willliam_william几秒前
QEMU学习之路(12)— 使用qemu-system-riscv64测试IOMMU
大数据·学习·elasticsearch
2zcode几秒前
基于Chaboche物理约束与LSTM残差学习的316L不锈钢循环塑性灰箱本构建模研究
学习·机器学习·lstm
E_ICEBLUE2 分钟前
使用 Python 在 PowerPoint 中添加或移除背景(图像与颜色)
python·powerpoint
研究点啥好呢7 分钟前
华为数据分析工程师面试题精选:10道高频考题+答案解析
python·sql·面试·求职招聘
my_daling8 分钟前
DSMC通信协议理解,以及如何在FPGA上实现DSMC从设备(2)
学习·fpga开发
70asunflower10 分钟前
半导体产业的经济逻辑、技术瓶颈与AI芯片格局:一份学习笔记
人工智能·笔记·学习
财经资讯数据_灵砚智能17 分钟前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年4月29日
人工智能·python·信息可视化·自然语言处理·ai编程
凉、介18 分钟前
C 语言类型强转引发的隐蔽内存破坏问题分析
c语言·开发语言·笔记·学习·嵌入式
知识分享小能手20 分钟前
R语言入门学习教程,从入门到精通,R语言分布式数据可视化(6)
学习·信息可视化·r语言
AI玫瑰助手22 分钟前
Python基础:输入input与输出print函数详解
开发语言·windows·python