直接给结论:用Python获取Zillow数据,代理IP代码并不难,难的是把任务做成可观察、可停止、可恢复的采集流程。
只写一个requests.get(),测试阶段可能够用。一旦放进服务器定时运行,连接超时、响应内容异常、文件不完整和字段变化都会出现。没有日志和校验,脚本即使每天显示“执行完成”,也可能早就没有产生可用数据。
下面用Zillow Research公开CSV做一个工程化示例。
数据入口先走公开文件
都会区级ZHVI公开数据示例:
https://files.zillowstatic.com/research/public_csvs/zhvi/Metro_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv
它适合分析不同都会区的典型房屋价值变化。与页面解析相比,CSV字段更容易验证,也便于在本地长期归档。
代理IP在这里承担网络出口角色。数据是否允许自动获取,以及可以怎样保存和使用,仍应以平台当前公开规则与授权范围为准。
配置与代码分开
安装依赖:
pip install requests pandas
设置代理:
export PROXY_URL="http://username:password@proxy-host:port"
编写配置:
import osfrom dataclasses import dataclassfrom pathlib import Path@dataclassclass DownloadConfig: url: str output: Path connect_timeout: int = 10 read_timeout: int = 60 proxy_url: str | None = os.getenv("PROXY_URL")config = DownloadConfig( url=( "https://files.zillowstatic.com/research/public_csvs/zhvi/" "Metro_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv" ), output=Path("zillow_metro_zhvi.csv"),)
后续更换文件地址、超时时间或输出目录时,只修改配置,不碰下载逻辑。
下载时记录真实状态
日志没有输出完整代理地址,只记录是否启用代理。账号、密码和节点地址不应该出现在控制台或公开日志中。
文件落盘后再做数据检查
响应检查解决“下载回来的是什么”,字段检查解决“这份数据能不能继续分析”。两层都通过,任务才算真正成功。
按错误类型处理
| 错误类型 | 常见表现 | 处理方式 |
|---|
| 连接问题 | 超时、连接失败 | 记录链路状态,有限重试 |
| 服务端异常 | 5xx状态 | 等待后再试,保留旧文件 |
| 访问条件异常 | 403、429 | 停止任务并核对规则 |
| 内容异常 | HTML、空文件 | 拒绝覆盖正式文件 |
| 字段异常 | 列名缺失 | 暂停分析并检查数据版本 |
不要让所有异常都进入同一个重试循环。连接抖动可以重试,字段变化却必须修改清洗逻辑;两者处理方式完全不同。
代理IP要用真实任务验收
测试代理时,直接下载目标CSV,并记录以下结果:
建立连接需要多长时间;
完整文件需要多久落盘;
文件大小是否正常;
连续几次任务的耗时是否波动明显;
不启用代理时是否已经可以稳定完成。
只测试出口地址没有多少参考价值。对数据工程来说,能够完整、稳定地交付文件,才算这条链路可用。
FAQ
Q:为什么不在代码里自动更换代理地址?
是否需要切换取决于网络方案和任务条件,不能预设。公开CSV低频下载通常更应该关注连接稳定性和文件完整性。
Q:脚本返回failed后应该立刻重跑吗?
先看错误类型。短时网络波动可以有限重试,内容或字段异常则应停止并检查数据入口。
Q:怎样确认文件没有下载一半?
先写入临时文件,完成表头、文件大小和CSV解析校验后再替换正式文件。同时保留上一份成功版本。
Q:日志应该保存哪些内容?
建议记录执行时间、状态码、耗时、文件大小、代理是否启用和校验结果。不要记录代理密码或完整认证地址。