爬虫工作的时候,让人头疼的不仅仅是被封IP,还有慢得像蜗牛一样的代理IP,每次请求总是让人等的心焦。其实,只要掌握这5个技巧,就可以让你的访问效率提升200%,告别蜗牛,瞬间起飞。
一、给代理做"体检":速度分级筛选
大部分代理IP用起来很慢,其实很可能是"带病上岗",只要把速度最快的20%筛选出来,效率立马就能提升。我们可以用Python代码来测试代理速度:
import requests
from concurrent.futures import ThreadPoolExecutor
import time
def speed_test(proxy):
"""
测试代理的速度。
:param proxy: 代理字典,例如 {'http': 'http://1.2.3.4:5678', 'https': 'http://1.2.3.4:5678'}
:return: 代理的响应时间(秒),如果超时或失败则返回999。
"""
try:
start = time.time()
# 测试访问一个稳定网站(不要用目标网站)
requests.get('http://httpbin.org/ip', proxies=proxy, timeout=3)
return time.time() - start
except:
return 999 # 超时或异常设为极大值
# 假设有100个待测代理
proxy_list = [...] # 代理列表,每个代理是一个字典
with ThreadPoolExecutor(max_workers=20) as executor:
# 并发测试每个代理的速度
speeds = executor.map(speed_test, proxy_list)
# 将代理和其速度打包并排序,取速度最快的前20个
fast_proxies = sorted(zip(proxy_list, speeds), key=lambda x: x[1])[:20]
# 输出结果
for proxy, speed in fast_proxies:
print(f"代理: {proxy}, 响应时间: {speed:.2f}秒")
我们在提取代理IP的时候,顺带检测代理IP的速度,或者维护一个代理IP池,定期进行检测,剔除平均响应时间超过2秒的代理IP,别让他们拖后腿。只用速度更快的代理IP,以一当十,效率更快。
二、请求瘦身:给网络传输"减负"
想象一下,你开着跑车却装满砖头,速度肯定提不起来。很多请求头里带着臃肿的Cookie,就像给跑车增加了不必要的重量。比如这种臃肿的请求头:
# 反面教材(臃肿请求)
headers = {
'User-Agent': 'Mozilla/5.0...',
'Accept-Encoding': 'gzip, deflate, br',
'Cookie': 'a=1; b=2...', # 200个字符的Cookie
'Referer': 'http://...'
}
# 优化方案(极简请求)
lean_headers = {
'User-Agent': 'Mozilla/5.0',
'Accept-Encoding': 'gzip' # 只接受gzip压缩
}
response = requests.get(url, headers=lean_headers, proxies=proxy)
有些请求头里带着超长的Cookie或者一堆不必要的字段,这就像是给跑车装了"行李"。把这些不必要的东西删掉,轻装上阵,实测能减少40%的传输量,速度自然就上来了。
三、连接池魔法:让代理持续"热车"
每次请求都创建新连接,就像每次开车都要重新热车,效率肯定低。连接池可以让代理保持"随时出发"的状态。我们可以用Python代码创建带连接池的Session:
import requests
from requests.adapters import HTTPAdapter
# 创建带连接池的Session
session = requests.Session()
adapter = HTTPAdapter(pool_connections=10, # 每个代理保持10个连接
pool_maxsize=20,
max_retries=2)
session.mount('http://', adapter)
session.mount('https://', adapter)
# 使用示范
with session:
for proxy in fast_proxies:
try:
resp = session.get(url,
proxies=proxy,
timeout=5)
print(resp.text[:100])
except:
pass
四、智能分流:给代理安排"专属车道"
就像医院分诊一样,我们可以根据代理类型分配任务,让它们各司其职。比如:
from collections import defaultdict
# 按代理类型分组
proxy_groups = defaultdict(list)
for proxy in proxy_list:
if ':443' in proxy['https']:
proxy_groups['ssl'].append(proxy)
elif 'socks5' in proxy['http']:
proxy_groups['socks5'].append(proxy)
else:
proxy_groups['http'].append(proxy)
# 分配不同类型任务
def dispatch_tasks():
# 高安全需求走SSL代理
ssl_urls = ['https://bank.com', 'https://pay.example']
# 普通网页走HTTP代理
common_urls = ['http://news.site', 'http://blog.example']
# 需要穿透防火墙走SOCKS5
special_urls = ['http://gov.data']
不同的代理IP有不同的优势,不同的业务有不同的需求。比如HTTPS代理专门处理敏感请求,保证安全;HTTP代理用来处理常规的网页,速度更快;SOCKS5代理用来突破特殊封锁,各司其职,各取所长,这样就能更有效率。
五、动态调速:根据网速自动"换挡"
我们可以用智能算法,当检测到代理变慢时,自动降低它的使用频率。比如:
class SmartProxy:
def __init__(self, proxy):
self.proxy = proxy
self.speed = 1.0 # 初始速度1秒
self.error_count = 0
def adjust_speed(self, new_time):
# 指数移动平均计算速度
self.speed = 0.8*self.speed + 0.2*new_time
if new_time > 5:
self.error_count +=1
else:
self.error_count = max(0, self.error_count-1)
def get_weight(self):
# 计算权重:速度越快、错误越少,权重越高
return 1/(self.speed + 1) * (0.5**self.error_count)
# 使用带权重的随机选择
def choose_proxy(proxy_objs):
weights = [p.get_weight() for p in proxy_objs]
return random.choices(proxy_objs, weights=weights, k=1)[0]
代理IP速度快的时候,就提高权重,让它更多被选中,分配更多的任务;代理IP速度变慢的时候,就降低权重,逐渐冷落它,如果一直慢,就移出代理池。
总结
代理IP并不是越贵越好,而是用得越聪明越好。就像开车,同样的法拉利,在赛车手和菜鸟手里能开出完全不同的速度!