本文还有配套的精品资源点击获取简介两个开箱即用的Python脚本分别对接淘宝司法拍卖和京东司法拍卖的土地类标的页面无需登录、不依赖验证码识别只采集公开列表页与详情页中的结构化数据。taobaofapai.py抓取淘宝平台土地拍卖信息sf_jd.py适配京东司法拍卖土地频道均支持按日自动运行提取字段包括标的名称、所在省市县、起拍价、评估价、保证金金额、开拍时间、标的链接等核心信息。脚本内置基础反爬策略随机User-Agent切换、可控请求间隔、HTML解析容错处理适配当前主流页面结构。配套requirements.txt明确列出依赖库requests、lxml、beautifulsoup4README.md提供安装步骤、执行命令示例、常见问题提示如页面结构调整应对建议及CSV导出方法。所有代码仅访问公开可读页面不模拟登录、不存储账号凭证、不调用第三方API适合本地部署后加入系统定时任务如Linux crontab或Windows计划任务实现每日数据同步。1. 项目概述为什么需要一个“只读不登录”的司法土地数据采集工具我做不动产数据服务已经八年从最早手动翻页抄录法院公告到后来用Excel VBA批量抓取再到如今自己搭整套自动化流水线——最深的体会是司法拍卖土地信息的价值不在“快”而在“稳”和“准”。你不需要秒级刷新但必须保证每天早上九点打开表格时昨天新增的27宗杭州余杭区工业用地、5宗佛山南海住宅用地、3宗成都双流物流仓储地块全都老老实实躺在你的CSV里字段对得上、价格没乱码、链接能点开、时间没错位。这个工具就是为解决这类“低频但高可靠性需求”而生的。它不碰登录态、不搞验证码识别、不调用任何付费API所有数据都来自淘宝司法拍卖taobao.com/fapai和京东司法拍卖jd.com/fapai两个平台公开可访问的土地类目列表页与详情页。关键词里写的“淘宝爬虫”“京东爬虫”其实不太准确——更贴切的说法是“结构化页面解析器”。它不模拟人点击、不维持会话、不触发JS渲染逻辑而是像一位经验丰富的档案员只在页面HTML源码的固定位置精准摘取已存在的文字块。举个实际场景某地市级城投公司风控部同事每周一要汇总辖区内法院新挂拍的土地标的用于内部尽调初筛。过去靠实习生人工整理平均耗时3.5小时/次漏项率约12%尤其遇到“XX县经济开发区XX地块二期”这种带括号嵌套命名时。上线这个脚本后他把taobaofapai.py和sf_jd.py放进Linux服务器crontab设置每天凌晨4:30自动运行6:00前邮件自动推送合并后的CSV。现在他花15分钟核对数据完整性其余时间专注看评估报告。这不是炫技是把重复劳动从“人力密集型”变成“确认检查型”。它适合三类人一是地方政府招商/自然资源部门做区域土地供应监测二是律所/评估机构做竞买前基础尽调三是中小开发商做低成本市场扫描。不适合谁想绕过平台风控刷单、想实时监控每分钟价格变动、或者指望它自动帮你出价的人——这工具连登录按钮都没点它只读且只读一次。2. 整体设计思路与核心约束逻辑2.1 为什么放弃Selenium坚持纯RequestsBS4/LXML很多人第一反应是“司法拍卖页面肯定有JS渲染不用浏览器驱动怎么行”我试过。2022年用Selenium跑淘宝司法拍卖稳定运行三个月后某天凌晨突然全部卡死在“等待元素出现”阶段。查日志发现淘宝悄悄在列表页加了一层动态插入的div idsecurity-check内容为空但CSS设为display:noneSelenium却把它当成了有效节点等待。修复方案换XPath、加显式等待、甚至注入JS跳过检测……但下一周京东又在详情页的起拍价字段外层包了一个随机class名的span导致价格提取全错。于是彻底转向纯HTTP请求方案。核心判断依据就一条淘宝和京东司法拍卖的土地频道其列表页和详情页的HTML骨架是静态生成的关键字段文本始终存在于初始HTML中只是被CSS或JS做了视觉隐藏或延迟加载而非真正动态生成。我们验证过直接用curl -v 请求淘宝土地列表页URL响应体里就有完整的a classitem-title href...XX市XX区工业用地/a用requests.get()拿到的response.text里也能grep出span classprice-num28500000/span。所谓“JS渲染”其实是前端把已有数据重新排版不是从后端拉新数据。所以技术栈锁定为-requests轻量、可控、易调试支持session复用和精细的headers控制-lxml主解析器比BeautifulSoup快3~5倍尤其处理大HTML文档时内存占用低xpath语法精准定位-beautifulsoup4辅助对部分结构混乱的详情页做容错兜底比如京东某些老页面存在未闭合的font标签lxml会报错BS4能自动修复。提示不要迷信“最新技术”。Selenium适合需要交互的场景如填表、拖拽滑块而司法拍卖土地页的核心价值字段名称、价格、时间、地址在首屏HTML里就已存在。用重武器打蚊子只会增加维护成本。2.2 “不登录、不验证码”的底层实现逻辑是什么很多用户担心“不登录怎么拿到数据会不会被封IP”答案很实在因为平台本身就没要求登录才能看土地拍卖列表。你用无痕模式打开 https://sf.taobao.com/land 或者直接curl这个URL返回的就是完整HTML。淘宝司法拍卖的土地频道/land和京东的/land都是公开入口法院上传标的时就设为“所有人可见”这是司法公开的基本要求。真正的难点不在“进不去”而在“拿不准”。比如淘宝列表页的分页URL是https://sf.taobao.com/land?city330000province330000page2其中city和province参数是浙江省编码但页面底部的“下一页”链接却是a href/land?city330000amp;province330000amp;page3下一页/a如果脚本傻乎乎地拼接base_url href就会得到https://sf.taobao.com/land?city330000province330000page3看似正确但实际请求时淘宝会302跳转到首页——因为它的反爬策略检测到Referer缺失或User-Agent异常。所以我们设计了三层防护1.Referer白名单机制每次请求列表页前先GET一次根目录https://sf.taobao.com/记录其响应头中的Set-Cookie仅用于构造合法Referer后续所有子页面请求都带上Referer: https://sf.taobao.com/land?city330000province3300002.User-Agent轮换池内置12个主流浏览器UA字符串Chrome 115~122、Edge 116~121、Firefox 115~120每次请求随机选取避免单一UA被限流3.请求间隔动态调节基础间隔设为3.2秒非整数避开风控采样周期若某次请求返回状态码非200或响应体长度50KB则自动延长至8秒并重试最多3次。注意这不是“对抗”而是“模拟”。我们让脚本的行为无限接近一个真实人类用户用不同浏览器、有合理停留时间、从首页导航进来。平台风控系统针对的是高频、无Referer、UA单一的机器流量而不是这种“慢但规矩”的访问。2.3 字段提取策略为什么“所在地区”要拆成省/市/县三级原始需求只要求“所在地区”但实际业务中这个字段必须结构化。比如淘宝页面显示div classitem-address广东省广州市黄埔区开源大道XXX号/div而京东页面可能是span classarea成都市双流区/span如果统一存为字符串“广东省广州市黄埔区开源大道XXX号”后续做数据分析就极其痛苦你想统计“广州市挂牌土地数量”得用正则反复匹配想筛选“长三角地区”得维护一个城市映射表。所以脚本强制执行三级拆解省级通过预置字典匹配如“广东”→“广东省”“川”→“四川省”覆盖简称、全称、古称如“蜀”市级在省级匹配后截取剩余字符串前2~4个字符结合市级名录校验如“广州市”“深圳市”“佛山市”县级市级匹配后取后续首个含“区/县/市县级/旗”的词组例如“黄埔区”“双流区”“义乌市”。这个逻辑写在utils/region_parser.py里不是简单split(“市”)而是基于民政部2023年行政区划代码表构建的有限状态机。它能正确处理“内蒙古自治区阿拉善盟额济纳旗”这种长链也能识别“湖北省直辖县级行政区仙桃市”这种特殊案例。为什么这么做因为我在给某省自然资源厅做数据对接时吃过亏他们提供的Excel里“地区”列有的写“杭州市”有的写“浙江杭州”有的写“HZ”最后清洗花了两天。现在脚本输出CSV直接带province、city、district三列下游系统零成本接入。3. 核心细节解析与实操要点3.1 淘宝司法拍卖taobaofapai.py的关键解析点淘宝土地频道的HTML结构相对规范但有两个“温柔陷阱”必须绕开陷阱一列表页的“懒加载”占位符淘宝列表页实际只渲染首屏10条后面20条用div classlazy-load-placeholder/div占位。但关键在于——这些占位符的data-url属性里藏着真实详情页URL。比如div classlazy-load-placeholder>LIST_ITEM_URL //div[contains(class,item-wrap)]//a[classitem-title]/href DETAIL_PRICE_NUM //span[contains(class,price-num)]/text() DETAIL_ADDRESS //div[contains(class,item-address)]/text()一旦页面改版只需修改这个配置文件无需动主逻辑。上周淘宝把item-address改成location-info我3分钟就修好了。3.2 京东司法拍卖sf_jd.py的顽固适配点京东的结构比淘宝更“野”尤其体现在两点顽固点一动态class名的对抗式命名京东详情页的保证金字段class名每周都在变- 第1周span classguarantee-amount-abc123500000/span- 第2周span classdeposit-price-def456500000/span- 第3周span classbond-value-xyz789500000/span它明显在用哈希值混淆class。但我们发现无论class名怎么变该字段永远是页面中唯一一个紧邻span保证金/span兄弟节点的span标签。所以脚本用XPath//span[text()保证金]/following-sibling::span[1]/text()完全绕过class名直击DOM关系。这是对页面语义的理解而非对class的依赖。顽固点二开拍时间的时区与格式迷雾京东详情页显示“开拍时间2024-05-20 10:00:00”但实际这个时间是北京时间UTC8而其API返回的原始数据却是UTC时间。我们曾踩坑直接存这个字符串到数据库结果某次导出Excel给上海客户对方说“你们的时间比法院公告晚8小时”。后来查证京东前端JS把UTC时间2024-05-20T02:00:00Z格式化成了本地时间显示但HTML源码里藏了一个隐藏inputinput typehidden idauctionStartTime value2024-05-20T02:00:00Z脚本优先读这个value用datetime.fromisoformat()解析后转为datetime.now().astimezone()的本地时区确保所有时间字段统一为东八区标准时间。注意别信页面上肉眼看到的时间一定要找隐藏字段或API接口返回的原始时间戳。这是司法数据的底线——时间必须可溯源、可验证。3.3 反爬策略的实操落地细节很多人看了README里的“User-Agent轮换”“请求间隔”觉得很简单但真正在生产环境跑半年你会发现细节决定成败User-Agent轮换不是随机选而是按设备比例模拟我们统计了2023年司法拍卖页面的真实用户UA分布通过合作律所的前端埋点数据构建了符合现实的轮换池- Windows Chrome52%主力- macOS Safari23%第二主力尤其律师用Mac多- Android Chrome15%- iOS Safari10%脚本用random.choices()按权重抽样而不是random.choice()均等抽取。这样更难被风控模型识别为机器流量。请求间隔不是固定值而是带抖动的泊松分布固定3.2秒间隔容易被识别为定时任务。我们改用import random base_interval 3.2 jitter random.uniform(-0.8, 1.2) # -0.8~1.2秒抖动 actual_interval max(2.0, base_interval jitter) # 下限2秒防超频 time.sleep(actual_interval)实测下来这种“人类级不规律”让单IP日请求量从300次提升到800次仍无封禁。最关键的容错HTML解析失败时的降级路径当lxml因页面结构突变解析失败脚本不会直接报错退出而是启动三级降级1. 尝试用BS4的html.parser重新解析同一HTML2. 若仍失败提取response.text中所有script标签内容搜索window.pageData {.*?}这样的全局变量从中JSON提取关键字段3. 最终fallback记录失败URL到error_log.txt附上HTTP状态码、响应长度、当前时间供人工核查。这个机制让我们在2024年3月京东大规模改版期间依然保持了92%的数据采集成功率其余8%的失败项当天就收到邮件告警人工补采即可。4. 实操过程与核心环节实现4.1 环境准备与依赖安装一步到位别被requirements.txt吓住实际只需4个库且全部兼容Python 3.8~3.12# 推荐用虚拟环境避免污染系统 python -m venv fapai_env source fapai_env/bin/activate # Linux/Mac # fapai_env\Scripts\activate # Windows # 安装核心依赖注意lxml需编译国内用户加清华源加速 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ \ requests lxml beautifulsoup4 cn2an为什么没写-r requirements.txt因为原文件里混进了pyyaml用于读配置但脚本实际没用到和loguru日志库已被精简为内置print文件写入。我们砍掉了所有非必要依赖让安装命令极简、可靠、无冲突。提示如果你在CentOS 7上安装lxml失败缺libxml2-devel和libxslt-devel执行bash yum install libxml2-devel libxslt-devel python3-devel pip install lxml4.2 首次运行与配置校准脚本默认配置在config/default.py里首次运行前建议手动校准两项1. 地域范围配置避免抓全网数据淘宝和京东都支持按省份筛选脚本默认抓全国但多数用户只需本省。编辑config/default.py# 淘宝配置 TAOBAO_REGION { province: 330000, # 浙江省编码 city: 330100, # 杭州市编码 district: # 空字符串表示不限县级 } # 京东配置京东用拼音非编码 JD_REGION { province: zhejiang, city: hangzhou, district: }编码表在docs/area_codes.xlsx里已整理好全国34个省级、333个地级、2843个县级行政区的最新编码民政部2024年1月版。2. 输出路径与文件名规则默认输出到output/目录文件名含日期OUTPUT_DIR output FILENAME_TEMPLATE fapai_{platform}_{date}.csv # 如 fapai_taobao_20240520.csv你可以改成/data/fapai/或挂载NAS路径只要Python有写权限即可。4.3 执行命令与日志观察单次手动运行调试用# 抓淘宝土地数据默认抓杭州 python taobaofapai.py # 抓京东土地数据默认抓浙江 python sf_jd.py # 抓指定城市如深圳 python taobaofapai.py --city 440300查看实时日志脚本运行时会在控制台打印结构化日志[2024-05-20 04:30:12] INFO: 开始抓取淘宝司法拍卖土地数据... [2024-05-20 04:30:15] INFO: 成功获取列表页杭州共找到24条标的 [2024-05-20 04:30:48] INFO: 已解析24条详情页提取字段完整率98.3% [2024-05-20 04:30:49] INFO: CSV已保存至 output/fapai_taobao_20240520.csv (24 rows)关键日志字段解读-提取字段完整率98.3%指24条中23条的7个核心字段名称、地区、起拍价、评估价、保证金、开拍时间、链接全部提取成功1条缺失“评估价”法院未公示-共找到24条标的是列表页解析结果不是最终入库数因为详情页可能404或结构异常-CSV已保存表示脚本完成不是“开始保存”。实操心得第一次运行时务必打开--debug参数bash python taobaofapai.py --debug它会额外保存debug_html/taobao_list_20240520.html和debug_html/taobao_detail_123456.html方便你用浏览器直接打开对照XPath是否写对。我90%的Selector调试都在这个模式下完成。4.4 定时任务部署Linux crontab实战这才是真正解放双手的环节。以Ubuntu 22.04为例步骤1赋予脚本执行权限chmod x taobaofapai.py sf_jd.py步骤2编辑crontab# 每天凌晨4:30执行淘宝抓取 30 4 * * * cd /path/to/your/project /path/to/your/venv/bin/python taobaofapai.py /var/log/fapai_taobao.log 21 # 每天凌晨5:00执行京东抓取 0 5 * * * cd /path/to/your/project /path/to/your/venv/bin/python sf_jd.py /var/log/fapai_jd.log 21 # 每天凌晨5:30合并CSV用自带的merge_tool.py 30 5 * * * cd /path/to/your/project /path/to/your/venv/bin/python merge_tool.py /var/log/fapai_merge.log 21关键细节- 必须写绝对路径/path/to/your/venv/bin/pythoncrontab不读你的bashrc- /var/log/xxx.log 21把stdout和stderr都追加到日志方便排查- 合并脚本merge_tool.py会自动读取output/下当天所有fapai_*.csv去重后按platform,province,city,district排序生成fapai_merged_20240520.csv。Windows计划任务提示用任务计划程序创建基本任务操作设置为- 程序C:\path\to\venv\Scripts\python.exe- 参数C:\path\to\project\taobaofapai.py- 起始于C:\path\to\project\注意Windows路径要用反斜杠\且确保Python路径不含空格如Program Files会导致失败建议虚拟环境装在C:\venv\fapai。4.5 CSV导出与字段说明开箱即用脚本生成的CSV严格遵循RFC 4180标准用UTF-8 with BOM编码兼容Excel中文字段顺序与含义如下字段名类型说明示例platformstring平台来源taobao,jdtitlestring标的全称脱敏处理杭州市西湖区文三路XXX号国有建设用地使用权provincestring省级行政区全称浙江省citystring地级市全称杭州市districtstring县/区/县级市全称西湖区start_priceinteger起拍价单位元28500000appraisal_priceinteger评估价单位元法院提供32000000depositinteger保证金单位元500000auction_timedatetime开拍时间东八区2024-05-20 10:00:00urlstring标的详情页URLhttps://sf.taobao.com/item_detail-123456789.htmcrawl_timedatetime本次抓取完成时间2024-05-20 04:30:49特别说明- 所有价格字段均为整数无小数、无单位、无逗号可直接参与计算-auction_time和crawl_time都是YYYY-MM-DD HH:MM:SS格式Excel可直接识别为日期-title字段已做基础脱敏去除联系电话、身份证号片段如11010119900307231X会被替换为[ID]符合《个人信息保护法》对公开数据的处理要求。你可以直接把这个CSV拖进Power BI做地图热力图或导入MySQL建表CREATE TABLE fapai_land ( id BIGINT PRIMARY KEY AUTO_INCREMENT, platform VARCHAR(10), title TEXT, province VARCHAR(20), city VARCHAR(20), district VARCHAR(20), start_price BIGINT, appraisal_price BIGINT, deposit BIGINT, auction_time DATETIME, url TEXT, crawl_time DATETIME, INDEX idx_province_city (province, city), INDEX idx_auction_time (auction_time) );5. 常见问题与排查技巧实录5.1 页面结构调整导致提取失败最高频问题现象脚本运行成功日志显示“共找到XX条”但CSV里全是空行或只有URL字段有值。排查步骤1. 查看debug_html/下的最新列表页HTML用浏览器CtrlF搜索item-title确认是否存在2. 若存在打开对应详情页HTML搜索price-num或保证金确认目标字段是否还在3. 若字段class名变了如淘宝把price-num改成bid-start-price打开config/taobao_selectors.py修改对应XPath4. 若整个DOM结构大改如京东把列表从ul改成div classgrid需重写parse_list_page()函数但逻辑不变找所有标的链接。我的经验淘宝平均6.2周改一次列表页结构京东平均4.8周。我们建立了“结构变更响应清单”记录每次变更的日期、影响范围、修复方案。例如2024年4月12日淘宝改版把a classitem-title移到了div classitem-content内层XPath从//a[classitem-title]改为//div[contains(class,item-content)]//a[classitem-title]。这个清单放在docs/structure_change_log.md里新人入职第一天就学这个。5.2 请求被拒绝403/406错误现象日志出现HTTP 403 Forbidden或HTTP 406 Not Acceptable且持续多小时。根本原因不是IP被封而是请求头缺失关键字段。淘宝/京东风控会校验-Accept必须为text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8-Accept-Language必须为zh-CN,zh;q0.9,en;q0.8-Upgrade-Insecure-Requests必须为1解决方案在taobaofapai.py开头的HEADERS字典里补全这些字段HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..., Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Upgrade-Insecure-Requests: 1, Connection: keep-alive, }提示别用网上搜的“万能UA”必须匹配Accept头。我见过有人UA写Chrome最新版但Accept头还是旧版结果被406拦截。5.3 时间字段错乱开拍时间比法院公告早8小时现象CSV里的auction_time是2024-05-20 02:00:00但法院公告写的是10:00。定位方法打开debug_html/下的详情页HTML搜索auctionStartTime或startTime看隐藏input的value值。如果是2024-05-20T02:00:00Z说明是UTC时间脚本没走时区转换逻辑。修复检查parsers/jd_parser.py里的parse_auction_time()函数确认是否调用了from datetime import datetime from dateutil import tz utc_time datetime.fromisoformat(raw_time.replace(Z, 00:00)) beijing_tz tz.gettz(Asia/Shanghai) local_time utc_time.astimezone(beijing_tz) return local_time.strftime(%Y-%m-%d %H:%M:%S)如果没有astimezone()就是bug。这个函数在2024年3月版本已修复确保你用的是master分支最新代码。5.4 数据重复或遗漏定时任务并发问题现象某天CSV里有两条完全一样的标的相同title、相同url或某条标的在列表页存在但CSV里没有。原因分析-重复crontab设置了每小时执行一次但脚本运行时间超过1小时如网络卡顿导致两次运行重叠都抓了同一批数据-遗漏京东列表页分页逻辑异常第3页实际返回了第2页数据HTTP缓存未刷新。根治方案1. 在crontab里加锁机制bash 30 4 * * * flock -n /tmp/fapai_taobao.lock -c cd /path /venv/bin/python taobaofapai.py2. 脚本内部加URL去重每次抓取前先读取昨日CSV的url列存入set本次抓取时跳过已存在的URL3. 分页时强制加时间戳参数防缓存python url fhttps://sf.jd.com/land?provincezhejiangcityhangzhoupage{page}t{int(time.time())}我的血泪教训曾因没加锁导致连续三天生成重复数据下游BI报表虚高300%。现在所有生产环境都强制flock多花2秒省去半天排查。5.5 中文乱码与特殊字符CSV打开显示问号现象Excel打开CSV标题显示为æ ‡ç„åç§°或地址里“变成“。根源Python默认用系统编码写文件Linux是UTF-8Windows是GBK。脚本用open(..., encodingutf-8-sig)写CSV-sig表示带BOM头Excel才能正确识别。验证方法用VS Code打开CSV右下角看编码显示是否为UTF-8 with BOM。如果不是用VS Code的“重新以编码打开”→UTF-8 with BOM再保存。终极方案在export_csv()函数里强制指定BOMwith open(filepath, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(data)这个细节看似小但影响用户体验。我坚持所有输出文件带BOM因为90%的终端用户用Excel不是程序员。6. 进阶扩展与安全边界提醒6.1 可安全扩展的方向不越界这个工具的设计哲学是“最小必要原则”以下扩展经我们实测可行且不触碰平台红线1. 增加PDF公告附件下载仅限公开链接淘宝/京东详情页下方常有“标的调查情况表”“法院裁定书”等PDF链接URL形如https://sf.taobao.com/attachment/xxx.pdf。脚本可增加download_attachmentsTrue参数用requests下载并保存到attachments/目录文件名用标的ID哈希不改变原始文件名避免中文乱码。2. 微信消息推送仅通知不发敏感数据用企业微信机器人Webhook每天抓取完成后发送摘要【司法土地日报】2024-05-20 ✅ 淘宝杭州24宗绍兴11宗宁波8宗 ✅ 京东浙江19宗江苏15宗安徽7宗 ⚠️ 注意绍兴3宗标的评估价未公示 详情见\\nas\fapai\merged_20240520.csv注意绝不推送具体价格、地址、联系方式只推数量和地域分布。3. 与GIS系统对接坐标解析调用高德/百度地图开放平台的地理编码API需申请免费KEY将provincecitydistricttitle拼接为地址请求经纬度。我们封装了utils/geocode.py支持失败自动降级为“市级坐标”如杭州市中心点确保不因API失败中断主流程。6.2 绝对不可碰的红线安全边界有些需求听起来合理但必须明确拒绝× 自动登录账号抓取私有数据淘宝/京东的“我的竞买”“关注标的”等页面需登录且涉及个人隐私。我们的脚本连登录按钮都不点这是法律和伦理底线。× 绕过验证码OCR或第三方打码即使页面偶尔弹验证码脚本也应直接退出并报错绝不集成任何验证码识别模块。司法数据的公信力源于其公开、透明、可验证而非技术钻营。× 存储用户凭证或Cookierequirements.txt里没有seleniumconfig/目录下没有cookies.json代码里没有driver.add_cookie()——这是刻意为之的干净。× 实时监控与自动出价有客户提过“能不能监控到降价就自动出价”答案永远是否定的。这已超出信息采集范畴进入交易执行层既违反平台规则也违背我们“只读不写”的设计初心。我的体会做司法数据工具最大的风险不是技术失效而是越界。守住“公开、静态、只读”这三条线工具才能长久、安心、被人信任地用下去。我宁愿少一个功能也不愿多一丝风险。这个工具跑了两年服务过17家政府单位、32家律所、89家开发商零法律纠纷、零平台投诉、零数据泄露。它不酷炫但像一把老菜刀——钝但可靠慢但从不误事。本文还有配套的精品资源点击获取简介两个开箱即用的Python脚本分别对接淘宝司法拍卖和京东司法拍卖的土地类标的页面无需登录、不依赖验证码识别只采集公开列表页与详情页中的结构化数据。taobaofapai.py抓取淘宝平台土地拍卖信息sf_jd.py适配京东司法拍卖土地频道均支持按日自动运行提取字段包括标的名称、所在省市县、起拍价、评估价、保证金金额、开拍时间、标的链接等核心信息。脚本内置基础反爬策略随机User-Agent切换、可控请求间隔、HTML解析容错处理适配当前主流页面结构。配套requirements.txt明确列出依赖库requests、lxml、beautifulsoup4README.md提供安装步骤、执行命令示例、常见问题提示如页面结构调整应对建议及CSV导出方法。所有代码仅访问公开可读页面不模拟登录、不存储账号凭证、不调用第三方API适合本地部署后加入系统定时任务如Linux crontab或Windows计划任务实现每日数据同步。本文还有配套的精品资源点击获取
淘宝京东司法拍卖土地信息自动抓取工具(每日定时更新)
本文还有配套的精品资源点击获取简介两个开箱即用的Python脚本分别对接淘宝司法拍卖和京东司法拍卖的土地类标的页面无需登录、不依赖验证码识别只采集公开列表页与详情页中的结构化数据。taobaofapai.py抓取淘宝平台土地拍卖信息sf_jd.py适配京东司法拍卖土地频道均支持按日自动运行提取字段包括标的名称、所在省市县、起拍价、评估价、保证金金额、开拍时间、标的链接等核心信息。脚本内置基础反爬策略随机User-Agent切换、可控请求间隔、HTML解析容错处理适配当前主流页面结构。配套requirements.txt明确列出依赖库requests、lxml、beautifulsoup4README.md提供安装步骤、执行命令示例、常见问题提示如页面结构调整应对建议及CSV导出方法。所有代码仅访问公开可读页面不模拟登录、不存储账号凭证、不调用第三方API适合本地部署后加入系统定时任务如Linux crontab或Windows计划任务实现每日数据同步。1. 项目概述为什么需要一个“只读不登录”的司法土地数据采集工具我做不动产数据服务已经八年从最早手动翻页抄录法院公告到后来用Excel VBA批量抓取再到如今自己搭整套自动化流水线——最深的体会是司法拍卖土地信息的价值不在“快”而在“稳”和“准”。你不需要秒级刷新但必须保证每天早上九点打开表格时昨天新增的27宗杭州余杭区工业用地、5宗佛山南海住宅用地、3宗成都双流物流仓储地块全都老老实实躺在你的CSV里字段对得上、价格没乱码、链接能点开、时间没错位。这个工具就是为解决这类“低频但高可靠性需求”而生的。它不碰登录态、不搞验证码识别、不调用任何付费API所有数据都来自淘宝司法拍卖taobao.com/fapai和京东司法拍卖jd.com/fapai两个平台公开可访问的土地类目列表页与详情页。关键词里写的“淘宝爬虫”“京东爬虫”其实不太准确——更贴切的说法是“结构化页面解析器”。它不模拟人点击、不维持会话、不触发JS渲染逻辑而是像一位经验丰富的档案员只在页面HTML源码的固定位置精准摘取已存在的文字块。举个实际场景某地市级城投公司风控部同事每周一要汇总辖区内法院新挂拍的土地标的用于内部尽调初筛。过去靠实习生人工整理平均耗时3.5小时/次漏项率约12%尤其遇到“XX县经济开发区XX地块二期”这种带括号嵌套命名时。上线这个脚本后他把taobaofapai.py和sf_jd.py放进Linux服务器crontab设置每天凌晨4:30自动运行6:00前邮件自动推送合并后的CSV。现在他花15分钟核对数据完整性其余时间专注看评估报告。这不是炫技是把重复劳动从“人力密集型”变成“确认检查型”。它适合三类人一是地方政府招商/自然资源部门做区域土地供应监测二是律所/评估机构做竞买前基础尽调三是中小开发商做低成本市场扫描。不适合谁想绕过平台风控刷单、想实时监控每分钟价格变动、或者指望它自动帮你出价的人——这工具连登录按钮都没点它只读且只读一次。2. 整体设计思路与核心约束逻辑2.1 为什么放弃Selenium坚持纯RequestsBS4/LXML很多人第一反应是“司法拍卖页面肯定有JS渲染不用浏览器驱动怎么行”我试过。2022年用Selenium跑淘宝司法拍卖稳定运行三个月后某天凌晨突然全部卡死在“等待元素出现”阶段。查日志发现淘宝悄悄在列表页加了一层动态插入的div idsecurity-check内容为空但CSS设为display:noneSelenium却把它当成了有效节点等待。修复方案换XPath、加显式等待、甚至注入JS跳过检测……但下一周京东又在详情页的起拍价字段外层包了一个随机class名的span导致价格提取全错。于是彻底转向纯HTTP请求方案。核心判断依据就一条淘宝和京东司法拍卖的土地频道其列表页和详情页的HTML骨架是静态生成的关键字段文本始终存在于初始HTML中只是被CSS或JS做了视觉隐藏或延迟加载而非真正动态生成。我们验证过直接用curl -v 请求淘宝土地列表页URL响应体里就有完整的a classitem-title href...XX市XX区工业用地/a用requests.get()拿到的response.text里也能grep出span classprice-num28500000/span。所谓“JS渲染”其实是前端把已有数据重新排版不是从后端拉新数据。所以技术栈锁定为-requests轻量、可控、易调试支持session复用和精细的headers控制-lxml主解析器比BeautifulSoup快3~5倍尤其处理大HTML文档时内存占用低xpath语法精准定位-beautifulsoup4辅助对部分结构混乱的详情页做容错兜底比如京东某些老页面存在未闭合的font标签lxml会报错BS4能自动修复。提示不要迷信“最新技术”。Selenium适合需要交互的场景如填表、拖拽滑块而司法拍卖土地页的核心价值字段名称、价格、时间、地址在首屏HTML里就已存在。用重武器打蚊子只会增加维护成本。2.2 “不登录、不验证码”的底层实现逻辑是什么很多用户担心“不登录怎么拿到数据会不会被封IP”答案很实在因为平台本身就没要求登录才能看土地拍卖列表。你用无痕模式打开 https://sf.taobao.com/land 或者直接curl这个URL返回的就是完整HTML。淘宝司法拍卖的土地频道/land和京东的/land都是公开入口法院上传标的时就设为“所有人可见”这是司法公开的基本要求。真正的难点不在“进不去”而在“拿不准”。比如淘宝列表页的分页URL是https://sf.taobao.com/land?city330000province330000page2其中city和province参数是浙江省编码但页面底部的“下一页”链接却是a href/land?city330000amp;province330000amp;page3下一页/a如果脚本傻乎乎地拼接base_url href就会得到https://sf.taobao.com/land?city330000province330000page3看似正确但实际请求时淘宝会302跳转到首页——因为它的反爬策略检测到Referer缺失或User-Agent异常。所以我们设计了三层防护1.Referer白名单机制每次请求列表页前先GET一次根目录https://sf.taobao.com/记录其响应头中的Set-Cookie仅用于构造合法Referer后续所有子页面请求都带上Referer: https://sf.taobao.com/land?city330000province3300002.User-Agent轮换池内置12个主流浏览器UA字符串Chrome 115~122、Edge 116~121、Firefox 115~120每次请求随机选取避免单一UA被限流3.请求间隔动态调节基础间隔设为3.2秒非整数避开风控采样周期若某次请求返回状态码非200或响应体长度50KB则自动延长至8秒并重试最多3次。注意这不是“对抗”而是“模拟”。我们让脚本的行为无限接近一个真实人类用户用不同浏览器、有合理停留时间、从首页导航进来。平台风控系统针对的是高频、无Referer、UA单一的机器流量而不是这种“慢但规矩”的访问。2.3 字段提取策略为什么“所在地区”要拆成省/市/县三级原始需求只要求“所在地区”但实际业务中这个字段必须结构化。比如淘宝页面显示div classitem-address广东省广州市黄埔区开源大道XXX号/div而京东页面可能是span classarea成都市双流区/span如果统一存为字符串“广东省广州市黄埔区开源大道XXX号”后续做数据分析就极其痛苦你想统计“广州市挂牌土地数量”得用正则反复匹配想筛选“长三角地区”得维护一个城市映射表。所以脚本强制执行三级拆解省级通过预置字典匹配如“广东”→“广东省”“川”→“四川省”覆盖简称、全称、古称如“蜀”市级在省级匹配后截取剩余字符串前2~4个字符结合市级名录校验如“广州市”“深圳市”“佛山市”县级市级匹配后取后续首个含“区/县/市县级/旗”的词组例如“黄埔区”“双流区”“义乌市”。这个逻辑写在utils/region_parser.py里不是简单split(“市”)而是基于民政部2023年行政区划代码表构建的有限状态机。它能正确处理“内蒙古自治区阿拉善盟额济纳旗”这种长链也能识别“湖北省直辖县级行政区仙桃市”这种特殊案例。为什么这么做因为我在给某省自然资源厅做数据对接时吃过亏他们提供的Excel里“地区”列有的写“杭州市”有的写“浙江杭州”有的写“HZ”最后清洗花了两天。现在脚本输出CSV直接带province、city、district三列下游系统零成本接入。3. 核心细节解析与实操要点3.1 淘宝司法拍卖taobaofapai.py的关键解析点淘宝土地频道的HTML结构相对规范但有两个“温柔陷阱”必须绕开陷阱一列表页的“懒加载”占位符淘宝列表页实际只渲染首屏10条后面20条用div classlazy-load-placeholder/div占位。但关键在于——这些占位符的data-url属性里藏着真实详情页URL。比如div classlazy-load-placeholder>LIST_ITEM_URL //div[contains(class,item-wrap)]//a[classitem-title]/href DETAIL_PRICE_NUM //span[contains(class,price-num)]/text() DETAIL_ADDRESS //div[contains(class,item-address)]/text()一旦页面改版只需修改这个配置文件无需动主逻辑。上周淘宝把item-address改成location-info我3分钟就修好了。3.2 京东司法拍卖sf_jd.py的顽固适配点京东的结构比淘宝更“野”尤其体现在两点顽固点一动态class名的对抗式命名京东详情页的保证金字段class名每周都在变- 第1周span classguarantee-amount-abc123500000/span- 第2周span classdeposit-price-def456500000/span- 第3周span classbond-value-xyz789500000/span它明显在用哈希值混淆class。但我们发现无论class名怎么变该字段永远是页面中唯一一个紧邻span保证金/span兄弟节点的span标签。所以脚本用XPath//span[text()保证金]/following-sibling::span[1]/text()完全绕过class名直击DOM关系。这是对页面语义的理解而非对class的依赖。顽固点二开拍时间的时区与格式迷雾京东详情页显示“开拍时间2024-05-20 10:00:00”但实际这个时间是北京时间UTC8而其API返回的原始数据却是UTC时间。我们曾踩坑直接存这个字符串到数据库结果某次导出Excel给上海客户对方说“你们的时间比法院公告晚8小时”。后来查证京东前端JS把UTC时间2024-05-20T02:00:00Z格式化成了本地时间显示但HTML源码里藏了一个隐藏inputinput typehidden idauctionStartTime value2024-05-20T02:00:00Z脚本优先读这个value用datetime.fromisoformat()解析后转为datetime.now().astimezone()的本地时区确保所有时间字段统一为东八区标准时间。注意别信页面上肉眼看到的时间一定要找隐藏字段或API接口返回的原始时间戳。这是司法数据的底线——时间必须可溯源、可验证。3.3 反爬策略的实操落地细节很多人看了README里的“User-Agent轮换”“请求间隔”觉得很简单但真正在生产环境跑半年你会发现细节决定成败User-Agent轮换不是随机选而是按设备比例模拟我们统计了2023年司法拍卖页面的真实用户UA分布通过合作律所的前端埋点数据构建了符合现实的轮换池- Windows Chrome52%主力- macOS Safari23%第二主力尤其律师用Mac多- Android Chrome15%- iOS Safari10%脚本用random.choices()按权重抽样而不是random.choice()均等抽取。这样更难被风控模型识别为机器流量。请求间隔不是固定值而是带抖动的泊松分布固定3.2秒间隔容易被识别为定时任务。我们改用import random base_interval 3.2 jitter random.uniform(-0.8, 1.2) # -0.8~1.2秒抖动 actual_interval max(2.0, base_interval jitter) # 下限2秒防超频 time.sleep(actual_interval)实测下来这种“人类级不规律”让单IP日请求量从300次提升到800次仍无封禁。最关键的容错HTML解析失败时的降级路径当lxml因页面结构突变解析失败脚本不会直接报错退出而是启动三级降级1. 尝试用BS4的html.parser重新解析同一HTML2. 若仍失败提取response.text中所有script标签内容搜索window.pageData {.*?}这样的全局变量从中JSON提取关键字段3. 最终fallback记录失败URL到error_log.txt附上HTTP状态码、响应长度、当前时间供人工核查。这个机制让我们在2024年3月京东大规模改版期间依然保持了92%的数据采集成功率其余8%的失败项当天就收到邮件告警人工补采即可。4. 实操过程与核心环节实现4.1 环境准备与依赖安装一步到位别被requirements.txt吓住实际只需4个库且全部兼容Python 3.8~3.12# 推荐用虚拟环境避免污染系统 python -m venv fapai_env source fapai_env/bin/activate # Linux/Mac # fapai_env\Scripts\activate # Windows # 安装核心依赖注意lxml需编译国内用户加清华源加速 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ \ requests lxml beautifulsoup4 cn2an为什么没写-r requirements.txt因为原文件里混进了pyyaml用于读配置但脚本实际没用到和loguru日志库已被精简为内置print文件写入。我们砍掉了所有非必要依赖让安装命令极简、可靠、无冲突。提示如果你在CentOS 7上安装lxml失败缺libxml2-devel和libxslt-devel执行bash yum install libxml2-devel libxslt-devel python3-devel pip install lxml4.2 首次运行与配置校准脚本默认配置在config/default.py里首次运行前建议手动校准两项1. 地域范围配置避免抓全网数据淘宝和京东都支持按省份筛选脚本默认抓全国但多数用户只需本省。编辑config/default.py# 淘宝配置 TAOBAO_REGION { province: 330000, # 浙江省编码 city: 330100, # 杭州市编码 district: # 空字符串表示不限县级 } # 京东配置京东用拼音非编码 JD_REGION { province: zhejiang, city: hangzhou, district: }编码表在docs/area_codes.xlsx里已整理好全国34个省级、333个地级、2843个县级行政区的最新编码民政部2024年1月版。2. 输出路径与文件名规则默认输出到output/目录文件名含日期OUTPUT_DIR output FILENAME_TEMPLATE fapai_{platform}_{date}.csv # 如 fapai_taobao_20240520.csv你可以改成/data/fapai/或挂载NAS路径只要Python有写权限即可。4.3 执行命令与日志观察单次手动运行调试用# 抓淘宝土地数据默认抓杭州 python taobaofapai.py # 抓京东土地数据默认抓浙江 python sf_jd.py # 抓指定城市如深圳 python taobaofapai.py --city 440300查看实时日志脚本运行时会在控制台打印结构化日志[2024-05-20 04:30:12] INFO: 开始抓取淘宝司法拍卖土地数据... [2024-05-20 04:30:15] INFO: 成功获取列表页杭州共找到24条标的 [2024-05-20 04:30:48] INFO: 已解析24条详情页提取字段完整率98.3% [2024-05-20 04:30:49] INFO: CSV已保存至 output/fapai_taobao_20240520.csv (24 rows)关键日志字段解读-提取字段完整率98.3%指24条中23条的7个核心字段名称、地区、起拍价、评估价、保证金、开拍时间、链接全部提取成功1条缺失“评估价”法院未公示-共找到24条标的是列表页解析结果不是最终入库数因为详情页可能404或结构异常-CSV已保存表示脚本完成不是“开始保存”。实操心得第一次运行时务必打开--debug参数bash python taobaofapai.py --debug它会额外保存debug_html/taobao_list_20240520.html和debug_html/taobao_detail_123456.html方便你用浏览器直接打开对照XPath是否写对。我90%的Selector调试都在这个模式下完成。4.4 定时任务部署Linux crontab实战这才是真正解放双手的环节。以Ubuntu 22.04为例步骤1赋予脚本执行权限chmod x taobaofapai.py sf_jd.py步骤2编辑crontab# 每天凌晨4:30执行淘宝抓取 30 4 * * * cd /path/to/your/project /path/to/your/venv/bin/python taobaofapai.py /var/log/fapai_taobao.log 21 # 每天凌晨5:00执行京东抓取 0 5 * * * cd /path/to/your/project /path/to/your/venv/bin/python sf_jd.py /var/log/fapai_jd.log 21 # 每天凌晨5:30合并CSV用自带的merge_tool.py 30 5 * * * cd /path/to/your/project /path/to/your/venv/bin/python merge_tool.py /var/log/fapai_merge.log 21关键细节- 必须写绝对路径/path/to/your/venv/bin/pythoncrontab不读你的bashrc- /var/log/xxx.log 21把stdout和stderr都追加到日志方便排查- 合并脚本merge_tool.py会自动读取output/下当天所有fapai_*.csv去重后按platform,province,city,district排序生成fapai_merged_20240520.csv。Windows计划任务提示用任务计划程序创建基本任务操作设置为- 程序C:\path\to\venv\Scripts\python.exe- 参数C:\path\to\project\taobaofapai.py- 起始于C:\path\to\project\注意Windows路径要用反斜杠\且确保Python路径不含空格如Program Files会导致失败建议虚拟环境装在C:\venv\fapai。4.5 CSV导出与字段说明开箱即用脚本生成的CSV严格遵循RFC 4180标准用UTF-8 with BOM编码兼容Excel中文字段顺序与含义如下字段名类型说明示例platformstring平台来源taobao,jdtitlestring标的全称脱敏处理杭州市西湖区文三路XXX号国有建设用地使用权provincestring省级行政区全称浙江省citystring地级市全称杭州市districtstring县/区/县级市全称西湖区start_priceinteger起拍价单位元28500000appraisal_priceinteger评估价单位元法院提供32000000depositinteger保证金单位元500000auction_timedatetime开拍时间东八区2024-05-20 10:00:00urlstring标的详情页URLhttps://sf.taobao.com/item_detail-123456789.htmcrawl_timedatetime本次抓取完成时间2024-05-20 04:30:49特别说明- 所有价格字段均为整数无小数、无单位、无逗号可直接参与计算-auction_time和crawl_time都是YYYY-MM-DD HH:MM:SS格式Excel可直接识别为日期-title字段已做基础脱敏去除联系电话、身份证号片段如11010119900307231X会被替换为[ID]符合《个人信息保护法》对公开数据的处理要求。你可以直接把这个CSV拖进Power BI做地图热力图或导入MySQL建表CREATE TABLE fapai_land ( id BIGINT PRIMARY KEY AUTO_INCREMENT, platform VARCHAR(10), title TEXT, province VARCHAR(20), city VARCHAR(20), district VARCHAR(20), start_price BIGINT, appraisal_price BIGINT, deposit BIGINT, auction_time DATETIME, url TEXT, crawl_time DATETIME, INDEX idx_province_city (province, city), INDEX idx_auction_time (auction_time) );5. 常见问题与排查技巧实录5.1 页面结构调整导致提取失败最高频问题现象脚本运行成功日志显示“共找到XX条”但CSV里全是空行或只有URL字段有值。排查步骤1. 查看debug_html/下的最新列表页HTML用浏览器CtrlF搜索item-title确认是否存在2. 若存在打开对应详情页HTML搜索price-num或保证金确认目标字段是否还在3. 若字段class名变了如淘宝把price-num改成bid-start-price打开config/taobao_selectors.py修改对应XPath4. 若整个DOM结构大改如京东把列表从ul改成div classgrid需重写parse_list_page()函数但逻辑不变找所有标的链接。我的经验淘宝平均6.2周改一次列表页结构京东平均4.8周。我们建立了“结构变更响应清单”记录每次变更的日期、影响范围、修复方案。例如2024年4月12日淘宝改版把a classitem-title移到了div classitem-content内层XPath从//a[classitem-title]改为//div[contains(class,item-content)]//a[classitem-title]。这个清单放在docs/structure_change_log.md里新人入职第一天就学这个。5.2 请求被拒绝403/406错误现象日志出现HTTP 403 Forbidden或HTTP 406 Not Acceptable且持续多小时。根本原因不是IP被封而是请求头缺失关键字段。淘宝/京东风控会校验-Accept必须为text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8-Accept-Language必须为zh-CN,zh;q0.9,en;q0.8-Upgrade-Insecure-Requests必须为1解决方案在taobaofapai.py开头的HEADERS字典里补全这些字段HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..., Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Upgrade-Insecure-Requests: 1, Connection: keep-alive, }提示别用网上搜的“万能UA”必须匹配Accept头。我见过有人UA写Chrome最新版但Accept头还是旧版结果被406拦截。5.3 时间字段错乱开拍时间比法院公告早8小时现象CSV里的auction_time是2024-05-20 02:00:00但法院公告写的是10:00。定位方法打开debug_html/下的详情页HTML搜索auctionStartTime或startTime看隐藏input的value值。如果是2024-05-20T02:00:00Z说明是UTC时间脚本没走时区转换逻辑。修复检查parsers/jd_parser.py里的parse_auction_time()函数确认是否调用了from datetime import datetime from dateutil import tz utc_time datetime.fromisoformat(raw_time.replace(Z, 00:00)) beijing_tz tz.gettz(Asia/Shanghai) local_time utc_time.astimezone(beijing_tz) return local_time.strftime(%Y-%m-%d %H:%M:%S)如果没有astimezone()就是bug。这个函数在2024年3月版本已修复确保你用的是master分支最新代码。5.4 数据重复或遗漏定时任务并发问题现象某天CSV里有两条完全一样的标的相同title、相同url或某条标的在列表页存在但CSV里没有。原因分析-重复crontab设置了每小时执行一次但脚本运行时间超过1小时如网络卡顿导致两次运行重叠都抓了同一批数据-遗漏京东列表页分页逻辑异常第3页实际返回了第2页数据HTTP缓存未刷新。根治方案1. 在crontab里加锁机制bash 30 4 * * * flock -n /tmp/fapai_taobao.lock -c cd /path /venv/bin/python taobaofapai.py2. 脚本内部加URL去重每次抓取前先读取昨日CSV的url列存入set本次抓取时跳过已存在的URL3. 分页时强制加时间戳参数防缓存python url fhttps://sf.jd.com/land?provincezhejiangcityhangzhoupage{page}t{int(time.time())}我的血泪教训曾因没加锁导致连续三天生成重复数据下游BI报表虚高300%。现在所有生产环境都强制flock多花2秒省去半天排查。5.5 中文乱码与特殊字符CSV打开显示问号现象Excel打开CSV标题显示为æ ‡ç„åç§°或地址里“变成“。根源Python默认用系统编码写文件Linux是UTF-8Windows是GBK。脚本用open(..., encodingutf-8-sig)写CSV-sig表示带BOM头Excel才能正确识别。验证方法用VS Code打开CSV右下角看编码显示是否为UTF-8 with BOM。如果不是用VS Code的“重新以编码打开”→UTF-8 with BOM再保存。终极方案在export_csv()函数里强制指定BOMwith open(filepath, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnamesfieldnames) writer.writeheader() writer.writerows(data)这个细节看似小但影响用户体验。我坚持所有输出文件带BOM因为90%的终端用户用Excel不是程序员。6. 进阶扩展与安全边界提醒6.1 可安全扩展的方向不越界这个工具的设计哲学是“最小必要原则”以下扩展经我们实测可行且不触碰平台红线1. 增加PDF公告附件下载仅限公开链接淘宝/京东详情页下方常有“标的调查情况表”“法院裁定书”等PDF链接URL形如https://sf.taobao.com/attachment/xxx.pdf。脚本可增加download_attachmentsTrue参数用requests下载并保存到attachments/目录文件名用标的ID哈希不改变原始文件名避免中文乱码。2. 微信消息推送仅通知不发敏感数据用企业微信机器人Webhook每天抓取完成后发送摘要【司法土地日报】2024-05-20 ✅ 淘宝杭州24宗绍兴11宗宁波8宗 ✅ 京东浙江19宗江苏15宗安徽7宗 ⚠️ 注意绍兴3宗标的评估价未公示 详情见\\nas\fapai\merged_20240520.csv注意绝不推送具体价格、地址、联系方式只推数量和地域分布。3. 与GIS系统对接坐标解析调用高德/百度地图开放平台的地理编码API需申请免费KEY将provincecitydistricttitle拼接为地址请求经纬度。我们封装了utils/geocode.py支持失败自动降级为“市级坐标”如杭州市中心点确保不因API失败中断主流程。6.2 绝对不可碰的红线安全边界有些需求听起来合理但必须明确拒绝× 自动登录账号抓取私有数据淘宝/京东的“我的竞买”“关注标的”等页面需登录且涉及个人隐私。我们的脚本连登录按钮都不点这是法律和伦理底线。× 绕过验证码OCR或第三方打码即使页面偶尔弹验证码脚本也应直接退出并报错绝不集成任何验证码识别模块。司法数据的公信力源于其公开、透明、可验证而非技术钻营。× 存储用户凭证或Cookierequirements.txt里没有seleniumconfig/目录下没有cookies.json代码里没有driver.add_cookie()——这是刻意为之的干净。× 实时监控与自动出价有客户提过“能不能监控到降价就自动出价”答案永远是否定的。这已超出信息采集范畴进入交易执行层既违反平台规则也违背我们“只读不写”的设计初心。我的体会做司法数据工具最大的风险不是技术失效而是越界。守住“公开、静态、只读”这三条线工具才能长久、安心、被人信任地用下去。我宁愿少一个功能也不愿多一丝风险。这个工具跑了两年服务过17家政府单位、32家律所、89家开发商零法律纠纷、零平台投诉、零数据泄露。它不酷炫但像一把老菜刀——钝但可靠慢但从不误事。本文还有配套的精品资源点击获取简介两个开箱即用的Python脚本分别对接淘宝司法拍卖和京东司法拍卖的土地类标的页面无需登录、不依赖验证码识别只采集公开列表页与详情页中的结构化数据。taobaofapai.py抓取淘宝平台土地拍卖信息sf_jd.py适配京东司法拍卖土地频道均支持按日自动运行提取字段包括标的名称、所在省市县、起拍价、评估价、保证金金额、开拍时间、标的链接等核心信息。脚本内置基础反爬策略随机User-Agent切换、可控请求间隔、HTML解析容错处理适配当前主流页面结构。配套requirements.txt明确列出依赖库requests、lxml、beautifulsoup4README.md提供安装步骤、执行命令示例、常见问题提示如页面结构调整应对建议及CSV导出方法。所有代码仅访问公开可读页面不模拟登录、不存储账号凭证、不调用第三方API适合本地部署后加入系统定时任务如Linux crontab或Windows计划任务实现每日数据同步。本文还有配套的精品资源点击获取