我大多数日子都开着一个标签页,上面只显示数据源计数。没有花哨的东西——没有图表,没有筛选器,只有我们抓取房源的1,375个网站每一个对应的一个数字,以及每个网站最后一次成功连接的时间戳。大多数日子它都无聊得像基础设施应该有的样子。这个夏天不是这样,我觉得这段出岔子的经历,对你这样一个正在挑车的人来说,比我们能写的大多数"如何买二手车"攻略都更有用。它讲的是当"实时数据"背后是1,375个各自为政、谁也不欠你什么的独立网站时,"实时"到底意味着什么。
七月中旬:一个让我自豪的数字
到七月中旬,我们已经把数据源注册表推到了跨73个地区的1,190个数据源——这是几周来清理重复条目和死链接的成果,那些条目一直在悄悄虚增我们自己的计数。我记得当时觉得,1,190个真实、成功签到的数据源值得骄傲一下。这背后是大量各自独立的经销商网站、分类信息板和拍卖信息源,每一个都有自己的HTML结构、自己的速率限制、自己对"爬虫到底是客户还是攻击者"的看法。
接着,我们一直在推进的一项积压任务清理开始见效——处理一份已经搁置了几个月的683个数据源等待清单,有些被封,有些则压根还没建好。七月下半月,其中274个陆续建成并接入。到月底,可用数据源数量涨到了1,464。这种周就值得截图留念。
八月初:241个数据源,消失了
然后是那种能毁掉你一整周的数字:一夜之间,241个数据源掉进了降级状态。不是因为我们做错了什么——我们的代理服务商账户在账单环节过期了,而我们相当大一部分流量正是通过轮换IP路由的,目的就是不被那些对爬虫限速的网站封掉。没有代理,就没有新页面,也就没有新房源。数据源不会主动宣布自己坏了,它们只是悄悄停止返回新数据,而旧房源还摆在那里,看起来一切如常。
这一部分不会出现在任何一个卖车网站(包括我们自己)的房源计数里,除非你专门去查:一个"实时"市场平台可以让过期数据和新鲜数据并排摆着,从外部看却毫无区别。我们给新的抓取任务加了一道基于真实代理健康探测的门槛,这样一个失效的代理池就不会在无声无息中让数据质量进一步恶化,同时暂停了原本会让情况更糟的那部分排期。这不是什么光鲜的工作。这种事,如果你从未听说过,恰恰说明有人把它做到位了。
插一句,因为这话值得说清楚:任何一个网站,如果每天都宣称一个固定的、整齐的房源数字,那它要么根本不是实时的,要么就是没告诉你像这样的糟心周。
冻结
代理续费解决了大部分问题。我没料到的是,几周后爬虫本身彻底锁死了——一次拆卸过程中的死锁,十九个工作线程里有十八个卡在futex_wait状态,CPU占用为零,整整持续了75个小时。没有崩溃,没有报错日志向任何人尖叫报警。就是……什么都没发生,而仪表盘却一直显示着上一次成功运行的结果,仿佛那就是当下。我们当时还没在那台主机上装监控看门狗,而这种句子,你往往只有在它描述的事情已经真实发生在你身上一次之后,才会写出来。
我们搭建了看门狗。我们暂停了排期,直到确认代理续费已经稳定,而不是冒险让一次半降级的抓取悄悄用坏数据替换掉好数据——一个数据源被抓取后,它的房源是被"替换",而不是被合并的,所以一次糟糕的抓取不只是没能新增数据,它可能会主动删掉好数据,换上更差的。正是这种不对称性,让我们宁愿多扛一天过期数据,也不愿跑一次降级抓取。
数字最终落在哪里
以下是今天的计数,以及把我们带到这里的六周走势:
我们最终落在跨73个地区的1,375个数据源,支撑着1,108,535条实时房源,其中12,823条目前被标记为低于所在地区同类车型均价。这比七月的峰值少了大约90个数据源——241个降级数据源中,有一些始终没能完全恢复,还有一小部分是那种在此期间改变了反爬策略、需要重新搭建而不是简单重连的网站。我们还在处理其中几个。
这一切对你到底意味着什么
这些都不会改变你该买哪辆车。但它应该改变你看待任何一个卖车网站"实时库存"数字的方式,不只是我们的。目前我们的地区计数榜首是法国,有67,569条房源,日本紧随其后,有61,940条,而这些数字会波动——不是因为二手车市场本身变化得有这么快,而是因为盯着它的基础设施在变化。一条因为数据源降级而过期三天的房源,如果平台不诚实地披露这种差别,看起来会和一条新鲜房源一模一样。
我们宁愿告诉你那次75小时的冻结,也不愿假装我们的数字从未晃动过。一个从不承认自己有过糟糕一周的数据集,你应该更加怀疑它,而不是更少。



