Python爬虫定义代理字典,key需与请求协议严格对应

2026-07-20 01:09:59 102阅读
针对Python网络爬虫的代理使用给出配置细节与状态说明,核心要求明确:定义代理字典时,其key必须与后续待发起的对应请求协议(如常规使用的http、https小写写法)严格匹配,否则易引发代理识别失败、无法正常调用的问题;状态说明方面,提及本次或当前配置语境下,爬虫所使用的代理IP保持未变。

Python爬虫代理从入门到实战:解决反爬、高效稳定采集数据


在网络爬虫开发中,“IP被封”几乎是每个开发者都会遇到的难题——当我们用同一个IP频繁访问目标网站时,很容易触发反爬机制,导致请求被拒绝,这时候,Python爬虫代理就成了破局的关键:通过代理IP隐藏真实地址,分散访问压力,能大幅提升爬虫的稳定性和成功率。

Python爬虫定义代理字典,key需与请求协议严格对应

先搞懂:代理IP是什么?有哪些类型?

在讲Python如何使用代理前,我们先明确两个核心概念:

什么是代理IP?

简单说,代理IP就是一个“中转站”:你的爬虫请求先发给代理服务器,代理服务器再转发给目标网站,目标网站看到的是代理的IP,而不是你的真实IP。

代理的常见类型(按协议和匿名度分)

  • 按协议分

    • HTTP代理:仅支持HTTP请求;
    • HTTPS代理:支持加密的HTTPS请求(现在大部分网站用HTTPS,优先选这类);
    • SOCKS5代理:更通用,支持TCP/UDP协议,不仅能爬网页,还能处理其他网络请求。
  • 按匿名度分

    • 透明代理:会暴露你的真实IP,完全不适合爬虫;
    • 匿名代理:隐藏真实IP,但会告诉网站“用了代理”,部分网站仍会拦截;
    • 高匿代理(Elite Proxy):既隐藏真实IP,又不透露使用代理,是爬虫的首选!

Python用代理的基础:requests库实现

requests是Python最常用的HTTP请求库,配置代理非常简单。

单个代理的基础使用

假设你有一个高匿代理IP(比如45.67.89:8080),代码如下:

import requests
proxies = {
    'http': 'http://123.45.67.89:8080',  # 对应HTTP请求
    'https': 'https://123.45.67.89:8080' # 对应HTTPS请求
}
url = 'https://httpbin.org/ip'  # 测试网站,返回当前访问的IP
try:
    response = requests.get(url, proxies=proxies, timeout=5)
    print('代理访问成功,当前IP:', response.json())
except Exception as e:
    print('代理访问失败:', e)

如果代理有效,返回的IP就是你的代理IP,而不是真实IP。

进阶:Scrapy框架如何配置代理?

Scrapy是专业的爬虫框架,批量采集时常用,配置代理有两种方式:

简单配置(settings.py)

在Scrapy项目的settings.py中添加:

# 配置代理(如果是付费代理带账号密码,格式是http://user:pass@ip:port)
HTTP_PROXY = 'http://123.45.67.89:8080'
HTTPS_PROXY = 'https://123.45.67.89:8080'

但这种方式只能用单个代理,不适合批量采集。

自定义代理中间件(推荐)

写一个中间件,让请求随机使用代理池中的IP:

  • 第一步,在项目的middlewares.py中添加:
    import random

class RandomProxyMiddleware: def init(self, proxy_list): self.proxy_list = proxy_list

@classmethod
def from_crawler(cls, crawler):
    # 从settings中读取代理列表
    proxy_list = crawler.settings.getlist('PROXY_LIST')
    return cls(proxy_list)
def process_request(self, request, spider):
    # 随机选择一个代理
    proxy = random.choice(self.proxy_list)
    request.meta['proxy'] = proxy
    spider.logger.info(f'使用代理:{proxy}')
- 第二步,在`settings.py`中启用中间件并配置代理列表:
```python
PROXY_LIST = [
    'http://123.45.67.89:8080',
    'http://98.76.54.32:8080',
    # 更多代理...
]
DOWNLOADER_MIDDLEWARES = {
    # 替换默认的代理中间件,数字越小优先级越高
    '你的项目名.middlewares.RandomProxyMiddleware': 543,
}

关键升级:怎么搞到稳定的代理池?

单个代理很容易失效,所以需要代理池——多个代理IP循环使用,这里讲两种常见方案:

免费代理(适合测试)

免费代理IP可以从“快代理”“西刺代理”等网站获取,但缺点是不稳定、失效快,我们可以写个小脚本先爬取免费代理,再验证有效性:

import requests
from bs4 import BeautifulSoup
def get_free_proxies():
    url = 'https://www.xicidaili.com/nn/'  # 西刺高匿代理页
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    proxies = []
    for tr in soup.find_all('tr')[1:]:
        tds = tr.find_all('td')
        ip = tds[1].text
        port = tds[2].text
        proxy = f'http://{ip}:{port}'
        proxies.append(proxy)
    return proxies
def verify_proxy(proxy):
    # 验证代理是否有效
    try:
        response = requests.get('https://httpbin.org/ip', proxies={'http': proxy, 'https': proxy}, timeout=3)
        if response.status_code == 200:
            return True
    except:
        return False
# 获取并验证免费代理
free_proxies = get_free_proxies()
valid_proxies = [p for p in free_proxies if verify_proxy(p)]
print('有效代理:', valid_proxies)

付费代理(适合长期使用)

如果需要稳定采集,建议用付费代理(比如阿布云、快代理付费版、极光代理等),付费代理一般提供API接口,能直接获取有效的高匿代理,我们可以动态调用API更新代理池:

import requests
def get_paid_proxies(api_url):
    # 调用付费代理API获取代理
    response = requests.get(api_url)
    proxies = response.text.strip().split('\n')
    return [f'http://{p}' for p in proxies if p]
# 假设你的API地址(替换为实际API)
api = 'https://api.example.com/get_proxy?num=10'
paid_proxies = get_paid_proxies(api)
print('付费代理:', paid_proxies)

实战示例:用代理爬取测试网站

我们结合上面的知识,写一个完整的小爬虫:

import requests
import random
import time
# 假设这是验证后的有效代理池
proxy_pool = [
    'http://123.45.67.89:8080',
    'http://98.76.54.32:8080',
    'http://11.22.33.44:8080'
]
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
for i in range(5):
    # 随机选代理
    proxy = random.choice(proxy_pool)
    proxies = {'http': proxy, 'https': proxy}
    try:
        response = requests.get('https://httpbin.org/ip', proxies=proxies, headers=headers, timeout=5)
        print(f'第{i+1}次请求,代理:{proxy},返回IP:{response.json()["origin"]}')
    except Exception as e:
        print(f'第{i+1}次请求失败:', e)
    time.sleep(2)  # 加延迟,避免频繁请求

使用代理的注意事项

  1. 遵守规则:一定要遵守目标网站的robots.txt协议,不要爬取禁止采集的内容;
  2. 控制频率:即使有代理,也不要无限快地请求,加延迟、控制并发数,避免给目标网站造成压力;
  3. 及时更新代理池:无论是免费还是付费代理,都会失效,要定期验证和更新;
  4. 处理异常:代码中一定要加try-except捕获超时、连接失败等异常,避免爬虫中断。

Python爬虫代理是解决反爬的核心手段之一:从基础的requests单个代理,到Scrapy的代理中间件,再到动态代理池,不同场景用不同方案,新手可以先从免费代理测试入手,长期稳定采集建议用付费代理,同时一定要合法合规使用,才能让爬虫走得更远。

如果你有更多关于Python爬虫代理的问题,欢迎在评论区交流!

文章版权声明:除非注明,否则均为亚朵原创文章,转载或复制请以超链接形式并注明出处。