[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-strapi-article:zh:api-dynamic-residential-proxy-ip":3,"blog-article:\u002Fblog\u002Fapi-dynamic-residential-proxy-ip":1147,"blog-related:\u002Fblog\u002Fapi-dynamic-residential-proxy-ip":1148,"blog-translations:\u002Fblog\u002Fapi-dynamic-residential-proxy-ip":1149},{"available":4,"article":5,"relatedArticles":308,"translations":937},true,{"source":6,"id":7,"documentId":8,"translationKey":8,"locale":9,"slug":10,"path":11,"_path":11,"title":12,"description":13,"excerpt":13,"image":14,"publishedAt":15,"updatedAt":16,"author":17,"tags":18,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":23,"bodyHtml":307},"strapi",2476,"jsq5o6ocwin7saridf6ozfsm","zh","api-dynamic-residential-proxy-ip","\u002Fblog\u002Fapi-dynamic-residential-proxy-ip","API 批量提取动态住宅代理 IP 时怎么设计重试机制？","API 批量提取动态住宅代理 IP 时，应区分提取接口与目标请求错误，并按错误类型设置 Retry-After、指数退避、抖动、幂等和停止条件。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_api_E6_89_B9_E9_87_8_F_E6_8_F_90_E5_8_F_96_E5_8_A_A8_E6_80_81_E4_BD_8_F_E5_AE_85_E4_BB_A3_E7_90_86_E6_97_B6_E6_80_8_E_E4_B9_88_E8_AE_BE_E8_AE_A1_E9_87_8_D_E8_AF_95_E6_9_C_BA_E5_88_B6_cover_bcfb009c42.webp","2026-09-03T03:43:57.777Z","2026-09-03T03:43:57.757Z","Global Proxies Team",[],false,0,4,"blocks",[24,30,36,41,45,49,53,57,61,65,70,74,78,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255,259,263,267,271,275,279,283,287,291,295,299,303],{"type":25,"children":26},"paragraph",[27],{"text":28,"type":29},"API 批量提取动态住宅代理 IP 时，先把“提取 API 失败”和“使用已提取代理 IP 请求目标站失败”分成两条链路。提取接口的认证、参数、库存和配额错误不能靠换代理 IP 解决；连接超时、临时 5xx 和部分 429 才适合有限重试。每次重试都要有等待、随机抖动、次数上限和任务总时限。","text",{"type":31,"level":32,"children":33},"heading",2,[34],{"text":35,"type":29},"将提取 API 与目标站请求分开处理",{"type":37,"children":38},"code",[39],{"text":40,"type":29},"| 链路 | 输入 | 常见错误 | 负责人 |\n| --- | --- | --- | --- |\n| 提取 API | 国家、城市、数量、会话等参数 | 认证、参数、429、5xx、空结果 | 提取客户端 |\n| 业务请求 | 提取到的代理 IP、目标 URL、Cookie 等 | 407、403、429、超时、验证码 | 业务请求客户端 |",{"type":25,"children":42},[43],{"text":44,"type":29},"提取 API 返回 200 和一组代理 IP，只证明“资源获取成功”，不代表目标 URL 一定成功。业务请求出现 407，通常属于代理认证问题，不应回到提取 API 无限重试。",{"type":31,"level":32,"children":46},[47],{"text":48,"type":29},"先用错误矩阵决定是否重试",{"type":37,"children":50},[51],{"text":52,"type":29},"| 错误 | 是否自动重试 | 处理动作 |\n| --- | --- | --- |\n| 连接超时、连接重置 | 可以有限重试 | 指数退避加抖动，记录耗时 |\n| 429 | 可以，但优先遵守服务端提示 | 解析 `Retry-After`，暂停对应调用方 |\n| 临时 500\u002F502\u002F503\u002F504 | 可以有限重试 | 设置最大次数和任务总时限 |\n| 401\u002F403 权限错误 | 不自动重试 | 检查令牌、权限和调用来源 |\n| 参数校验失败 | 不自动重试 | 修正国家、城市、数量等参数 |\n| 白名单不匹配 | 不自动重试 | 核对发起请求的服务器出口 IP |\n| 返回空列表 | 先判断业务含义 | 放宽筛选条件、核对库存或配额 |\n| 响应格式错误 | 有条件重试 | 先保存脱敏响应，确认是否临时网关异常 |",{"type":25,"children":54},[55],{"text":56,"type":29},"空结果和网络失败必须分开统计。筛选条件过窄或当前资源不足时，重复同一请求不会自动产生可用结果。",{"type":25,"children":58},[59],{"text":60,"type":29},"提取参数和白名单流程可对照[动态住宅 IP API 提取教程](https:\u002F\u002Fhelp.quanqiudaili.com\u002Fdocs\u002FGet-Proxy\u002FDynamic-flow-api-ip)。",{"type":31,"level":32,"children":62},[63],{"text":64,"type":29},"为临时错误设置指数退避、随机抖动和总时限",{"type":31,"level":66,"children":67},3,[68],{"text":69,"type":29},"提取 API 的重试参数怎么设置",{"type":25,"children":71},[72],{"text":73,"type":29},"以下参数只针对提取 API 的临时网络错误、429 和 5xx；认证失败、参数错误、白名单不匹配或明确的业务空结果应走人工处理分支。",{"type":25,"children":75},[76],{"text":77,"type":29},"可以先用下面这组参数做小样本基线，再根据接口限制、任务时限和实测错误率调整：",{"type":79,"format":80,"children":81},"list","unordered",[82,87,91,95,99,103],{"type":83,"children":84},"list-item",[85],{"text":86,"type":29},"最大尝试次数：4 次，包括首次请求；",{"type":83,"children":88},[89],{"text":90,"type":29},"基础等待：1 秒；",{"type":83,"children":92},[93],{"text":94,"type":29},"最大单次等待：30 秒；",{"type":83,"children":96},[97],{"text":98,"type":29},"随机抖动：0–500 毫秒；",{"type":83,"children":100},[101],{"text":102,"type":29},"单任务总时限：60 秒；",{"type":83,"children":104},[105],{"text":106,"type":29},"429：若有 `Retry-After`，优先采用服务端给出的等待时间。",{"type":25,"children":108},[109],{"text":110,"type":29},"连接超时与读取超时应分别记录和处理：前者通常发生在建立代理连接阶段，后者表示连接建立后响应迟迟未完成。两者都可以有限重试，但应使用不同的错误统计，避免把目标站响应慢误判成代理连接失败。",{"type":31,"level":66,"children":112},[113],{"text":114,"type":29},"Python 重试代码示例",{"type":25,"children":116},[117],{"text":118,"type":29},"下面代码只处理提取 API 的有限重试；目标站业务请求应使用另一套错误分类。代码中的尝试次数、总时限和退避上限要与任务调度配置保持一致。",{"type":25,"children":120},[121],{"text":122,"type":29},"```python\nimport random\nimport time\nimport requests",{"type":25,"children":124},[125],{"text":126,"type":29},"RETRYABLE = {429, 500, 502, 503, 504}",{"type":25,"children":128},[129],{"text":130,"type":29},"def extract_with_retry(url, params, headers):\nstarted = time.monotonic()\nlast_error = None",{"type":25,"children":132},[133],{"text":134,"type":29},"for attempt in range(4):\nif time.monotonic() - started >= 60:\nraise TimeoutError(\"提取任务超过总时限\")",{"type":25,"children":136},[137],{"text":138,"type":29},"try:\nresponse = requests.get(\nurl,\nparams=params,\nheaders=headers,\ntimeout=(5, 15),\n)",{"type":25,"children":140},[141],{"text":142,"type":29},"if response.status_code == 200:\ndata = response.json()\nif not data:\nraise ValueError(\"提取结果为空，需检查筛选条件或库存\")\nreturn data",{"type":25,"children":144},[145],{"text":146,"type":29},"if response.status_code not in RETRYABLE:\nresponse.raise_for_status()",{"type":25,"children":148},[149],{"text":150,"type":29},"retry_after = response.headers.get(\"Retry-After\")\nif retry_after and retry_after.isdigit():\nwait = min(float(retry_after), 30)\nelse:\nwait = min(1 * (2 ** attempt), 30)",{"type":25,"children":152},[153],{"text":154,"type":29},"except (requests.ConnectTimeout, requests.ReadTimeout, requests.ConnectionError) as exc:\nlast_error = exc\nwait = min(1 * (2 ** attempt), 30)",{"type":25,"children":156},[157],{"text":158,"type":29},"if attempt == 3:\nbreak",{"type":25,"children":160},[161],{"text":162,"type":29},"time.sleep(wait + random.uniform(0, 0.5))",{"type":25,"children":164},[165],{"text":166,"type":29},"raise RuntimeError(\"提取 API 达到重试上限\") from last_error\n```",{"type":25,"children":168},[169],{"text":170,"type":29},"如果响应状态是 200 但 JSON 解析失败，也应记录为响应格式异常并纳入任务停止判断，不要把它当成空结果继续放大请求量。",{"type":25,"children":172},[173],{"text":174,"type":29},"达到重试上限后，应将任务标记为失败或转入人工复核队列，并保留最后一次状态码、错误类型和脱敏响应摘要。认证错误和参数错误不应进入该重试循环。",{"type":31,"level":66,"children":176},[177],{"text":178,"type":29},"生产环境如何处理 Retry-After 与延迟调度",{"type":25,"children":180},[181],{"text":182,"type":29},"生产环境还要完整解析 `Retry-After`，因为它除了秒数，也可能使用 HTTP 日期格式。不要在等待期间占用大量同步工作线程；高并发任务更适合异步调度或延迟队列。",{"type":25,"children":184},[185],{"text":186,"type":29},"共享限流器应按 API、账号或任务维度设置。任务达到总时限后，应进入失败队列或人工复核流程，而不是由其他工作进程继续发起重试。",{"type":31,"level":32,"children":188},[189],{"text":190,"type":29},"幂等保护怎么设计",{"type":25,"children":192},[193],{"text":194,"type":29},"只读取资源的 GET 请求通常可以有限重试，但“可重试”不等于“无限重放”。会创建订单、扣减配额或改变服务端状态的请求，应使用服务端支持的幂等键或唯一业务请求 ID。",{"type":25,"children":196},[197],{"text":198,"type":29},"幂等键应绑定一次业务意图，例如：",{"type":25,"children":200},[201],{"text":202,"type":29},"```text\n业务任务 ID + 提取条件摘要 + 时间窗口\n```",{"type":25,"children":204},[205],{"text":206,"type":29},"代理 ID、当前时间戳或每次重试都变化的随机值不能提供幂等保护。服务端若不支持幂等，也不能仅靠客户端生成一个字段就保证不重复执行。",{"type":31,"level":32,"children":208},[209],{"text":210,"type":29},"重试过程中何时更换代理 IP、何时停止",{"type":31,"level":66,"children":212},[213],{"text":214,"type":29},"确认哪些条件后才更换代理 IP",{"type":25,"children":216},[217],{"text":218,"type":29},"提取 API 失败时通常先修接口调用，不讨论换代理 IP。只有业务请求已确认认证、参数和目标站状态正常，且失败稳定集中在特定出口，才更换代理 IP 复测。",{"type":31,"level":66,"children":220},[221],{"text":222,"type":29},"停止并报警的条件",{"type":25,"children":224},[225],{"text":226,"type":29},"以下条件表示继续重试无法提高成功概率，或可能扩大配额消耗、重复业务操作和下游脏数据风险。",{"type":25,"children":228},[229],{"text":230,"type":29},"遇到以下情况应停止并报警：",{"type":25,"children":232},[233],{"text":234,"type":29},"1. 401\u002F403、参数错误或白名单不匹配；\n2. 资源明确为空，且放宽条件需要业务确认；\n3. 达到最大尝试次数或任务总时限；\n4. 一段时间内错误率持续超过业务阈值；\n5. 响应格式异常，继续处理可能污染下游数据。",{"type":31,"level":32,"children":236},[237],{"text":238,"type":29},"重试日志应记录哪些字段并如何脱敏",{"type":25,"children":240},[241],{"text":242,"type":29},"至少记录：请求 ID、API 端点、国家\u002F城市\u002F数量等非敏感参数、状态码、错误类型、尝试次数、实际等待时间、响应数量、耗时和最终状态。令牌、完整账号密码和完整代理认证串不得写入日志。",{"type":25,"children":244},[245],{"text":246,"type":29},"```text\nrequest_id | endpoint | filters | status | error_type\nattempt | wait_ms | result_count | elapsed_ms | final_state\n```",{"type":25,"children":248},[249],{"text":250,"type":29},"业务请求日志另行记录目标 URL、脱敏代理标识、出口地区、状态码和业务有效结果，避免把两条链路的成功率混在一起。",{"type":31,"level":32,"children":252},[253],{"text":254,"type":29},"用脱敏复测数据验证重试策略",{"type":25,"children":256},[257],{"text":258,"type":29},"以下为脱敏记录示例（接口域名、代理标识已隐去，数字不是 SLA；发布前应替换为真实日志）：批量提取 100 条、并发 5、超时 8 秒，首轮返回 92 条；对 5xx 使用 1\u002F2\u002F4 秒退避后补回 6 条，参数错误重试 0 次；目标请求链另测 100 次，429 占 4 次。两条链路分开统计，避免把重试放大与代理质量混淆。",{"type":25,"children":260},[261],{"text":262,"type":29},"429 与 `Retry-After` 可核对 [RFC 6585](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc6585.html)，HTTP 方法语义可核对 [RFC 9110](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9110.html)；退避上限、样本量和结果属于经验设计，不是通用保证。",{"type":31,"level":32,"children":264},[265],{"text":266,"type":29},"FAQ",{"type":31,"level":66,"children":268},[269],{"text":270,"type":29},"认证失败适合自动重试吗？",{"type":25,"children":272},[273],{"text":274,"type":29},"不适合。相同认证信息不会因退避而自动变正确，应先检查令牌、账号密码、权限或白名单。",{"type":31,"level":66,"children":276},[277],{"text":278,"type":29},"API 空结果一定代表故障吗？",{"type":25,"children":280},[281],{"text":282,"type":29},"不一定。筛选条件过窄、当前库存不足或配额限制都可能返回空结果，应按接口语义处理。",{"type":31,"level":66,"children":284},[285],{"text":286,"type":29},"随机抖动有什么作用？",{"type":25,"children":288},[289],{"text":290,"type":29},"它能让多个任务错开重试时间，降低同一时刻再次集中请求的概率。",{"type":31,"level":66,"children":292},[293],{"text":294,"type":29},"每次重试都要重新提取代理 IP 吗？",{"type":25,"children":296},[297],{"text":298,"type":29},"不一定。先判断失败发生在提取 API 还是业务请求；两条链路要使用不同的重试和停止规则。",{"type":25,"children":300},[301],{"text":302,"type":29},"---",{"type":25,"children":304},[305],{"text":306,"type":29},"确认参数和认证无误后，可按任务规模查看[动态住宅代理 IP](https:\u002F\u002Fwww.quanqiudaili.com\u002Fproduct\u002Fdynamic-residential)。","",[309,497,705],{"source":6,"id":310,"documentId":311,"translationKey":311,"locale":9,"slug":312,"path":313,"_path":313,"title":314,"description":315,"excerpt":315,"image":316,"publishedAt":317,"updatedAt":318,"author":17,"tags":319,"featured":19,"sortOrder":20,"readingTime":66,"bodyType":22,"bodyBlocks":320,"bodyHtml":307},2485,"cjleh5o0nn3oys8ogpozjjym","price-residential-proxy-settings","\u002Fblog\u002Fprice-residential-proxy-settings","价格监控用住宅代理 IP 怎么设置轮换和粘性？","按业务路径 P95 设粘性时长、限流先降频、切国家同步换 Cookie，避免把页面参数差异误判为出口问题","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_E4_BB_B7_E6_A0_BC_E7_9_B_91_E6_8_E_A7_E7_94_A8_E4_BD_8_F_E5_AE_85_E4_BB_A3_E7_90_86_E6_80_8_E_E4_B9_88_E8_AE_BE_E7_BD_AE_E8_BD_AE_E6_8_D_A2_E5_92_8_C_E7_B2_98_E6_80_A7_cover_0b9068f488.webp","2026-09-03T03:46:36.846Z","2026-09-03T03:46:36.834Z",[],[321,325,329,333,337,341,345,349,353,357,361,365,369,373,377,381,385,389,393,397,401,427,431,435,439,443,447,451,455,458,462,466,470,474,478,482,486,490,493],{"type":25,"children":322},[323],{"text":324,"type":29},"价格监控不是“请求越多越该频繁换 IP”。公开列表页或彼此独立的商品详情可以按请求或任务批次轮换；从商品详情进入购物车、配送地区、税费和结算展示的连续流程，应在同一短会话内保持代理出口、Cookie、地区和货币一致。粘性时长以完成一条业务路径的实际 P95 耗时加安全余量为起点，不使用一个适用于所有网站的通用分钟数。",{"type":31,"level":32,"children":326},[327],{"text":328,"type":29},"按列表、详情和购物车阶段设置轮换策略",{"type":37,"children":330},[331],{"text":332,"type":29},"| 页面阶段 | 推荐策略 | 原因 |\n| --- | --- | --- |\n| 搜索或分类列表 | 按请求或小批次轮换 | 页面之间通常相互独立 |\n| 单个商品详情 | 同一次解析保持同一出口 | 避免主页面与异步价格接口地区不一致 |\n| 购物车 | 保持短期粘性 | Cookie、库存和地区开始形成连续状态 |\n| 配送、税费、结算展示 | 整条路径保持同一会话 | 中途切换可能重置地区、货币或购物车 |\n| 下一商品或下一地区任务 | 结束旧会话后再轮换 | 防止状态串到新样本 |",{"type":25,"children":334},[335],{"text":336,"type":29},"一个任务如果只采公开列表价，可以把“商品×地区×时间窗口”作为独立采样单位；如果需要最终展示价，则应把“详情→购物车→配送地区→结算展示”视为一个不可拆的会话。",{"type":25,"children":338},[339],{"text":340,"type":29},"代理协议、主机、端口和认证字段可先按[代理设置帮助](https:\u002F\u002Fhelp.quanqiudaili.com\u002Fdocs\u002Fproxy-Settings)完成基础核验。",{"type":31,"level":32,"children":342},[343],{"text":344,"type":29},"根据完整业务路径耗时设置粘性时长",{"type":25,"children":346},[347],{"text":348,"type":29},"先在不并发的条件下运行一批完整流程，记录每条路径从打开详情页到拿到最终价格的耗时。计算 P95 后再加安全余量：",{"type":25,"children":350},[351],{"text":352,"type":29},"```text\n建议粘性时长 = 完整业务路径 P95 耗时 × 安全系数\n```",{"type":25,"children":354},[355],{"text":356,"type":29},"例如路径 P95 为 80 秒，安全系数取 1.5，则初始值可设为 120 秒，再通过失败率和会话中断率调整。这个数字只是该站点、该流程和当前网络条件下的起始值，不是产品承诺。动态住宅代理 IP 的实际在线时长可能与设置值存在差异；粘性要求越长，可用代理 IP 数量通常越少。",{"type":31,"level":32,"children":358},[359],{"text":360,"type":29},"用站点、地区和会话生成轮换键",{"type":25,"children":362},[363],{"text":364,"type":29},"建议使用下列绑定关系：",{"type":25,"children":366},[367],{"text":368,"type":29},"```text\nsession_key = 站点 + 国家\u002F城市 + 货币 + 账号\u002F匿名会话 + 任务批次\n```",{"type":25,"children":370},[371],{"text":372,"type":29},"同一个 `session_key` 在完成业务路径前复用同一代理出口和 Cookie。更换国家、城市、货币或任务批次时创建新会话，不要只换代理 IP 却继续复用旧 Cookie。",{"type":25,"children":374},[375],{"text":376,"type":29},"如果目标站允许直接通过 URL、请求参数或官方接口指定地区，应把这些参数与代理 IP 地区保持一致，避免把页面参数造成的差异误判为出口问题。",{"type":31,"level":32,"children":378},[379],{"text":380,"type":29},"失败重试先保持会话，再判断是否换出口",{"type":25,"children":382},[383],{"text":384,"type":29},"第一次网络超时或临时 5xx 可以在同一会话内有限重试，避免购物车和地区状态丢失。出现下列情况时再分支：",{"type":37,"children":386},[387],{"text":388,"type":29},"| 现象 | 是否立即换代理 IP | 处理动作 |\n| --- | --- | --- |\n| 单次超时或临时 5xx | 否 | 同会话退避重试，设置次数上限 |\n| 429 | 否 | 读取限流信息，先降频和延长间隔 |\n| 购物车被清空、地区跳回 | 否 | 查 Cookie、地区参数和会话是否中断 |\n| 只有少数出口重复失败 | 可以评估 | 保持其他变量不变，更换同地区出口复测 |\n| 账号或权限提示 | 否 | 处理账号或平台提示 |\n| 粘性会话提前中断 | 先记录 | 缩短单条路径、减少并发或重新评估方案 |",{"type":25,"children":390},[391],{"text":392,"type":29},"不要在一次失败后同时更换代理 IP、Cookie、UA、地区和货币，否则无法知道是哪项导致结果变化。",{"type":31,"level":32,"children":394},[395],{"text":396,"type":29},"价格结果必须记录哪些字段",{"type":25,"children":398},[399],{"text":400,"type":29},"至少记录：",{"type":79,"format":80,"children":402},[403,407,411,415,419,423],{"type":83,"children":404},[405],{"text":406,"type":29},"站点、商品 ID、页面 URL 和页面阶段；",{"type":83,"children":408},[409],{"text":410,"type":29},"国家、城市、邮编或配送地区；",{"type":83,"children":412},[413],{"text":414,"type":29},"页面语言、货币和登录状态；",{"type":83,"children":416},[417],{"text":418,"type":29},"会话 ID、脱敏后的代理标识与出口 IP；",{"type":83,"children":420},[421],{"text":422,"type":29},"抓取时间、原价、促销价、会员价、税费、运费和最终展示价；",{"type":83,"children":424},[425],{"text":426,"type":29},"状态码、验证码、空结果或重定向情况。",{"type":25,"children":428},[429],{"text":430,"type":29},"如果只保存一个“价格”字段，后续无法判断差异来自促销、税费、配送、会员状态还是地区定价。",{"type":25,"children":432},[433],{"text":434,"type":29},"例如一次采样可以记录“列表页发现商品→详情页读取原价→购物车确认配送费”三个时间点，并为同一条路径使用同一个会话 ID。后续价格变化时，才能判断是页面阶段不同，还是地区和会话真的发生了变化。",{"type":31,"level":32,"children":436},[437],{"text":438,"type":29},"通过重复采样验证价格差异是否真实",{"type":25,"children":440},[441],{"text":442,"type":29},"同一商品、同一地区至少在多个时间窗口重复采样，并设置一个基准市场。比较时保持页面阶段、登录状态、货币和 Cookie 策略一致。",{"type":37,"children":444},[445],{"text":446,"type":29},"| 结果 | 更可能的原因 | 下一步 |\n| --- | --- | --- |\n| 同出口、同会话连续跳价 | 促销、缓存、A\u002FB 测试或库存变化 | 增加重复样本，保存页面阶段和时间 |\n| 换国家后语言和货币变化 | 地区策略可能生效 | 再核对配送与税费字段 |\n| 出口地区正确但价格不变 | 目标站可能不按该地区定价 | 检查 Cookie、账号和页面参数 |\n| 只有购物车阶段失败 | 会话连续性或地区参数问题 | 保持短期粘性并逐步复测 |",{"type":31,"level":32,"children":448},[449],{"text":450,"type":29},"如何选择代理 IP 类型",{"type":25,"children":452},[453],{"text":454,"type":29},"多地区公开价格采样通常先评估动态住宅代理 IP；需要较长的登录态、购物车或后台操作时，应先看任务是否更适合静态住宅代理 IP。选择前重点确认地区覆盖、目标站识别、粘性能力、并发、计费方式和失败重试成本，不把代理 IP 当成价格一致性的保证。",{"type":31,"level":32,"children":456},[457],{"text":266,"type":29},{"type":31,"level":66,"children":459},[460],{"text":461,"type":29},"粘性时间越长越好吗？",{"type":25,"children":463},[464],{"text":465,"type":29},"不是。时长只需覆盖完整业务路径并留出合理余量；过长会减少可用代理 IP 数量，也会降低任务调度灵活性。",{"type":31,"level":66,"children":467},[468],{"text":469,"type":29},"价格不同一定是代理 IP 导致的吗？",{"type":25,"children":471},[472],{"text":473,"type":29},"不一定。Cookie、账号、货币、配送地址、促销、库存和 A\u002FB 测试都可能改变价格。",{"type":31,"level":66,"children":475},[476],{"text":477,"type":29},"同一商品要重复采样吗？",{"type":25,"children":479},[480],{"text":481,"type":29},"建议重复采样，并记录相同字段。单次结果不足以区分短时促销、缓存和稳定地区差异。",{"type":31,"level":66,"children":483},[484],{"text":485,"type":29},"动态住宅代理 IP 能保证保持到设定时间吗？",{"type":25,"children":487},[488],{"text":489,"type":29},"不能保证完全一致。应按实测会话中断率设置任务长度和重试方案，必要时缩短单条路径。",{"type":25,"children":491},[492],{"text":302,"type":29},{"type":25,"children":494},[495],{"text":496,"type":29},"完成小样本验证后，可查看[动态住宅代理 IP](https:\u002F\u002Fwww.quanqiudaili.com\u002Fproduct\u002Fdynamic-residential)并按当前业务路径评估轮换方案。",{"source":6,"id":498,"documentId":499,"translationKey":499,"locale":9,"slug":500,"path":501,"_path":501,"title":502,"description":503,"excerpt":503,"image":504,"publishedAt":505,"updatedAt":506,"author":17,"tags":507,"featured":19,"sortOrder":20,"readingTime":66,"bodyType":22,"bodyBlocks":508,"bodyHtml":307},2484,"e8solm25h3e0r6jbsq1peuf9","crawler-429-too-many-requests-proxy","\u002Fblog\u002Fcrawler-429-too-many-requests-proxy","爬虫 429 Too Many Requests：判断频率还是代理 IP 池","爬虫遇到 429 Too Many Requests 时，先固定账号和代理出口做降频实验，再以低频基线更换代理 IP，区分频率、配额和代理 IP 池问题。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_429_too_many_requests_cover_978d5b6a35.webp","2026-09-03T03:46:20.903Z","2026-09-03T03:46:20.890Z",[],[509,513,517,521,551,555,559,563,567,571,575,579,583,587,591,595,599,603,607,611,615,619,623,627,631,635,639,643,647,651,655,659,663,666,670,674,678,682,686,690,694,698,701],{"type":25,"children":510},[511],{"text":512,"type":29},"遇到 429，先固定账号、URL、Header、Cookie 和代理 IP，只降低并发、延长请求间隔并遵守 `Retry-After`；如果 429 稳定下降，优先处理频率或账号\u002FAPI 配额。只有在低频基线下，错误仍稳定集中于少数出口，才继续检查代理 IP 池质量、地区识别或出口复用。",{"type":31,"level":32,"children":514},[515],{"text":516,"type":29},"先保存 429 的完整证据",{"type":25,"children":518},[519],{"text":520,"type":29},"429 表示请求过多，但限制维度可能是账号、API 密钥、接口、IP、设备或多项组合。保存：",{"type":79,"format":80,"children":522},[523,527,531,535,539,543,547],{"type":83,"children":524},[525],{"text":526,"type":29},"状态码与响应体摘要；",{"type":83,"children":528},[529],{"text":530,"type":29},"`Retry-After` 和其他限流响应头；",{"type":83,"children":532},[533],{"text":534,"type":29},"账号\u002FAPI 密钥的脱敏标识；",{"type":83,"children":536},[537],{"text":538,"type":29},"URL、接口、请求方法和参数摘要；",{"type":83,"children":540},[541],{"text":542,"type":29},"并发数、请求间隔、时间窗口；",{"type":83,"children":544},[545],{"text":546,"type":29},"代理出口 IP、国家\u002F城市；",{"type":83,"children":548},[549],{"text":550,"type":29},"请求总数、成功数、429 数量和耗时。",{"type":25,"children":552},[553],{"text":554,"type":29},"如果响应中包含 `X-RateLimit-Limit`、`X-RateLimit-Remaining` 或 `X-RateLimit-Reset` 等字段，也应一并保存；这些字段有助于判断限制是按账号、接口还是时间窗口计算。",{"type":25,"children":556},[557],{"text":558,"type":29},"HTTP 429 与 `Retry-After` 的语义可参考 [RFC 6585 第 4 节](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc6585#section-4)。服务端没有义务说明采用哪一种计数维度，因此需要对照实验。",{"type":25,"children":560},[561],{"text":562,"type":29},"若同时出现 403 或验证码，可结合[爬虫 403\u002F429\u002F验证码排查](https:\u002F\u002Fwww.quanqiudaili.com\u002Fblog\u002Fcrawler-403-429-captcha-proxy-ip-troubleshooting)分开记录，避免把不同错误合并成 429。",{"type":31,"level":32,"children":564},[565],{"text":566,"type":29},"阶段 A：固定代理 IP，逐步降低请求频率",{"type":25,"children":568},[569],{"text":570,"type":29},"保持账号、代理 IP、URL、Header、Cookie 和请求参数不变，按阶梯降低并发和请求频率。每一档使用相同样本量与观察时间，不要在中途换出口。",{"type":25,"children":572},[573],{"text":574,"type":29},"示例记录表：",{"type":37,"children":576},[577],{"text":578,"type":29},"| 组别 | 并发 | 请求间隔 | 请求数 | 429 数 | 成功数 | 结论 |\n| --- | ---: | ---: | ---: | ---: | ---: | --- |\n| A1 | 当前值 | 当前值 | 同样本量 | 记录 | 记录 | 基线 |\n| A2 | 降低一档 | 延长一档 | 同样本量 | 记录 | 记录 | 与 A1 比较 |\n| A3 | 再降低一档 | 再延长一档 | 同样本量 | 记录 | 记录 | 验证趋势是否重复 |",{"type":25,"children":580},[581],{"text":582,"type":29},"若降频后 429 在连续时间窗口内都明显下降，而出口未变，主要矛盾更可能是频率、账号或接口配额。若响应带 `Retry-After`，等待时间应优先遵守服务端提示。",{"type":31,"level":32,"children":584},[585],{"text":586,"type":29},"阶段 B：保持低频基线，仅更换代理 IP",{"type":25,"children":588},[589],{"text":590,"type":29},"保持阶段 A 得到的低频基线，固定账号、URL、Header、Cookie、参数、并发和间隔，只替换同地区代理 IP。",{"type":37,"children":592},[593],{"text":594,"type":29},"| 结果模式 | 更可能的原因 | 下一步 |\n| --- | --- | --- |\n| 所有出口在同一时段都 429 | 账号、接口或全站限流 | 暂停并检查配额\u002F服务端提示 |\n| 同一账号跨多个出口都 429 | 账号或 API 密钥配额 | 换 IP 通常无效 |\n| 少数出口跨账号重复 429 | 出口复用或质量问题 | 隔离出口并扩大同地区样本 |\n| 更换出口短暂恢复，随后再次 429 | 频率策略仍不合适 | 回到阶段 A，降低总体负载 |\n| 429 响应实际是验证页面 | 状态分类错误 | 单独记录验证码\u002F挑战，不当作普通 429 |",{"type":31,"level":32,"children":596},[597],{"text":598,"type":29},"429 的重试与停止规则",{"type":31,"level":66,"children":600},[601],{"text":602,"type":29},"429 响应的基础退避代码",{"type":25,"children":604},[605],{"text":606,"type":29},"```python\nimport random\nimport time",{"type":25,"children":608},[609],{"text":610,"type":29},"def wait_before_retry(response, attempt):\nretry_after = response.headers.get(\"Retry-After\")\nif retry_after and retry_after.isdigit():\nwait = float(retry_after)\nelse:\nwait = min(2 ** attempt, 60)\ntime.sleep(wait + random.uniform(0, 0.5))\n```",{"type":31,"level":66,"children":612},[613],{"text":614,"type":29},"生产环境如何设置重试上限与共享限流",{"type":25,"children":616},[617],{"text":618,"type":29},"生产实现还应支持 HTTP 日期格式的 `Retry-After`，并设置：",{"type":25,"children":620},[621],{"text":622,"type":29},"1. 最大重试次数；\n2. 单任务总时限；\n3. 同账号或接口的共享限流器；\n4. 连续 429 后的暂停和报警；\n5. 重试队列的容量上限。",{"type":25,"children":624},[625],{"text":626,"type":29},"不要让多个工作进程各自判断后立即重试，否则总体流量仍可能超过限制。账号或 API 密钥维度的限流，应在所有工作进程之间共享状态。",{"type":31,"level":32,"children":628},[629],{"text":630,"type":29},"把 403、429、验证码和空结果分开",{"type":37,"children":632},[633],{"text":634,"type":29},"| 结果 | 主要含义 | 是否按 429 重试 |\n| --- | --- | --- |\n| 429 | 请求过多或配额限制 | 按服务端提示有限重试 |\n| 403 | 权限、账号、地区或访问策略 | 不直接套用 429 退避 |\n| 验证码\u002F挑战页 | 环境、会话或请求行为变化 | 暂停并单独诊断 |\n| HTTP 200 但空结果 | 业务无数据或解析问题 | 不应计为请求成功或 429 |\n| 5xx | 临时服务端错误 | 可有限重试，单独统计 |",{"type":25,"children":636},[637],{"text":638,"type":29},"把所有失败合并为一个错误率，会导致错误扩容代理 IP 池或错误提高重试次数。",{"type":25,"children":640},[641],{"text":642,"type":29},"建议把每个实验窗口固定为相同请求数，例如每组 100 次，并记录窗口开始和结束时间。只有在多个窗口都出现同样趋势时，才把“降频有效”或“少数出口异常”当作可复用结论。",{"type":31,"level":32,"children":644},[645],{"text":646,"type":29},"评估代理 IP 池容量的方法",{"type":25,"children":648},[649],{"text":650,"type":29},"评估代理 IP 池容量时，应使用单个代理 IP 的安全承载量、基线成功率、冷却占比和重试放大，而不是用“总请求量÷IP 数”直接估算。",{"type":31,"level":32,"children":652},[653],{"text":654,"type":29},"用脱敏复测数据区分频率限制与代理池因素",{"type":25,"children":656},[657],{"text":658,"type":29},"以下为脱敏记录示例（接口、账号和 IP 已隐去，数字为示例、非 SLA）：同一账号与单一出口、并发 5 时 50 次请求出现 429 12 次；降至并发 1、间隔 8 秒后为 2 次；保持低频改用 5 个出口仍为 2 次。该对照更支持频率因素，不能据此断言代理池无问题。",{"type":25,"children":660},[661],{"text":662,"type":29},"429 状态码与 `Retry-After` 可核对 [RFC 6585](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc6585.html)，HTTP 语义可核对 [RFC 9110](https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc9110.html)；并发、间隔和样本量属于经验设计。",{"type":31,"level":32,"children":664},[665],{"text":266,"type":29},{"type":31,"level":66,"children":667},[668],{"text":669,"type":29},"429 和 403 是同一种问题吗？",{"type":25,"children":671},[672],{"text":673,"type":29},"不是。429 主要表示请求过多或配额限制；403 还可能涉及权限、账号、地区或访问策略。",{"type":31,"level":66,"children":675},[676],{"text":677,"type":29},"没有 Retry-After 怎么办？",{"type":25,"children":679},[680],{"text":681,"type":29},"采用指数退避和随机抖动，并设置最大次数与任务总时限。仍持续 429 时暂停任务。",{"type":31,"level":66,"children":683},[684],{"text":685,"type":29},"账号配额会导致 429 吗？",{"type":25,"children":687},[688],{"text":689,"type":29},"会。若限制绑定账号或 API 密钥，更换代理 IP 通常不会解除配额限制。",{"type":31,"level":66,"children":691},[692],{"text":693,"type":29},"单次 429 能判断代理 IP 池质量吗？",{"type":25,"children":695},[696],{"text":697,"type":29},"不能。至少要完成降频实验，并在低频基线下比较多个同地区出口和时间窗口。",{"type":25,"children":699},[700],{"text":302,"type":29},{"type":25,"children":702},[703],{"text":704,"type":29},"确认问题确实集中在出口后，再按任务规模评估[动态住宅代理 IP](https:\u002F\u002Fwww.quanqiudaili.com\u002Fproduct\u002Fdynamic-residential)。",{"source":6,"id":706,"documentId":707,"translationKey":707,"locale":9,"slug":708,"path":709,"_path":709,"title":710,"description":711,"excerpt":711,"image":712,"publishedAt":713,"updatedAt":714,"author":17,"tags":715,"featured":19,"sortOrder":20,"readingTime":66,"bodyType":22,"bodyBlocks":716,"bodyHtml":307},2483,"p940djzj71fql92iswg7jyyg","market-intelligence-country-city-proxy-ip","\u002Fblog\u002Fmarket-intelligence-country-city-proxy-ip","市场情报采集如何选择国家和城市代理 IP？","市场情报采集应先按研究问题筛选国家，再确认目标站是否存在城市差异，并用分层抽样、地区交叉验证和失败分类校验代理 IP 结果。","https:\u002F\u002Fcms.quanqiudaili.com\u002Fuploads\u002Flarge_cover_c830f3842a.webp","2026-09-03T03:45:59.382Z","2026-09-03T03:45:59.369Z",[],[717,721,725,729,733,737,741,745,749,753,757,761,765,769,773,777,781,785,789,793,797,801,805,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,898,902,906,910,914,918,922,926,930,933],{"type":25,"children":718},[719],{"text":720,"type":29},"市场情报采集应先按业务问题选择国家，再决定是否下钻到城市。只有目标站会因城市改变价格、库存、配送、广告、搜索结果或门店信息时，城市层级代理 IP 才有额外价值；如果研究问题只比较国家语言、货币或国家层级页面，先做国家层级采样更节省资源，也更容易解释结果。",{"type":31,"level":32,"children":722},[723],{"text":724,"type":29},"先明确要用采集验证哪些市场差异",{"type":25,"children":726},[727],{"text":728,"type":29},"不要先看代理 IP 库存再决定市场。先明确要验证什么：",{"type":37,"children":730},[731],{"text":732,"type":29},"| 研究问题 | 国家层级是否通常足够 | 何时需要城市层级 |\n| --- | --- | --- |\n| 页面语言、货币、国家站重定向 | 通常足够 | 同一国家不同城市返回不同站点时 |\n| 商品价格和促销 | 先做国家层级 | 城市、邮编或门店影响价格时 |\n| 库存、配送时效、门店信息 | 往往不够 | 结果依赖城市、邮编或配送地址时 |\n| 本地搜索与广告展示 | 先做国家基线 | 目标结果明显按城市变化时 |\n| 竞争品牌覆盖 | 取决于研究范围 | 需要比较核心城市与非核心城市时 |",{"type":25,"children":734},[735],{"text":736,"type":29},"每个问题都要定义“页面出现什么差异才算有效”，例如货币变化、配送日期变化、门店列表变化或搜索结果排序变化。",{"type":31,"level":32,"children":738},[739],{"text":740,"type":29},"按市场价值和研究目标筛选国家",{"type":31,"level":66,"children":742},[743],{"text":744,"type":29},"先按业务价值划分市场层级",{"type":25,"children":746},[747],{"text":748,"type":29},"可以把候选国家分为四类：",{"type":25,"children":750},[751],{"text":752,"type":29},"1. **核心市场**：当前收入、客户或业务量较高，需要持续监测。\n2. **增长市场**：业务增长较快或准备投入，需要增加采样。\n3. **竞争对照市场**：用于比较竞争强度、价格或产品策略。\n4. **基准市场**：作为长期不变的参照组，帮助识别全站变化。",{"type":31,"level":66,"children":754},[755],{"text":756,"type":29},"用评分模型确定采样优先级",{"type":25,"children":758},[759],{"text":760,"type":29},"如果国家很多，可用评分表排序。下面权重仅为方法示例，企业应按自己的研究目标调整：",{"type":37,"children":762},[763],{"text":764,"type":29},"| 维度 | 示例权重 | 评分依据 |\n| --- | ---: | --- |\n| 当前业务价值 | 35% | 收入、客户量或业务优先级 |\n| 增长潜力 | 25% | 增长趋势与市场计划 |\n| 竞争变化速度 | 20% | 价格、广告和新品变化频率 |\n| 语言\u002F货币\u002F规则差异 | 10% | 是否能代表独立市场环境 |\n| 数据可获得性 | 10% | 页面稳定性、公开程度和合规条件 |",{"type":25,"children":766},[767],{"text":768,"type":29},"先统一各维度的评分范围，例如都使用 1–5 分，再按下式计算：",{"type":25,"children":770},[771],{"text":772,"type":29},"```text\n国家优先级得分 = 各维度评分 × 对应权重后求和\n```",{"type":25,"children":774},[775],{"text":776,"type":29},"缺失数据应标记为待核实，不要直接按 0 分处理，以免把“没有数据”误判为“没有价值”。",{"type":25,"children":778},[779],{"text":780,"type":29},"总分只用于排优先级，不代表代理 IP 质量，也不代表该市场一定值得长期投入。最终还要确认目标国家资源、地区识别和目标站可访问性。",{"type":31,"level":32,"children":782},[783],{"text":784,"type":29},"用小样本判断是否需要细分到城市",{"type":31,"level":66,"children":786},[787],{"text":788,"type":29},"设计国家与城市层级的对照样本",{"type":25,"children":790},[791],{"text":792,"type":29},"该对照的目的不是证明某个城市一定更优，而是判断城市差异在控制其他变量后是否仍然存在。",{"type":25,"children":794},[795],{"text":796,"type":29},"每个入选国家先选择一个核心城市和一个非核心城市，在同一时间窗口测试同一页面。保持浏览器版本、语言、Cookie、账号状态和请求参数一致，只改变城市出口。",{"type":31,"level":66,"children":798},[799],{"text":800,"type":29},"确定扩大城市采样的判定阈值",{"type":25,"children":802},[803],{"text":804,"type":29},"若连续多个样本在以下字段出现稳定差异，才扩大城市覆盖：",{"type":79,"format":80,"children":806},[807,811,815,819],{"type":83,"children":808},[809],{"text":810,"type":29},"商品价格、库存或配送时效；",{"type":83,"children":812},[813],{"text":814,"type":29},"搜索结果、广告或本地商家列表；",{"type":83,"children":816},[817],{"text":818,"type":29},"页面语言、货币、重定向或地区提示；",{"type":83,"children":820},[821],{"text":822,"type":29},"门店、服务范围或本地内容模块。",{"type":25,"children":824},[825],{"text":826,"type":29},"判定时至少覆盖多个时间窗口，并重复比较两个以上核心城市与非核心城市样本。差异要在同一业务字段上重复出现；单次价格跳变、缓存变化、验证码或网络失败不能作为城市差异证据。",{"type":25,"children":828},[829],{"text":830,"type":29},"达到上述条件后再扩大城市数量；如果城市之间没有稳定差异，继续国家层级采样即可。城市粒度不是越细越好，过度下钻会增加样本量、成本和归因难度。",{"type":31,"level":32,"children":832},[833],{"text":834,"type":29},"按国家与城市层级设计分层样本",{"type":25,"children":836},[837],{"text":838,"type":29},"一个可执行的起始结构是：",{"type":37,"children":840},[841],{"text":842,"type":29},"| 层级 | 样本角色 | 用途 |\n| --- | --- | --- |\n| 每国核心城市 | 业务与人口集中地区 | 观察主流市场表现 |\n| 每国非核心城市 | 与核心城市形成对照 | 判断差异是否只集中在大城市 |\n| 基准国家\u002F城市 | 长期保持不变 | 识别站点全局变化 |\n| 重复时间窗口 | 工作日\u002F周末或业务高低峰 | 排除短时促销与缓存影响 |",{"type":25,"children":844},[845],{"text":846,"type":29},"先用小样本确认差异，再增加城市和时间窗口。不要一开始同时扩大国家、城市、页面和账号数量，否则数据异常时很难定位原因。",{"type":31,"level":32,"children":848},[849],{"text":850,"type":29},"用页面信号交叉验证代理 IP 的国家和城市",{"type":25,"children":852},[853],{"text":854,"type":29},"先用 IP 检测页记录出口国家和城市，再与目标站页面语言、货币、重定向、配送地区或本地内容交叉验证。不同地理位置数据库可能给同一 IP 标注不同城市，因此“检测库城市不一致”不能直接判为代理 IP 错误。",{"type":25,"children":856},[857],{"text":858,"type":29},"建议记录三个层次：",{"type":25,"children":860},[861],{"text":862,"type":29},"1. 代理 IP 检测库显示的国家和城市；\n2. 目标站实际识别或展示的地区；\n3. 业务结果是否符合研究预期。",{"type":25,"children":864},[865],{"text":866,"type":29},"如果国家一致、城市有差异，应再换一个同城市代理 IP 复测；如果目标站明确跳转到错误国家，再联系服务方核实或更换代理 IP。",{"type":31,"level":32,"children":868},[869],{"text":870,"type":29},"按失败类型分别统计并处理",{"type":37,"children":872},[873],{"text":874,"type":29},"| 结果 | 是否计入业务差异 | 处理方式 |\n| --- | --- | --- |\n| 页面正常但无相关内容 | 可以单独统计 | 标记“无结果”，不等同网络失败 |\n| 验证码或挑战页 | 不计为有效业务结果 | 记录频率、Cookie、账号和出口 |\n| 连接超时或 5xx | 不计为有效业务结果 | 有限重试，保留耗时和错误 |\n| 账号\u002F权限提示 | 不计为地区差异 | 先处理账号或平台规则 |\n| 地区与购买国家不符 | 暂不计入 | 同地区换代理 IP 复测并记录 |",{"type":25,"children":876},[877],{"text":878,"type":29},"公开数据采样也应遵守目标站条款、访问频率、robots 或官方接口要求。代理 IP 只改变网络出口，不能改变访问权限。",{"type":25,"children":880},[881],{"text":882,"type":29},"在样本表中建议同时保留“购买国家、检测库国家、目标站展示国家、城市字段和业务结果”五列。地区不一致时先定位是哪一列发生偏差，再决定重测代理 IP 还是修正研究条件。",{"type":25,"children":884},[885],{"text":886,"type":29},"涉及采集责任边界时，可进一步查看[相关采集合规说明](https:\u002F\u002Fwww.quanqiudaili.com\u002Fblog\u002Fproxy-ip-risk-boundary-account-ads-kyc-scraping)。",{"type":31,"level":32,"children":888},[889],{"text":890,"type":29},"国家或城市代理 IP 资源不足时的替代方案",{"type":25,"children":892},[893],{"text":894,"type":29},"城市层级资源不足时，先退回国家层级采样或减少城市数量，不要用不确定的城市标注填补样本。国家、城市覆盖与识别结果应以当前后台、购买页或客户经理确认为准，不能把历史库存当成长期承诺。",{"type":31,"level":32,"children":896},[897],{"text":266,"type":29},{"type":31,"level":66,"children":899},[900],{"text":901,"type":29},"城市层级定位一定比国家层级更好吗？",{"type":25,"children":903},[904],{"text":905,"type":29},"不一定。只有研究对象在城市层面产生可验证差异时，城市级采样才值得增加成本。",{"type":31,"level":66,"children":907},[908],{"text":909,"type":29},"城市显示不一致就是代理 IP 错了吗？",{"type":25,"children":911},[912],{"text":913,"type":29},"不一定。先比较多个检测库和目标站实际展示，再使用同城市其他代理 IP 复测。",{"type":31,"level":66,"children":915},[916],{"text":917,"type":29},"样本应优先覆盖哪些市场？",{"type":25,"children":919},[920],{"text":921,"type":29},"先覆盖核心市场和增长市场，再加入竞争对照市场与一个长期基准市场。",{"type":31,"level":66,"children":923},[924],{"text":925,"type":29},"无结果可以直接记为采集失败吗？",{"type":25,"children":927},[928],{"text":929,"type":29},"不建议。无内容、验证码、网络失败和账号限制应分开统计，否则成功率和市场结论都会失真。",{"type":25,"children":931},[932],{"text":302,"type":29},{"type":25,"children":934},[935],{"text":936,"type":29},"完成小样本地区验证后，可按当前国家和城市需求评估[动态住宅代理 IP](https:\u002F\u002Fwww.quanqiudaili.com\u002Fproduct\u002Fdynamic-residential)。",[938],{"source":6,"id":7,"documentId":8,"translationKey":8,"locale":9,"slug":10,"path":11,"_path":11,"title":12,"description":13,"excerpt":13,"image":14,"publishedAt":15,"updatedAt":16,"author":17,"tags":939,"featured":19,"sortOrder":20,"readingTime":21,"bodyType":22,"bodyBlocks":940,"bodyHtml":307},[],[941,944,947,950,953,956,959,962,965,968,971,974,977,997,1000,1003,1006,1009,1012,1015,1018,1021,1024,1027,1030,1033,1036,1039,1042,1045,1048,1051,1054,1057,1060,1063,1066,1069,1072,1075,1078,1081,1084,1087,1090,1093,1096,1099,1102,1105,1108,1111,1114,1117,1120,1123,1126,1129,1132,1135,1138,1141,1144],{"type":25,"children":942},[943],{"text":28,"type":29},{"type":31,"level":32,"children":945},[946],{"text":35,"type":29},{"type":37,"children":948},[949],{"text":40,"type":29},{"type":25,"children":951},[952],{"text":44,"type":29},{"type":31,"level":32,"children":954},[955],{"text":48,"type":29},{"type":37,"children":957},[958],{"text":52,"type":29},{"type":25,"children":960},[961],{"text":56,"type":29},{"type":25,"children":963},[964],{"text":60,"type":29},{"type":31,"level":32,"children":966},[967],{"text":64,"type":29},{"type":31,"level":66,"children":969},[970],{"text":69,"type":29},{"type":25,"children":972},[973],{"text":73,"type":29},{"type":25,"children":975},[976],{"text":77,"type":29},{"type":79,"format":80,"children":978},[979,982,985,988,991,994],{"type":83,"children":980},[981],{"text":86,"type":29},{"type":83,"children":983},[984],{"text":90,"type":29},{"type":83,"children":986},[987],{"text":94,"type":29},{"type":83,"children":989},[990],{"text":98,"type":29},{"type":83,"children":992},[993],{"text":102,"type":29},{"type":83,"children":995},[996],{"text":106,"type":29},{"type":25,"children":998},[999],{"text":110,"type":29},{"type":31,"level":66,"children":1001},[1002],{"text":114,"type":29},{"type":25,"children":1004},[1005],{"text":118,"type":29},{"type":25,"children":1007},[1008],{"text":122,"type":29},{"type":25,"children":1010},[1011],{"text":126,"type":29},{"type":25,"children":1013},[1014],{"text":130,"type":29},{"type":25,"children":1016},[1017],{"text":134,"type":29},{"type":25,"children":1019},[1020],{"text":138,"type":29},{"type":25,"children":1022},[1023],{"text":142,"type":29},{"type":25,"children":1025},[1026],{"text":146,"type":29},{"type":25,"children":1028},[1029],{"text":150,"type":29},{"type":25,"children":1031},[1032],{"text":154,"type":29},{"type":25,"children":1034},[1035],{"text":158,"type":29},{"type":25,"children":1037},[1038],{"text":162,"type":29},{"type":25,"children":1040},[1041],{"text":166,"type":29},{"type":25,"children":1043},[1044],{"text":170,"type":29},{"type":25,"children":1046},[1047],{"text":174,"type":29},{"type":31,"level":66,"children":1049},[1050],{"text":178,"type":29},{"type":25,"children":1052},[1053],{"text":182,"type":29},{"type":25,"children":1055},[1056],{"text":186,"type":29},{"type":31,"level":32,"children":1058},[1059],{"text":190,"type":29},{"type":25,"children":1061},[1062],{"text":194,"type":29},{"type":25,"children":1064},[1065],{"text":198,"type":29},{"type":25,"children":1067},[1068],{"text":202,"type":29},{"type":25,"children":1070},[1071],{"text":206,"type":29},{"type":31,"level":32,"children":1073},[1074],{"text":210,"type":29},{"type":31,"level":66,"children":1076},[1077],{"text":214,"type":29},{"type":25,"children":1079},[1080],{"text":218,"type":29},{"type":31,"level":66,"children":1082},[1083],{"text":222,"type":29},{"type":25,"children":1085},[1086],{"text":226,"type":29},{"type":25,"children":1088},[1089],{"text":230,"type":29},{"type":25,"children":1091},[1092],{"text":234,"type":29},{"type":31,"level":32,"children":1094},[1095],{"text":238,"type":29},{"type":25,"children":1097},[1098],{"text":242,"type":29},{"type":25,"children":1100},[1101],{"text":246,"type":29},{"type":25,"children":1103},[1104],{"text":250,"type":29},{"type":31,"level":32,"children":1106},[1107],{"text":254,"type":29},{"type":25,"children":1109},[1110],{"text":258,"type":29},{"type":25,"children":1112},[1113],{"text":262,"type":29},{"type":31,"level":32,"children":1115},[1116],{"text":266,"type":29},{"type":31,"level":66,"children":1118},[1119],{"text":270,"type":29},{"type":25,"children":1121},[1122],{"text":274,"type":29},{"type":31,"level":66,"children":1124},[1125],{"text":278,"type":29},{"type":25,"children":1127},[1128],{"text":282,"type":29},{"type":31,"level":66,"children":1130},[1131],{"text":286,"type":29},{"type":25,"children":1133},[1134],{"text":290,"type":29},{"type":31,"level":66,"children":1136},[1137],{"text":294,"type":29},{"type":25,"children":1139},[1140],{"text":298,"type":29},{"type":25,"children":1142},[1143],{"text":302,"type":29},{"type":25,"children":1145},[1146],{"text":306,"type":29},null,[],[]]