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 管理等其他技巧,能显著提高爬虫的稳定性和成功率。

相关推荐
知凡D3 分钟前
python脚本打包成exe后,对其引用的日历库实时更新-动态化加载模块
python·测试工具
d111111111d14 分钟前
STM32中USART和UART的区别是什么?
笔记·stm32·单片机·嵌入式硬件·学习
kobe_OKOK_18 分钟前
快递鸟对接发快递后端设计系统
python·django
阿蔹19 分钟前
UI测试自动化-Web-Python-Selenium-2-元素操作、浏览器操作
前端·python·selenium·ui·自动化
Tipriest_22 分钟前
配置用户pip源与查看当前的pip的源的办法
linux·人工智能·python·pip
wdfk_prog36 分钟前
[Linux]学习笔记系列 -- [fs]mbcache
linux·笔记·学习
心前阳光36 分钟前
Unity通过ScriptableObject学习访问者模式
学习·unity·访问者模式
Freshman小白1 小时前
《现代电力电子技术及应用》2025网课答案
学习·答案·网课答案
上天_去_做颗惺星 EVE_BLUE1 小时前
C++学习:学生成绩管理系统
c语言·开发语言·数据结构·c++·学习
雪域迷影1 小时前
使用Python库获取网页时报HTTP 403错误(禁止访问)的解决办法
开发语言·python·http·beautifulsoup·urllib