用途:当抓取结果异常时,先定位原因,再按成本从低到高逐级尝试恢复,避免一上来就用最贵的浏览器方案。资料称多数“被拦截”并非机器人检测,有的甚至不是活服务器。
必要准备:需要 Apify 账号,并通过 apify login(OAuth,使用 Apify CLI 时)或 APIFY_TOKEN 环境变量认证。诊断运行前需一次性在控制台批准权限:apify/cheerio-scraper 要求完全账号访问,未批准会拒绝启动;MCP 调用与 CLI 报错措辞不同,且 CLI 可能以退出码 0 输出错误,导致无人值守流程误读为正常结果。apify/web-scraper 与 Rung 5 的浏览器 Actor 同样需要批准;apify/website-content-crawler 不需要。
诊断成本限制:每个出口、每个主机一次 DNS 查询和一次导航,随后停止并给出结论。单位是主机而非组织。预算只计目标自有主机的请求;查询第三方平台、数据目录或自检 IP 不计费。若已对同一主机发出四次请求仍无法确定原因,应停下来说明已知与继续排查的成本。
先用两个免费请求了解自身出口:curl -s "http://ip-api.com/json/?fields=query,country,as,org,hosting" 可看外部看到的地址、国家、ASN 和 hosting 标记;curl -s "https://www.cloudflare.com/cdn-cgi/trace" 可看 ip、loc 和 colo。hosting:true 表示 WAF 已把你归类。DNS 用 DoH 向两家解析:curl -s -H "accept: application/dns-json" "https://dns.google/resolve?name=HOST&type=A" 与 curl -s -H "accept: application/dns-json" "https://cloudflare-dns.com/dns-query?name=HOST&type=A"。UDP 返回不可路由地址可能是本机代理 fake-ip 模式(常见于 Clash、mihomo、sing-box,198.18.0.0/15),不能仅凭 UDP 判定主机死亡。
第 0 步:检查数据是否已在更便宜处发布(开放数据门户、ArcGIS REST、批量下载、.json、sitemap.xml)、是否存在未拥有的登录或付费墙、条款是否禁止采集。Socrata 与 ArcGIS 的发现命令按资料原样保留,含 curl -s "https://api.us.socrata.com/api/catalog/v1?domains=DOMAIN&q=TERM&limit=5" 等。
第 1 步:确认服务器是否应答、目标是否仍在。无状态/头/体、TLS 握手失败、连接被拒、私网或 CGNAT 地址等,附检查表与 DoH 双答案判定。若两个解析器都 NXDOMAIN,主机不存在,无需继续。
第 2 步:对返回内容分类,区分 403/503 拦截页与挑战页(Just a moment...、cf-mitigated)、Cloudflare 标识、存储服务 403、429、隐藏表单、传感器脚本等,并给出对应处理与不应做的事。
适用场景:抓取被拦截、限流、返回空或部分内容时的止损与升级决策。限制:资料未提供完整后续 Rung 步骤细节、收费价格与效果保证;部分命令与预算规则仅适用于公开站点,内部名称需反转判断。