发布时间:2026/9/5 17:01:04
MediaCrawler 接入豌豆HTTP代理:app_key 配置、IP 池缓存与自动换 IP 全解析 MediaCrawler 接入豌豆HTTP代理app_key 配置、IP 池缓存与自动换 IP 全解析【免费下载链接】MediaCrawler小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 评论爬虫、微博帖子 评论爬虫、百度贴吧帖子 百度贴吧评论回复爬虫 | 知乎问答文章评论爬虫项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler本文基于 MediaCrawler 仓库中的 豌豆HTTP使用文档 展开完整讲解如何在 MediaCrawler 中接入豌豆HTTP 代理从注册实名、获取 app_key到通过环境变量初始化代理实例再到源码级的 IP 拉取、Redis 缓存、过期检测与自动刷新机制。读完后你将能够独立配置豌豆HTTP 作为 MediaCrawler 的代理 IP 供应商并理解代理池在爬虫请求链路中的完整工作原理。一、准备豌豆HTTP 代理 IP 信息豌豆HTTP 代理目前只支持企业用户文档原文声明。使用流程分为三步注册实名、领取免费试用并选择套餐、获取开放接口密钥 app_key。1. 注册并实名认证访问豌豆HTTP 官网注册账号并完成实名认证。在国内使用代理 IP 服务必须实名这是后续领取试用额度与调用开放接口的前提。2. 领取免费试用与选择套餐注册后可以从官网入口领取免费试用如下图所示试用额度用尽后需要根据自身爬取量选择对应套餐3. 获取 app_key登录官网后进入「个人中心 → 开放接口」页面即可找到 app_key如下图所示。这个 app_key 就是 MediaCrawler 初始化豌豆HTTP 代理实例时唯一需要的凭据参数二、在 MediaCrawler 中初始化豌豆HTTP 代理原文档给出的最小初始化示例如下只需要一个参数app_key推荐通过环境变量注入避免把密钥硬编码进代码# 文件地址 proxy/providers/wandou_http_proxy.py # -*- coding: utf-8 -*- def new_wandou_http_proxy() - WanDouHttpProxy: 构造豌豆HTTP实例 Returns: return WanDouHttpProxy( app_keyos.getenv( wandou_app_key, 你的豌豆HTTP app_key ), # 通过环境变量的方式获取豌豆HTTP app_key )查看仓库中的 实际工厂函数实现它对上面示例做了增强同时兼容两种环境变量命名格式且优先使用大写格式def new_wandou_http_proxy() - WanDouHttpProxy: Supports two environment variable naming formats: 1. Uppercase format: WANDOU_APP_KEY 2. Lowercase format: wandou_app_key Prioritize uppercase format, use lowercase format if not exists # Support both uppercase and lowercase environment variable formats, prioritize uppercase app_key os.getenv(WANDOU_APP_KEY) or os.getenv(wandou_app_key, your_wandou_http_app_key) return WanDouHttpProxy(app_keyapp_key)因此实际使用时只需设置环境变量两种方式任选其一export WANDOU_APP_KEY你的豌豆HTTP app_key # 推荐大写格式优先 # 或 export wandou_app_key你的豌豆HTTP app_keyWanDouHttpProxy构造参数说明见 构造函数参数类型说明app_keystr开放接口密钥在官网个人中心「开放接口」中获取numint单次批量提取的 IP 数量默认 100且单次最大 100构造时会固定代理品牌名为WANDOUHTTP请求接口地址为https://api.wandouapp.com/GET 请求携带app_key与num两个查询参数并创建一个IpCache实例用于 IP 缓存。三、源码解析get_proxy的拉取与缓存策略WanDouHttpProxy.get_proxy 是豌豆HTTP 代理的核心方法实现逻辑可以概括为「缓存优先、差额补取、逐个落缓存」缓存优先先调用self.ip_cache.load_all_ip(proxy_brand_nameWANDOUHTTP)从缓存加载所有未过期 IP。如果缓存中可用数量 num直接返回前num个不再请求远程接口差额补取若缓存不足计算need_get_count num - len(ip_cache_list)并以min(need_get_count, 100)作为本次请求的num参数豌豆HTTP 单次最多返回 100 个 IP发起 GET 请求响应解析与落缓存当响应code 200时遍历data列表把每项转换为统一的IpInfoModelip、port、user/password为空字符串、expired_time_ts由expire_time字符串解析为 Unix 时间戳再以WANDOUHTTP_{ip}_{port}为 key 写入缓存TTL 为「过期时间戳 − 当前时间戳」即 IP 到期后缓存条目自动失效错误处理code ! 200时抛出IpGetError并对两个典型错误码给出明确提示10001通用错误需查看msg字段的具体错误信息常见原因包括 app_key 错误、欠费等10048无可用套餐即账号下没有生效中的代理套餐或额度已耗尽。关键代码如下async def get_proxy(self, num: int) - List[IpInfoModel]: # Prioritize getting IP from cache ip_cache_list self.ip_cache.load_all_ip( proxy_brand_nameself.proxy_brand_name ) if len(ip_cache_list) num: return ip_cache_list[:num] # If the quantity in cache is insufficient, get from IP provider to supplement, then store in cache need_get_count num - len(ip_cache_list) self.params.update({num: min(need_get_count, 100)}) # Maximum 100 ip_infos [] async with make_async_client() as client: url self.api_path ? urlencode(self.params) utils.logger.info(f[WanDouHttpProxy.get_proxy] get ip proxy url:{url}) response await client.get(url, headers{...}) res_dict: Dict response.json() if res_dict.get(code) 200: data: List[Dict] res_dict.get(data, []) current_ts utils.get_unix_timestamp() for ip_item in data: ip_info_model IpInfoModel( ipip_item.get(ip), portip_item.get(port), user, # 豌豆HTTP 无需账号密码认证 password, expired_time_tsutils.get_unix_time_from_time_str( ip_item.get(expire_time) ), ) ip_key fWANDOUHTTP_{ip_info_model.ip}_{ip_info_model.port} self.ip_cache.set_ip(ip_key, ip_info_model.model_dump_json(), exip_info_model.expired_time_ts - current_ts) else: error_code res_dict.get(code) if error_code 10001: error_msg General error, check msg content for specific error information elif error_code 10048: error_msg No available package raise IpGetError(f{error_msg} (code: {error_code})) return ip_cache_list ip_infos这里有两点值得注意无需账密与部分需要user:password认证的代理不同豌豆HTTP 返回的 IP 免认证因此在 ProxyIpPool 校验逻辑 中会走http://{ip}:{port}的无认证分支代理自动刷新 Mixin 生成 httpx 代理 URL 时同理缓存依赖 RedisIpCache 内部通过CacheFactory按 Redis 缓存类型创建客户端load_all_ip以WANDOUHTTP_*为 key 模式批量读取未过期 IP过期清理由缓存后端Redis的 TTL 机制自动完成。若你的 Redis 不可用IP 缓存会退化为每次向远程接口请求。四、代理池如何消费 wandouhttp 供应商拿到WanDouHttpProxy实例后并不是爬虫直接使用它而是先构建一个统一的 IP 代理池。整条链路如下1. 供应商注册表在 proxy_ip_pool.py 中所有供应商在模块加载时即被实例化并注册到IpProxyProvider字典IpProxyProvider: Dict[str, ProxyProvider] { ProviderNameEnum.KUAI_DAILI_PROVIDER.value: new_kuai_daili_proxy(), ProviderNameEnum.WANDOU_HTTP_PROVIDER.value: new_wandou_http_proxy(), ProviderNameEnum.STATIC_PROVIDER.value: StaticProxyProvider(), }其中豌豆HTTP 对应的 key 是wandouhttp定义见 ProviderNameEnum。注意new_wandou_http_proxy()在模块导入时就会执行因此环境变量WANDOU_APP_KEY需要在启动进程前设置好否则构造时会取到占位符your_wandou_http_app_key。2. 相关配置项在 config/base_config.py 中控制代理行为的配置项# Whether to enable IP proxy ENABLE_IP_PROXY False # Number of proxy IP pools IP_PROXY_POOL_COUNT 2 # Proxy IP provider name IP_PROXY_PROVIDER_NAME kuaidaili # kuaidaili | wandouhttp | static # Static proxy configuration (used when IP_PROXY_PROVIDER_NAME is set to static) STATIC_PROXY_URL 接入豌豆HTTP 时需要修改为ENABLE_IP_PROXY True IP_PROXY_POOL_COUNT 20 # 按需求调整池内 IP 数量 IP_PROXY_PROVIDER_NAME wandouhttp另外DISABLE_SSL_VERIFY 仅在使用会注入自签名证书的企业代理、Burp Suite、mitmproxy 等中间人代理时才设为 True普通 HTTP 转发型代理保持 False 即可。3. 创建池子与取 IP 逻辑create_ip_pool 根据config.IP_PROXY_PROVIDER_NAME从注册表取出供应商并创建ProxyIpPool随后立即load_proxies()拉取一批 IP 入池若配置了一个注册表中不存在的 provider 名会抛出带可选值列表的ValueError这一点有专门的回归测试 test_create_ip_pool_unknown_provider_raises_value_error 保障。池子的取 IP 行为由 ProxyIpPool.get_proxy 决定池空时自动reload_proxies重新拉取使用random.choice随机抽取一个 IP 并立即从池中移除用后即弃避免重复暴露同一出口 IP若启用enable_validate_ip会先通过探测地址验证 IP 是否可用不可用则借助tenacity重试最多 3 次、间隔 1 秒重新抽取抽取结果保存为current_proxy供后续请求复用。4. 过期检测与自动刷新豌豆HTTP 的每个 IP 都带expire_timeIpInfoModel.is_expired 以「缓冲秒数」默认 30 秒提前判定过期避免在 IP 临死时刻发起请求失败当前时间戳 ≥ 过期时间戳 − buffer 即视为过期。ProxyIpPool.get_or_refresh_proxy 则是各平台客户端在每次请求前的标准入口——当前代理未过期就复用过期则重新从池中抽取。平台客户端通过继承 ProxyRefreshMixin 接入该机制在__init__中调用init_proxy_pool(proxy_ip_pool)注入池引用在请求方法前调用_refresh_proxy_if_expired()该方法检测到代理过期后会拉取新 IP 并自动更新 httpx 的self.proxyURL。整体工作流程可参考 代理 IP 使用流程图 中的示意配置供应商 → 拉取 IP 入池 → 随机抽取 → 过期校验/刷新 → 请求失败换 IP 重试。五、验证与实操建议独立验证代理池仓库提供了 test/test_proxy_ip_pool.py其中test_ip_pool可真实拉取 IPtest_ip_expiration_standalone与test_proxy_pool_auto_refresh不依赖真实供应商即可验证过期判定与自动刷新逻辑适合在配置完WANDOU_APP_KEY后先跑一遍确认链路通畅环境准备先export WANDOU_APP_KEY...再修改config/base_config.py的ENABLE_IP_PROXY True与IP_PROXY_PROVIDER_NAME wandouhttp最后按 代理使用 的整体说明启动爬虫额度与批量上限豌豆HTTP 单次最多返回 100 个 IP源码中min(need_get_count, 100)硬限制IP_PROXY_POOL_COUNT设置过大时会自动分批请求或依赖缓存补齐排错要点日志中出现code: 10001优先检查 app_key 是否配置正确、账号是否欠费code: 10048表示账号下无可用套餐需先到官网续费或领取试用日志中[WanDouHttpProxy.get_proxy] get ip proxy url:...会打印真实请求 URL可用于确认app_key是否被正确读取缓存观察缓存 key 形如WANDOUHTTP_{ip}_{port}可在 Redis 中直接查看当前池内还有哪些未过期 IP 及其剩余 TTL。六、合规与注意事项本文所有接入方式仅适用于学习与研究目的。项目各源文件头部声明明确要求不得用于商业用途、不得进行大规模爬取或对目标平台造成运营干扰、应遵守目标平台使用条款与 robots.txt 规则并合理控制请求频率详见 LICENSE代理 IP 的作用是降低因本地出口 IP 被风控导致的请求失败概率并不改变「控制请求频率」这一合规前提CRAWLER_MAX_SLEEP_SEC、MAX_CONCURRENCY_NUM等限速配置应配合使用若你已有自建或静态代理也可以将IP_PROXY_PROVIDER_NAME设为static并通过STATIC_PROXY_URL直接指定代理地址支持http://user:passwordhost:port格式见 StaticProxyProvider与豌豆HTTP 走的是同一套代理池抽象可随时切换对比。【免费下载链接】MediaCrawler小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 评论爬虫、微博帖子 评论爬虫、百度贴吧帖子 百度贴吧评论回复爬虫 | 知乎问答文章评论爬虫项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/5 17:01:04

Python审计智能系统:本地化LLM+规则引擎的可审计问答实践

简介:本资源是一套面向高校计算机、审计或信息管理专业学生的高分毕业设计与课程大作业解决方案,聚焦于大语言模型在审计领域的垂直应用,解决传统审计知识查询效率低、专业术语理解门槛高等实际问题。压缩包共34个文件,含4个核心P…

2026/9/5 18:01:07

MCP协议实战:自然语言操控Unity和Unreal引擎的完整指南

直接说结论:MCP这一层协议,正在把“游戏引擎”从“操作软件”变成“可对话的程序员”。2026年再回头整理这套工具链,已经不是“尝鲜”的范畴,而是正经的提效手段。我花了两周时间,把Unity MCP和UnrealClaude从安装到落…

2026/9/5 18:01:07

Umi-OCR:免费离线 OCR 一次搞定截图、批量图片与扫描 PDF

Umi-OCR:免费离线 OCR 一次搞定截图、批量图片与扫描 PDF 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国…

2026/9/5 18:01:06

SpringBoot3+Vue3前后端分离课程网站系统搭建实战指南

很多人在找“课程网站系统”源码时都遇到过类似的尴尬:从网盘下载的压缩包不是数据库脚本缺失,就是 Java 版本对不上,好不容易导入 IDE,前端还是 Vue2 老写法,跑起来到处报错。与其花一个周末去排查别人打包好的黑盒代…

2026/9/5 17:56:06

C++控制台学生成绩管理系统:内存、编码与状态机实战

简介:本资源是一套完整的C课程设计项目——控制台版学生成绩管理系统,面向计算机专业本科生及C初学者,解决课程实践环节中数据结构应用、模块化编程与小型系统开发能力训练问题。系统实现五大核心功能:成绩录入与修改、单学生查询…

2026/9/5 2:46:54

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/5 2:46:52

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/5 2:44:34

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/5 0:04:47

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流在大模型流式输出(Streaming)与智能体实时推流的架构中,生产环境中经常出现一种“上下游生产消费速率严重失衡”的极端情况: 生产端极速产出:大模型…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…