import requests
import random
# 代理池API接口,调用接口自动获取随机有效HTTP代理
PROXY_API = "代理池官方获取接口地址"
def get_random_proxy():
"""从代理池获取随机可用代理"""
res = requests.get(PROXY_API, timeout=5)
proxy_data = res.json()
proxy_ip = f"{proxy_data['ip']}:{proxy_data['port']}"
proxies = {
"http": f"http://{proxy_data['username']}:{proxy_data['password']}@{proxy_ip}",
"https": f"http://{proxy_data['username']}:{proxy_data['password']}@{proxy_ip}"
}
return proxies
def spider_crawl(target_url):
"""带代理池的爬虫请求函数"""
proxies = get_random_proxy()
try:
response = requests.get(target_url, proxies=proxies, timeout=10)
print(f"当前使用代理IP:{proxies['http']},请求状态码:{response.status_code}")
return response.text
except Exception as e:
print(f"代理请求失败,自动更换代理重试:{str(e)}")
return spider_crawl(target_url)
# 调用爬虫
if __name__ == "__main__":
spider_crawl("https://www.baidu.com")编写代理中间件:在middlewares.py文件中自定义代理中间件,请求发起前自动注入代理地址;
开启中间件:在settings.py中启用自定义代理中间件,关闭框架默认的代理配置;
配置代理接口:填入代理池获取地址,实现IP动态轮换。
import requests
from scrapy import signals
class HttpProxyMiddleware:
# 动态获取代理
def get_proxy(self):
resp = requests.get("代理池API地址")
proxy = resp.json()
return f"http://{proxy['username']}:{proxy['password']}@{proxy['ip']}:{proxy['port']}"
# 拦截请求,绑定代理
def process_request(self, request, spider):
request.meta["proxy"] = self.get_proxy()
return None统一协议格式:HTTP代理统一使用http协议转发https请求,切勿填写https代理地址,避免请求链路报错;
开启自动重试机制:网络波动会导致少量代理请求超时,爬虫代码需增加重试逻辑,自动切换新代理;
控制请求频率:即便使用代理池,也需要合理设置请求间隔,避免短时间内大量同节点IP访问同一站点;
优先选用账密认证模式:相比于白名单IP授权,账密认证代理接入更便捷,无需绑定服务器本地公网IP,支持多设备同时调用。

