锁定B端猎物:用Python自动化抓取全城企业黄页数据

窗外是成都七月的闷热,空调外机嗡嗡作响,像是我脑子里那根绷紧的弦。32岁,坐在这个租来的小办公室里,我盯着屏幕上企查查那个“联系电话”字段,它显示着一堆乱码似的字符。不是数字,是些“”之类的玩意儿。我知道,猎物就在那里,全城中小企业的老板、财务负责人的手机号,就藏在这堆鬼画符后面。

买数据?别开玩笑了。一份号称“精准”的本地企业名录敢要价五位数,到手一看,联系人还是三年前离职的那位。做ToB服务,第一步就是拿到足够多、足够鲜活的Leads,把销售漏斗的顶端撑大。没有这个,后续的转化、成交都是空中楼阁。我决定自己来。丰衣足食?不,是虎口夺食。

字体反爬。这四个字在2017年已经不算新鲜,但真正动手去破解,尤其是针对企查查、58同城这类把反爬做到极致的平台,完全是另一回事。它们用的不是简单的CSS Sprite偏移,而是动态生成的Web字体文件。每次刷新页面,那个联系方式的“类名”可能不变,但背后映射的字体文件(通常是woff或ttf)的URL会变,字体文件中每个字符的轮廓坐标(glyph)对应的编码也会变。简单说,你这次抓到的“”对应数字“1”,下次刷新,“”可能就对应“8”了。

我花了整整两天,就卡在第一步:怎么把那个动态字体文件下载下来并解析。浏览器里看着是清晰的数字,查看网页源代码却是一团乱码。F12打开开发者工具,在网络请求里翻找,终于锁定了那个字体文件请求。用Python的requests模拟下来,发现需要处理一堆cookie和referer验证,不然直接403。这还只是门票。

接下来是逆向。下载下来的woff文件,需要用fontTools这样的库去解析,提取每个字符的轮廓信息。但关键不是轮廓,是字符编码(通常是Unicode码点)和实际显示内容之间的映射关系。平台方不会傻到用顺序编码,它们会打乱。我的思路是,在内存中“渲染”这个字体,生成一个字符到实际形状的映射表。但怎么知道“”这个形状就是数字“1”呢?我需要一个参照物。

我在页面上找到了一个突破口。有些非关键信息,比如企业注册资本,它们用的可能是另一套字体,或者没有加密。又或者,页面某个角落会不经意地露出几个明文数字。我就用这几个稀有的明文数字作为“种子”,去和加密字体的形状做对比。写了个脚本,把字体文件解析后,用PIL库把每个字符画成小图片,然后去和种子数字的图片做像素级对比。匹配度最高的,就认为是同一个数字。这个过程极其耗资源,而且第一次跑,匹配错了两个,导致后面解析出的电话全是乱的。

那种抓狂感……就像你拿着一把钥匙,却怎么也插不进锁孔,因为你不知道锁芯是不是被换了。我对着屏幕骂娘,把键盘推得老远。抽了半包烟,看着代码里那坨对比算法,突然想到,我为什么非要自己“认”形状?我可以用OCR啊。虽然有点杀鸡用牛刀,但思路一下子打开了。我把字体文件里所有字符渲染成图片,然后用tesseract去识别。果然,大部分数字和字母都被正确识别出来了。剩下的少数几个,再用手工映射补全。

当映射表建立起来的那一刻,感觉像打通了任督二脉。我写了一个解析函数,把页面抓取到的乱码字符串传进去,它咔咔几下,就吐出了一串真实的数字。第一个成功解析出的手机号出现在屏幕上时,我手都有点抖。那不是一串数字,那是一扇门,门后是潜在的客户,是生意,是活路。

我立刻把脚本部署到服务器,开始批量跑。目标很明确:成都,高新区、武侯区、金牛区……所有在企查查上能搜到的、行业符合我目标(本地生活服务、中小企业)的公司。脚本自动翻页,自动解析,自动去重,把公司名称、地址、解析出的联系电话(主要是手机)存进数据库。我设置好就回去睡觉了,其实根本睡不着。

第二天早上六点就醒了,第一件事就是远程连上服务器看日志。爬虫还在稳定运行,没有触发明显的反爬封锁(我做了随机延迟和代理IP池)。查了一下数据库记录,已经有一万两千多条。我随机抽了几条,用手机拨了过去。

“喂,您好,请问是XX公司的王总吗?”
“是我,你哪位?”
“抱歉打扰了,我是……”我随便编了个由头挂断了。

通了。是真的。那一瞬间的震撼,难以言表。不是兴奋,更像是一种巨大的、沉甸甸的实感。屏幕上的数字不再是数据,它们连接着一个个真实的人,在城市的各个角落经营着自己的生意。而我这台冰冷的服务器,一晚上就“扫”出了上万个这样的连接点。

这哪里是数据,这就是金矿。是我下半年所有业务尝试的弹药库。销售漏斗最顶端的那层,被我暴力地、用技术手段撕开了一个大口子。我知道这种做法游走在灰色边缘,但当时那种“没有我拿不到的数据”的狂妄,压过了一切顾虑。技术给了我一把钥匙,而我用它打开了一座宝库的门,至于门后的东西该怎么用,那是下一步的事了。

窗外天已大亮,蝉鸣开始聒噪。我关掉数据库的查询界面,给自己冲了杯浓咖啡。名单有了,战争,才刚刚开始。

© 版权声明
THE END
喜欢就支持一下吧
点赞90 分享