1. 本文就当时爬取的方法做解说,不代表现在大众点评的情况,所以数据也只是当时爬取下来的数据,现在肯定也有变化!
2. 如果大众点评现在更改反爬措施,请自行修改代码,谢谢理解!

趁着疫情期间不能出门,于是掌柜的就继续在家捯饬代码。之前看到有个写了关于成都火锅店的数据分析,掌柜的看完后觉得想弄个咖啡店(因为喜欢喝咖啡☕),说干就干。结果在开头就碰钉子,大众点评的反爬措施不得不说一句:“厉害👍!” 之所以这么说是因为发现他们家的数据是不开F12看着都正常,一开就是全是下面这样:

然后查看多个咖啡店的信息都是如此,后来搜索后知道这就所谓的字体反爬!!!大众点评采用的反爬措施就是每隔一段时间(可能一天或者半天)就会对网上的字体文件进行替换;而且这个字体文件还不止一种。。。就是说同一个页面里面address标签对应一个字体文件,tagName标签又对应另一个字体文件等。

所以解决的思路就是:首先需要先获取字体文件,再用字体文件对爬取的加密代码进行解密,最后将解密的代码与之前的代码进行替换,生成我们所需的正常可见文字信息。

  1. 第一步,获取点评网的字体文件;

打开大众点评网页,<stron>,看得如下页面,选择Source位置,就可以看到这个页面有哪些文件,然后我们要找的字体文件是在s3plus这两个链接先点击下面com这个链接文件,可以看到所有标签分别对应哪个字体;接着点击上面net文件,找到今天大众点评所用字体文件。 这里是两个,右键选择在新的标签页打开,就可以下载下来。


2. 第二步,观察字体文件的规律然后对加密字体进行解码。
首先我们需要一个叫FontCreator的软件来查看字体文件里面的字体信息。把刚刚的字体文件分别在FontCreator里面打开就是如下界面:


然后观察大众点评所使用的两个不同的字体文件,你就会发现虽然字体上面的编码不一样,但是每个字体文件里的字体内容是一样的。</stron>

所以就得到这样一个含有603个字体的文字列表:

texts = ['','','1','2','3','4','5','6','7','8',
    '9','0','店','中','美','家','馆','小','车','大',
    '市','公','酒','行','国','品','发','电','金','心',
    '业','商','司','超','生','装','园','场','食','有',
    '新','限','天','面','工','服','海','华','水','房',
    '饰','城','乐','汽','香','部','利','子','老','艺',
    '花','专','东','肉','菜','学','福','饭','人','百',
    '餐','茶','务','通','味','所','山','区','门','药',
    '银','农','龙','停','尚','安','广','鑫','一','容',
    '动','南','具','源','兴','鲜','记','时','机','烤',
    '文','康','信','果','阳','理','锅','宝','达','地',
    '儿','衣','特','产','西','批','坊','州','牛','佳',
    '化','五','米','修','爱','北','养','卖','建','材',
    '三','会','鸡','室','红','站','德','王','光','名',
    '丽','油','院','堂','烧','江','社','合','星','货',
    '型','村','自','科','快','便','日','民','营','和',
    '活','童','明','器','烟','育','宾','精','屋','经',
    '居','庄','石','顺','林','尔','县','手','厅','销',
    '用','好','客','火','雅','盛','体','旅','之','鞋',
    '辣','作','粉','包','楼','校','鱼','平','彩','上',
    '吧','保','永','万','物','教','吃','设','医','正',
    '造','丰','健',,'汤','网','庆','技','斯','洗',
    '料','配','汇','木','缘','加','麻','联','卫','川',
    '泰','色','世','方','寓','风','幼','羊','烫','来',
    '高','厂','兰','阿','贝','皮','全','女','拉','成',
    '云','维','贸','道','术','运','都','口','博','河',
    '瑞','宏','京','际','路','祥','青','镇','厨','培',
    '力','惠','连','马','鸿','钢','训','影','甲','助',
    '窗','布','富','牌','头','四','多','妆','吉','苑',
    '沙','恒','隆','春','干','饼','氏','里','二','管',
    '诚','制','售','嘉','长','轩','杂','副','清','计',
    '黄','讯','太','鸭','号','街','交','与','叉','附',
    '近','层','旁','对','巷','栋','环','省','桥','湖',
    '段','乡','厦','府','铺','内','侧','元','购','前',
    '幢','滨','处','向','座','下','県','凤','港','开',
    '关','景','泉','塘','放','昌','线','湾','政','步',
    '宁','解','白','田','町','溪','十','八','古','双',
    '胜','本','单','同','九','迎','第','台','玉','锦',
    '底','后','七','斜','期','武','岭','松','角','纪',
    '朝','峰','六','振','珠','局','岗','洲','横','边',
    '济','井','办','汉','代','临','弄','团','外','塔',
    '杨','铁','浦','字','年','岛','陵','原','梅','进',
    '荣','友','虹','央','桂','沿','事','津','凯','莲',
    '丁','秀','柳','集','紫','旗','张','谷','的','是',
    '不','了','很','还','个','也','这','我','就','在',
    '以','可','到','错','没','去','过','感','次','要',
    '比','觉','看','得','说','常','真','们','但','最',
    '喜','哈','么','别','位','能','较','境','非','为',
    '欢','然','他','挺','着','价','那','意','种','想',
    '出','员','两','推','做','排','实','分','间','甜',
    '度','起','满','给','热','完','格','荐','喝','等',
    '其','再','几','只','现','朋','候','样','直','而',
    '买','于','般','豆','量','选','奶','打','每','评',
    '少','算','又','因','情','找','些','份','置','适',
    '什','蛋','师','气','你','姐','棒','试','总','定',
    '啊','足','级','整','带','虾','如','态','且','尝',
    '主','话','强','当','更','板','知','己','无','酸',
    '让','入','啦','式','笑','赞',,'酱','差','像',
    '提','队','走','嫩','才','刚','午','接','重','串',
    '回','晚','微','周','值','费','性','桌','拍','跟',
    '块','调','糕']

3. 接着我们要做的就是构建新的解码字典,步骤如下:

  • 先生成一个空的解码字典;
  • 再把一开始从FontCreator软件获取到的字体编码字典,里面的索引部分替换成大众点评上的字体乱码格式;
  • 最后就重新生成一个新的解码字典。

不知道这样说大家理解没有,直接上代码可能更好理解:

from fontTools.ttLib import TTFont

#这是标签为shopNum的字体文件
font = TTFont('e1f70b69.woff')
#获取所有字体的上面对应的编码
font_names = font.getGlyphOrder()
#print(font_names)

#下面这些就是打开FontCreator软件后解析 人均多少 那个字体文件得到 所有文字和数字,共603个:
texts = ['','','1','2','3','4','5','6','7','8',
    '9','0','店','中','美','家','馆','小','车','大',
    '市','公','酒','行','国','品','发','电','金','心',
    '业','商','司','超','生','装','园','场','食','有',
    '新','限','天','面','工','服','海','华','水','房',
    '饰','城','乐','汽','香','部','利','子','老','艺',
    '花','专','东','肉','菜','学','福','饭','人','百',
    '餐','茶','务','通','味','所','山','区','门','药',
    '银','农','龙','停','尚','安','广','鑫','一','容',
    '动','南','具','源','兴','鲜','记','时','机','烤',
    '文','康','信','果','阳','理','锅','宝','达','地',
    '儿','衣','特','产','西','批','坊','州','牛','佳',
    '化','五','米','修','爱','北','养','卖','建','材',
    '三','会','鸡','室','红','站','德','王','光','名',
    '丽','油','院','堂','烧','江','社','合','星','货',
    '型','村','自','科','快','便','日','民','营','和',
    '活','童','明','器','烟','育','宾','精','屋','经',
    '居','庄','石','顺','林','尔','县','手','厅','销',
    '用','好','客','火','雅','盛','体','旅','之','鞋',
    '辣','作','粉','包','楼','校','鱼','平','彩','上',
    '吧','保','永','万','物','教','吃','设','医','正',
    '造','丰','健',,'汤','网','庆','技','斯','洗',
    '料','配','汇','木','缘','加','麻','联','卫','川',
    '泰','色','世','方','寓','风','幼','羊','烫','来',
    '高','厂','兰','阿','贝','皮','全','女','拉','成',
    '云','维','贸','道','术','运','都','口','博','河',
    '瑞','宏','京','际','路','祥','青','镇','厨','培',
    '力','惠','连','马','鸿','钢','训','影','甲','助',
    '窗','布','富','牌','头','四','多','妆','吉','苑',
    '沙','恒','隆','春','干','饼','氏','里','二','管',
    '诚','制','售','嘉','长','轩','杂','副','清','计',
    '黄','讯','太','鸭','号','街','交','与','叉','附',
    '近','层','旁','对','巷','栋','环','省','桥','湖',
    '段','乡','厦','府','铺','内','侧','元','购','前',
    '幢','滨','处','向','座','下','県','凤','港','开',
    '关','景','泉','塘','放','昌','线','湾','政','步',
    '宁','解','白','田','町','溪','十','八','古','双',
    '胜','本','单','同','九','迎','第','台','玉','锦',
    '底','后','七','斜','期','武','岭','松','角','纪',
    '朝','峰','六','振','珠','局','岗','洲','横','边',
    '济','井','办','汉','代','临','弄','团','外','塔',
    '杨','铁','浦','字','年','岛','陵','原','梅','进',
    '荣','友','虹','央','桂','沿','事','津','凯','莲',
    '丁','秀','柳','集','紫','旗','张','谷','的','是',
    '不','了','很','还','个','也','这','我','就','在',
    '以','可','到','错','没','去','过','感','次','要',
    '比','觉','看','得','说','常','真','们','但','最',
    '喜','哈','么','别','位','能','较','境','非','为',
    '欢','然','他','挺','着','价','那','意','种','想',
    '出','员','两','推','做','排','实','分','间','甜',
    '度','起','满','给','热','完','格','荐','喝','等',
    '其','再','几','只','现','朋','候','样','直','而',
    '买','于','般','豆','量','选','奶','打','每','评',
    '少','算','又','因','情','找','些','份','置','适',
    '什','蛋','师','气','你','姐','棒','试','总','定',
    '啊','足','级','整','带','虾','如','态','且','尝',
    '主','话','强','当','更','板','知','己','无','酸',
    '让','入','啦','式','笑','赞',,'酱','差','像',
    '提','队','走','嫩','才','刚','午','接','重','串',
    '回','晚','微','周','值','费','性','桌','拍','跟',
    '块','调','糕']
#然后我们创建一个font_name的字典
font_name = {
   }
#将网站上的字体乱码和解析出来的文字构成一个字典
for index, value in enumerate(texts):
   #就是大众点评乱码的结构:由前面的三个字符‘&#x’+后面是小写字母和数字+分号‘;’
    n = font_names[index].replace('uni', '&#x').lower() + ';'
    #下面生成的这个就是乱码对应的刚刚字体文件的对应数字,可以运行看看
    font_name[n] = value
#此刻得到的就是解码的字典
print(font_name)

4. 最后就是把解码出来的字典同爬取下来的文字、数字进行替换就可以获取到咖啡店的数据:

(PS:1. 刚好爬取的那天所需要的数据都在同一个字体文件,所以不需要多次替换;
2.上面这个数据不规范,后面整体代码会进行修改,先给大家看看整体效果。)

因为后面会涉及到调用高德地图API来进行地址转换,获取经纬度和区域方便地图可视化,这一段没有太大问题,直接略过,代码会一并写入GitHub里面。

最后再说一下,爬取下来的数据因为存在格式不规范和缺失值的问题,所以需要进行数据清洗。这里直接上图,不多说:

到这里,大众点评这个数据就搞定了,下一篇直接开始分析!

PPS: 所有代码都会上传到GitHub,地址请看第三篇,谢谢!