爬虫代理服务器配置 python 爬虫代理搭建使用方法

写爬虫代码的人,早晚都会碰到IP被封禁的情况。代码在本地调试正常,部署到服务器之后,一旦请求量上去,目标网站就返回403状态码或者直接请求超时。这时往爬虫里加入代理是常用解决办法,但接入代理之后会冒出各类报错,ProxyError、连接超时、407认证失败,随便一个都要耗费不少时间排查。

Python里添加代理最简单的方式,就是使用requests库自带的proxies参数。写法示例:proxies = {'http': 'http://127.0.0.1:8080', 'https': 'https://127.0.0.1:8080'},之后调用requests.get(url, proxies=proxies)。http与https协议需要分开配置,就算代理两种协议共用同一个端口,requests不会自动做映射处理。如果代理需要账号密码认证,可以把账号密码写进链接地址,格式http://user:pass@host:port;也可以单独传入HTTPProxyAuth作为auth参数。后者写法更干净,密码包含特殊字符时不容易出错。

爬虫代理服务器配置 python 爬虫代理搭建使用方法

只在单次请求配置代理不够实用。爬虫一般会连续发起几十上百次请求,每次调用get都手动传入proxies会很繁琐。可以创建Session实例绑定代理,s = requests.Session(),执行s.proxies.update(proxies),之后这个会话发起的全部请求都会走代理通道。相比每次单独传参更省事,Session还能自动维护cookie,适合需要登录态访问的站点。

代理IP本身有明显短板,单个IP可用周期很短。免费代理可能几分钟就失效,付费住宅代理稳定性更好,但同一个IP高频次持续访问同一个站点,依旧会触发风控拦截,IP轮换机制必不可少。最简单的实现思路是维护代理IP列表,每次发起请求前随机挑选一个。代理池代码实现难度不高,把可用IP存入列表,请求失败就标记该IP不可用或者直接移除,下一轮请求更换新IP。

想要提升爬虫稳定性,可以增加重试逻辑。requests配合urllib3的Retry组件,或是使用tenacity这类第三方库,捕获ProxyError、ConnectionError异常时自动更换代理重试。超时时间不要设置过长,代理失效会造成长时间阻塞,3到5秒比较合适。还有一点要留意,requests的proxies参数仅作用于单次请求;如果使用Session,代理失效之后要更新session.proxies,不然会持续使用已经失效的IP。

httpx近些年使用的开发者越来越多,它配置代理的写法和requests不一样。直接创建httpx.Client(proxies='http://127.0.0.1:8080'),参数支持字符串或者字典格式。异步场景使用httpx.AsyncClient,配置方式一致,代码写在async with代码块内。httpx对HTTP/2协议支持优于requests,碰到强制使用HTTP/2的站点,requests可能直接连接失败,httpx能正常处理。

Scrapy框架有独立的代理中间件机制,不能简单修改参数完成配置。需要编写Downloader Middleware,在process_request方法内给request.meta['proxy']赋值。代理池调度逻辑同样写在这个中间件中,可以按权重随机选取IP,也能根据访问域名做对应映射。Scrapy并发请求能力强,代理池必须配套健康检测,失效IP会拖累整个爬取队列。还有个细节,Scrapy默认复用网络连接,切换代理之后旧连接池不会自动清理,可以在中间件调低request.meta['download_timeout'],快速识别失效代理。

Selenium、Playwright这类浏览器自动化工具,代理不是配置在网络请求层面,而是写在浏览器启动参数中。Chrome浏览器用--proxy-server=host:port启动参数;Firefox在配置文件里修改network.proxy.type。带账号密码认证的代理,在Selenium中处理比较麻烦,Chrome需要安装插件或者借助mitmproxy做流量转发;Playwright的proxy参数原生支持填写用户名密码,比Selenium便捷。Playwright示例代码:browser = p.chromium.launch(proxy={"server": "http://host:port", "username": "user", "password": "pass"}),一行就能完成配置。

代理IP本身的质量,比代码实现方式重要得多。网上公开免费代理列表,实际可用的往往不到两成,延迟也偏高。付费代理里,数据中心IP价格低,但很容易被平台识别;住宅代理成本更高,不过访问成功率更高。抓取公开静态数据,数据中心代理足够;爬取电商、社交平台内容,住宅代理基本是唯一选择。不要在代理预算上过度压缩,代码写得再完善,IP一请求就被封禁,爬虫就失去作用。

还有个容易被忽略的点,本地调试阶段不要把代理地址硬编码到代码内部。采用环境变量或者独立配置文件管理代理信息,本地开发使用一套代理,服务器部署切换另一套。写死地址之后,更换环境就要修改源码,忘记改回就会引发故障。这个小习惯,能省去很多反复调试的时间。

免责声明:本文提供的方法与建议仅供技术参考,实际部署效果受机房环境、运营商线路、系统配置等多重因素影响。请在专业人员指导下操作,因自行操作导致的业务损失本站不承担责任。

相关推荐