Requests库代理设置手把手教学
咱们用Python做数据采集时,经常遇到网站反爬的情况。这时候代理IP就是救命稻草了。举个真实场景:你要抓某电商平台价格,连续访问几十次后IP就被封了。这时候在requests请求里加上代理参数,立马就能原地复活。
import requests
proxies = {
'http': 'http://用户名:密码@proxy.ipipgo.com:端口',
'https': 'http://用户名:密码@proxy.ipipgo.com:端口'
}
resp = requests.get('https://目标网站.com', proxies=proxies)
重点提醒:这里要特别注意代理格式里的用户名密码,很多新手会漏掉http://
前缀。如果用的是ipipgo的私密代理,记得在后台生成专属认证信息,他们家的动态IP存活时间比别家长,实测能多用2-3小时。
动态代理池实战技巧
单个代理IP容易被识别,咱们得搞个代理池轮换着用。这里有个小诀窍——用Session对象保持会话,同时随机切换代理。看这段代码:
from requests.sessions import Session
import random
class SmartSession(Session):
def __init__(self, proxy_list):
super().__init__()
self.proxy_pool = proxy_list 这里放ipipgo提供的多个代理地址
def request(self, method, url, kwargs):
kwargs['proxies'] = {'http': random.choice(self.proxy_pool)}
return super().request(method, url, kwargs)
使用示例
proxy_list = [
'http://ipipgo_user1:pass123@111.222.33.44:8000',
'http://ipipgo_user1:pass123@112.113.114.115:8000'
]
smart = SmartSession(proxy_list)
response = smart.get('https://需要采集的网站')
这样每次请求都会随机选个代理,网站的风控系统就难识别了。建议用ipipgo的动态住宅代理,他们的IP池每天更新20万+地址,亲测封禁率比普通机房IP低6成。
代理异常处理三板斧
用代理最头疼的就是各种连接错误,这里教大家三个必杀技:
1. 超时重试机制
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount('https://', adapter)
2. 代理有效性验证
每次使用前先ping一下代理服务器,避免带着死代理发请求。ipipgo的API可以直接查剩余流量和IP状态,比传统方法快得多。
3. 异常日志记录
建议用try-except块包裹请求代码,把出错的代理IP记下来。ipipgo后台有实时监控面板,能直接看到哪些代理节点响应慢,方便及时更换。
实战QA答疑
Q:代理设置成功了但请求还是被网站拦截?
A:八成是用了低质量的透明代理,换成ipipgo的高匿代理,记得检查请求头里的X-Forwarded-For字段是否暴露真实IP。
Q:代理速度特别慢怎么办?
A:先测速选节点,ipipgo客户端自带延迟测试功能。如果走HTTP代理,可以启用requests的流式传输:stream=True
参数能提升大文件下载速度。
Q:需要同时用国内和海外代理怎么办?
A:在proxies字典里分协议指定,比如国内走http代理,海外走https代理。ipipgo支持按地域筛选节点,直接在API参数加country=us
就能调取美国IP。
进阶玩法:代理性能优化
给老司机们分享个压箱底的技巧——用连接池提升吞吐量。配合ipipgo的企业级代理套餐,实测并发性能提升4倍:
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
自定义SSL上下文
ctx = create_urllib3_context()
ctx.load_default_certs()
创建带连接池的Session
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
pool_connections=50,
pool_maxsize=100,
max_retries=3
)
session.mount('https://', adapter)
这样设置后,requests会复用TCP连接,特别适合需要高频请求的场景。记得在ipipgo后台开启”长连接模式”,他们的代理服务器支持keep-alive,比普通代理省30%握手时间。
最后唠叨一句,选代理服务别光看价格。像ipipgo这种带智能路由技术的,能自动选择最优线路。上次做竞品分析,他们的亚洲节点响应速度能稳定在80ms以内,比二线品牌快一倍不止。