Python爬虫定义代理字典,key需与请求协议严格对应
针对Python网络爬虫的代理使用给出配置细节与状态说明,核心要求明确:定义代理字典时,其key必须与后续待发起的对应请求协议(如常规使用的http、https小写写法)严格匹配,否则易引发代理识别失败、无法正常调用的问题;状态说明方面,提及本次或当前配置语境下,爬虫所使用的代理IP保持未变。
Python爬虫代理从入门到实战:解决反爬、高效稳定采集数据
在网络爬虫开发中,“IP被封”几乎是每个开发者都会遇到的难题——当我们用同一个IP频繁访问目标网站时,很容易触发反爬机制,导致请求被拒绝,这时候,Python爬虫代理就成了破局的关键:通过代理IP隐藏真实地址,分散访问压力,能大幅提升爬虫的稳定性和成功率。
先搞懂:代理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) # 加延迟,避免频繁请求
使用代理的注意事项
- 遵守规则:一定要遵守目标网站的
robots.txt协议,不要爬取禁止采集的内容; - 控制频率:即使有代理,也不要无限快地请求,加延迟、控制并发数,避免给目标网站造成压力;
- 及时更新代理池:无论是免费还是付费代理,都会失效,要定期验证和更新;
- 处理异常:代码中一定要加
try-except捕获超时、连接失败等异常,避免爬虫中断。
Python爬虫代理是解决反爬的核心手段之一:从基础的requests单个代理,到Scrapy的代理中间件,再到动态代理池,不同场景用不同方案,新手可以先从免费代理测试入手,长期稳定采集建议用付费代理,同时一定要合法合规使用,才能让爬虫走得更远。
如果你有更多关于Python爬虫代理的问题,欢迎在评论区交流!

