前面写了58同城的字体反爬,这几天又跟大众点评的文字反爬杠上了,多方查找,各种踩坑,好多文章是之前的解决办法,大众已经更改了反爬方式,好在磕磕绊绊终于是搞定了。详细记录一下

首先,我们要搞得网页是这个点击进入大众网页

这是网页

代码跑出来是这样

css字体反爬,确定了,接下来找字体文件
多方尝试,找到了这个

复制链接打开

这些就是这个网页里用到的字体文件。先不管,全部下载下来,用FontCreator文件打开,通过打开我们发现,字体都一样,数量也一样,就是字体对应的编码不一样


后四位就是网页源码里的样子,比如网页源码里的‘我’这个字是‘&#xe605’。这里用软件打开的字体文件里的就是‘e605’。那么,替换就好了。

我刚开始就是这么干的,但是最后发现,这个网页渲染不是用了三四个字体文件吗,结果在不同文件里,‘e605’代表的不只是我,一个文件里‘e605’代表‘我’,可能另一个文件里会是‘你’,‘他’。

看了还要找文件跟字符对应关系,这个地方我卡了很久。后来又看了一篇文章,https://www.jianshu.com/p/cc3dee3b5373,受到了启发。
发现刚才那个svg链接打开后,里面不止有字体文件,还有对应关系,请看:

以第一个字体文件为例,不光指出了woff文件下载的url,还有红圈内的对应关系。这个在网页内的class值那有。

这样一来,解密某个字体,需要用哪个字体文件就清楚了。

大体思路就是这样,接下来参照我写的拙劣的代码来一步步实现。
最后会把整体代码贴出。

爬虫代码:
能看字体反爬的小伙伴,应该对简单的爬虫代码很熟悉,这段就不多说了。

import requests
import re
from bs4 import BeautifulSoup
from fontTools.ttLib import TTFontsession = requests.session()
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36','Cookie': '_lxsdk_cuid=16e6e3d2d194c-0d71792c1bdecf-386a410b-100200-16e6e3d2d1ac8; _lxsdk=16e6e3d2d194c-0d71792c1bdecf-386a410b-100200-16e6e3d2d1ac8; _hc.v=72af60e2-253b-67a8-af88-90115c90c91f.1573807534; s_ViewType=10; cy=8; cye=chengdu; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; thirdtoken=6beb8daf-da47-4349-a856-2c34699b7f33; _thirdu.c=069a3f46cb5e9efce3f6c78af7eb6e4a; dper=5c332835a4921ed6a19a6ff4c841a0e57581755062bf917973148ac82c862dba700fa56c5231c7c650707b9358e2ac466c44c5995617ef708dae7d804ad8cb363fb8f539e965c8fca1cb52ac1ba00050369587f8c79e2f9d2c3afe1ce161e2e1; ll=7fd06e815b796be3df069dec7836c3df; ua=dpuser_1140076444; ctu=19556f57d2292d0bdda3d762beb289fccb7fcce4772a6764c862652131c80dad; _lxsdk_s=16f6569077f-a6-e48-dac%7C%7C148'
}
url = 'http://www.dianping.com/shop/93364485'
rq = session.get(url, headers=headers)
print(url)
rq.encoding = 'utf8'
data = rq.text
print(data)

正则匹配到网页所用到的字体文件

svgtextcss = re.findall(r'href="([^"]+svgtextcss[^"]+)"', data)[0]

匹配结果

//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/4bc2975ca0b73e5fcb749c122c05e932.css

加上‘http:’,访问,得到结果

woffs_url = 'http:' + svgtextcss
woff_text = requests.get(woffs_url).text
print(woff_text)

结果就是咱们刚才的那个图里面的内容了

到这里,我们需要从里面取到几个字体文件的下载url,还有它对应解密的类型

# 通过'PingFangSC-'分隔
lines = woff_text.split('PingFangSC-')
print(lines)
# print('*'*50)
#分别匹配到各类文件
json_woff = {}
for line in lines:print(line)print('*' * 50)woff_urls = re.findall('([^"]+woff)"\)', line)# review:评论,shopdesc:店铺描述type = re.findall('} .(.*?){', line)# print(a)if len(woff_urls) > 0 and len(type) > 0:woff_url = 'http:' + woff_urls[0]print(woff_url)a_key = type[0]print(a_key)print('=' * 50)json_woff[a_key] = woff_urlprint(json_woff)

运行过程是这样的:

得到的json_woff是这样的:

这样一来,解密类型就和字体文件对应起来了。像前面那个,

我们就可以用address对应的字体文件解密了。

接下来,就把这些文件对应下载下来

#下载对应的woff文件
for a, b in json_woff.items():print(a, b)woff_name = awith open('./{}.woff'.format(str(woff_name)), 'wb') as writer:writer.write(requests.get(b).content)

现在有字体文件,有网页源码,怎么替换。

刚才我们之所以能看到字体与字符的对应关系,是通过软件打开的字体文件。现在跑代码了,可不能用软件打开看了。

这里我们用一个库fontTools

用它把字体文件转成xml格式,先转两个看看

from fontTools.ttLib import TTFont
font = TTFont('address.woff')
font.saveXML('address.xml')font = TTFont('num.woff')
font.saveXML('num.xml')

这时候,双击打开生成的俩xml。

并且用软件打开这俩xml对应的woff字体文件

可以看到,‘店’这个字在两个文件里一个编码是‘f8b5’,一个是‘edbc’,分别取xml文件里搜索


可以看到他们的x,y,on值一模一样,也就是说同一个字体,在两个文件里,x,y,on值是一样的,只是编码不一样。

这样一来,我们可以先根据其中一个文件,手动写出字体与编码的对应关系,然后其他文件来了,我们就可以根据对比x,y,on值推出它对应的字体。

比如,‘我’这个字,在一个字体文件里的编码是‘e3a9’,我们建一个对应关系{‘e3a9’:‘我’}

那么在另一个字体文件里出现了‘4ewa’,它的x,y,on值跟‘e3a9’的值一样,那么我们就知道‘4ewa’对应的也是‘我’这个字

随便选一个字体文件,建立字符与字体对应关系做基准对应表,这里我用的hours.woff:

这个地方我敲了几个小时。。。。

#字体与编码对应表
dict1 = {'f409': '1', 'f338': '2', 'ed3d': '3', 'e40a': '4', 'e280': '5', 'ebcd': '6', 'f0a4': '7', 'ef8e': '8', 'ed09': '9','ee67': '0', 'e322': '店', 'e8c9': '中', 'eb24': '美', 'e527': '家', 'e252': '馆', 'f1e2': '小', 'e1b2': '车', 'f16f': '大','ea2e': '市', 'e441': '公', 'eeb7': '酒', 'ed74': '行', 'ef19': '国', 'e716': '品', 'e45e': '发', 'f529': '电', 'e7fb': '金','f576': '心', 'e9d8': '业', 'e729': '商', 'ed93': '司', 'e099': '超', 'e29d': '生', 'efad': '装', 'ec71': '园', 'f13e': '场','e9ce': '食', 'f1ad': '有', 'f07e': '新', 'f8e3': '限', 'e475': '天', 'f1bc': '面', 'e46c': '工', 'eb88': '服', 'e68b': '海','e4b6': '华', 'e348': '水', 'f3b4': '房', 'f1b8': '饰', 'e2a9': '城', 'eed6': '乐', 'ed60': '汽', 'e5f9': '香', 'e888': '部','e2d9': '利', 'eb26': '子', 'e515': '老', 'e885': '艺', 'f87a': '花', 'f650': '专', 'f20a': '东', 'f88b': '肉', 'ed45': '菜','e141': '学', 'ecb7': '福', 'e9c4': '饭', 'e960': '人', 'f038': '百', 'e65f': '餐', 'f566': '茶', 'e904': '务', 'e007': '通','ef46': '味', 'eecf': '所', 'e5ce': '山', 'ec37': '区', 'eaae': '门', 'e6c5': '药', 'eceb': '银', 'e66e': '农', 'f3a9': '龙','e0bb': '停', 'ea1d': '尚', 'e73f': '安', 'e51a': '广', 'ec69': '鑫', 'e982': '一', 'f7f9': '容', 'e93d': '动', 'e934': '南','f07c': '具', 'e698': '源', 'e3dc': '兴', 'f69f': '鲜', 'f381': '记', 'e2c4': '时', 'ea97': '机', 'f201': '烤', 'f2cd': '文','f34f': '康', 'e1ca': '信', 'e3bc': '果', 'e906': '阳', 'e2b9': '理', 'e3c6': '锅', 'e060': '宝', 'e8f9': '达', 'e559': '地','f75a': '儿', 'e6c9': '衣', 'e961': '特', 'f359': '产', 'ebe6': '西', 'f6d1': '批', 'e103': '坊', 'f24a': '州', 'f4d4': '牛','e72d': '佳', 'ed66': '化', 'edf8': '五', 'e209': '米', 'e8cc': '修', 'f03f': '爱', 'e01b': '北', 'f167': '养', 'ee43': '卖','e6f1': '建', 'ecff': '材', 'f335': '三', 'e719': '会', 'f8e8': '鸡', 'f237': '室', 'e154': '红', 'e921': '站', 'e9ca': '德','f03d': '王', 'ef91': '光', 'f567': '名', 'e8e4': '丽', 'efe8': '油', 'f0db': '院', 'e7ef': '堂', 'f68f': '烧', 'e767': '江','e4e8': '社', 'ead5': '合', 'e853': '星', 'f56f': '货', 'f563': '型', 'e5bf': '村', 'ed25': '自', 'e94e': '科', 'e553': '快','f2bf': '便', 'f1dc': '日', 'f7c3': '民', 'e387': '营', 'f233': '和', 'f54c': '活', 'e11c': '童', 'e5e2': '明', 'e0ef': '器','ee68': '烟', 'e1cf': '育', 'e6cb': '宾', 'e523': '精', 'e27d': '屋', 'e886': '经', 'ee2f': '居', 'f75e': '庄', 'e139': '石','e2ef': '顺', 'eaa9': '林', 'e53f': '尔', 'ea94': '县', 'e62a': '手', 'e198': '厅', 'ec74': '销', 'ef37': '用', 'edb0': '好','f81e': '客', 'eca3': '火', 'f00f': '雅', 'f0cb': '盛', 'eb3a': '体', 'f1ed': '旅', 'eea8': '之', 'e008': '鞋', 'eb47': '辣','e4a8': '作', 'efdb': '粉', 'e5c0': '包', 'e8d2': '楼', 'ef96': '校', 'f32c': '鱼', 'e318': '平', 'f105': '彩', 'e84b': '上','e4ec': '吧', 'f0ef': '保', 'e41c': '永', 'e566': '万', 'ebf3': '物', 'f6f9': '教', 'e3ad': '吃', 'f3d8': '设', 'f800': '医','e357': '正', 'f02b': '造', 'efe3': '丰', 'f8a6': '健', 'f26c': '点', 'ee6a': '汤', 'ed43': '网', 'f229': '庆', 'e205': '技','e225': '斯', 'ea1e': '洗', 'ee7c': '料', 'e4f3': '配', 'f26b': '汇', 'e8c0': '木', 'f760': '缘', 'e8ed': '加', 'ea0b': '麻','e8b3': '联', 'ee5c': '卫', 'e0e6': '川', 'f370': '泰', 'ea4d': '色', 'e803': '世', 'e248': '方', 'e896': '寓', 'f1ce': '风','eb29': '幼', 'f163': '羊', 'f17b': '烫', 'e0a6': '来', 'f7b7': '高', 'f836': '厂', 'e046': '兰', 'f503': '阿', 'eb55': '贝','eff4': '皮', 'f38c': '全', 'e3fa': '女', 'e526': '拉', 'e875': '成', 'edcd': '云', 'e3d3': '维', 'f033': '贸', 'ed6f': '道','f313': '术', 'e59f': '运', 'e242': '都', 'f371': '口', 'e94d': '博', 'f643': '河', 'e029': '瑞', 'e179': '宏', 'e066': '京','ef62': '际', 'e958': '路', 'e2a7': '祥', 'f8c4': '青', 'f4b6': '镇', 'e9f9': '厨', 'f5e7': '培', 'ead9': '力', 'eb59': '惠','f699': '连', 'ecf1': '马', 'f464': '鸿', 'f0a0': '钢', 'e80b': '训', 'f177': '影', 'f1d9': '甲', 'f13b': '助', 'e71d': '窗','f270': '布', 'f8ba': '富', 'e5c3': '牌', 'e78b': '头', 'e86c': '四', 'f345': '多', 'e4c8': '妆', 'e870': '吉', 'ed88': '苑','e1e9': '沙', 'e3a7': '恒', 'f3db': '隆', 'f4ca': '春', 'ec10': '干', 'eb28': '饼', 'e872': '氏', 'e056': '里', 'f662': '二','f4ef': '管', 'e8dc': '诚', 'ef1e': '制', 'ed03': '售', 'eb48': '嘉', 'ee26': '长', 'f0ff': '轩', 'eba5': '杂', 'ea45': '副','f182': '清', 'ed5c': '计', 'e256': '黄', 'f4a8': '讯', 'ec0f': '太', 'ea73': '鸭', 'e76b': '号', 'f434': '街', 'e1af': '交','ea67': '与', 'e825': '叉', 'f401': '附', 'eeb3': '近', 'f3df': '层', 'e9c6': '旁', 'ef7a': '对', 'eebf': '巷', 'e86a': '栋','ecba': '环', 'e821': '省', 'e335': '桥', 'eb70': '湖', 'f838': '段', 'edc1': '乡', 'ed95': '厦', 'ea35': '府', 'e14e': '铺','eff6': '内', 'ed4b': '侧', 'f58b': '元', 'e483': '购', 'ebea': '前', 'f641': '幢', 'efc6': '滨', 'e581': '处', 'f5fc': '向','e1b3': '座', 'f00c': '下', 'f4a6': '臬', 'f488': '凤', 'f25b': '港', 'f2e5': '开', 'e4e7': '关', 'e4c9': '景', 'f872': '泉','e820': '塘', 'f245': '放', 'e844': '昌', 'e356': '线', 'e650': '湾', 'ee1e': '政', 'e7bb': '步', 'e0b1': '宁', 'f33f': '解','e22d': '白', 'e61b': '田', 'f755': '町', 'e655': '溪', 'f06b': '十', 'e730': '八', 'e67d': '古', 'ecfc': '双', 'e9f2': '胜','eb12': '本', 'f586': '单', 'f826': '同', 'e739': '九', 'f570': '迎', 'e3f0': '第', 'e98a': '台', 'ed28': '玉', 'f623': '锦','e33b': '底', 'ebe8': '后', 'e7c1': '七', 'eb92': '斜', 'e34d': '期', 'e01e': '武', 'f603': '岭', 'eb60': '松', 'e052': '角','e9cb': '纪', 'efa5': '朝', 'f7d2': '峰', 'f204': '六', 'e9c2': '振', 'f214': '珠', 'f289': '局', 'e82e': '岗', 'f27c': '洲','ee54': '横', 'ec7f': '边', 'e7cd': '济', 'f8cc': '井', 'f258': '办', 'ec32': '汉', 'e84a': '代', 'e0b2': '临', 'e6b9': '弄','e73c': '团', 'f6e8': '外', 'f6d6': '塔', 'e217': '杨', 'efc4': '铁', 'eb78': '浦', 'f0b3': '字', 'e1e3': '年', 'e039': '岛','e10d': '陵', 'eab5': '原', 'e74c': '梅', 'f3e3': '进', 'f148': '荣', 'e021': '友', 'f646': '虹', 'f62f': '央', 'e340': '桂','eaff': '沿', 'e44e': '事', 'e543': '津', 'ec01': '凯', 'f285': '莲', 'edb3': '丁', 'e4fb': '秀', 'e46b': '柳', 'e55c': '集','eb50': '紫', 'e0f7': '旗', 'ed05': '张', 'e2d5': '谷', 'f136': '的', 'e020': '是', 'e58f': '不', 'eea6': '了', 'e995': '很','e1fd': '还', 'f1d8': '个', 'e384': '也', 'ed76': '这', 'e36e': '我', 'f6b5': '就', 'ec2e': '在', 'e308': '以', 'f694': '可','f4e7': '到', 'ec09': '错', 'f3b7': '没', 'e0b4': '去', 'f672': '过', 'e1fb': '感', 'e749': '次', 'eaef': '要', 'e048': '比','f592': '觉', 'e293': '看', 'f3ec': '得', 'e5a9': '说', 'e3d2': '常', 'e317': '真', 'f14a': '们', 'e415': '但', 'ee98': '最','ebb0': '喜', 'e075': '哈', 'ebf6': '么', 'f3a0': '别', 'e234': '位', 'e867': '能', 'ea80': '较', 'e770': '境', 'ebbb': '非','ecfb': '为', 'e8f1': '欢', 'e901': '然', 'e809': '他', 'e76c': '挺', 'f3cb': '着', 'e8df': '价', 'ed71': '那', 'eae5': '意','f4d1': '种', 'e6b3': '想', 'f3e2': '出', 'f2c2': '员', 'f2f9': '两', 'e7ae': '推', 'e842': '做', 'f069': '排', 'f5af': '实','f45b': '分', 'f3c3': '间', 'e7cb': '甜', 'e584': '度', 'f312': '起', 'f59f': '满', 'e3cb': '给', 'f4ec': '热', 'f07b': '完','e593': '格', 'f784': '荐', 'f107': '喝', 'e1db': '等', 'eb2a': '其', 'e992': '再', 'e3ff': '几', 'e2d1': '只', 'f613': '现','e05e': '朋', 'e891': '候', 'e001': '样', 'f043': '直', 'f585': '而', 'f1ee': '买', 'ed2d': '于', 'e754': '般', 'e07c': '豆','e40b': '量', 'f425': '选', 'e65b': '奶', 'e744': '打', 'f267': '每', 'e089': '评', 'e9e3': '少', 'ea8e': '算', 'ec85': '又','eca7': '因', 'edb7': '情', 'ee2e': '找', 'ee79': '些', 'e372': '份', 'e10c': '置', 'f856': '适', 'f157': '什', 'eb20': '蛋','e3f2': '师', 'f3aa': '气', 'ec9f': '你', 'f7eb': '姐', 'e030': '棒', 'e2f8': '试', 'ec40': '总', 'f664': '定', 'f4b5': '啊','ef80': '足', 'e823': '级', 'f776': '整', 'e286': '带', 'e407': '虾', 'f21e': '如', 'e9b9': '态', 'ea44': '且', 'e8be': '尝','f7ce': '主', 'ec9e': '话', 'efaa': '强', 'f5bb': '当', 'e680': '更', 'e266': '板', 'e12b': '知', 'eda3': '己', 'e4fe': '无','f0e3': '酸', 'e60a': '让', 'e4dc': '入', 'e88f': '啦', 'f682': '式', 'e8a0': '笑', 'f8ee': '赞', 'efd3': '片', 'f0fb': '酱','e8b5': '差', 'f19b': '像', 'eb53': '提', 'ea57': '队', 'e469': '走', 'e4a7': '嫩', 'e263': '才', 'ea42': '刚', 'f083': '午','e0de': '接', 'eec9': '重', 'e95e': '串', 'f8cd': '回', 'e16f': '晚', 'f405': '微', 'e3a3': '周', 'e0d4': '值', 'ed0b': '费','ed9e': '性', 'ec1b': '桌', 'e462': '拍', 'e145': '跟', 'efb2': '块', 'f7a9': '调', 'ed2b': '糕'
}

这样一来,不论接下来我们用哪个字体文件解密,都可以根据这个对应关系表找到对应的字体了。

接下来敲代码,实现对应关系,

这里font1相当于咱们双击打开hours.xml文件后看到的东西

font1 = TTFont('./hours.woff')
uni_list1 = font1.getGlyphOrder()[2:]

uni_list1 取的是字体文件里的字符编码,前两个是不要的,因为这两对应不是字体,在软件打开时候可以看到


我们想解密address那里的字体,就把address字体文件对应的字体,通过基准对应表找出来

#得到address对应的字体
address_key_list = []
address_value_list = []
font_address= TTFont('./address.woff')
uni_list_address = font_address.getGlyphOrder()[2:]
for uni1 in uni_list1:#这里取到的就是x,y,on那一块obj1 = font1['glyf'][uni1]for uni_address in uni_list_address:obj_address= font_address['glyf'][uni_address]if obj1 == obj_address:uni1_key_address= uni1.replace('uni', '')# print(uni2,dict1[uni1_key])uni2_key_address = uni_address.replace('uni', '')# print(uni2_key,dict1[uni1_key])address_key_list.append(uni2_key_address)address_value_list.append(dict1[uni1_key_address])

这样我们就通过基准表得到了address字体文件内,字符与字体的对应关系,就可以在爬取地址数据的时候完成替换了。

#匹配并替换地址
new_data = data.replace('&#x', '')
soup = BeautifulSoup(new_data, 'lxml')
address = soup.find('span', id='address').get_text().replace(';', '')
print(address)
for x, y in zip(address_key_list, address_value_list):# print(x, y)address = address.replace(x, y)
print(address)


可以看到,还有一些没有替换成功,观察网页发现,这些是数字

#得到数字对应的字体
num_key_list=[]
num_value_list=[]
font_address= TTFont('./num.woff')
uni_list_address = font_address.getGlyphOrder()[2:]
for uni1 in uni_list1:obj1 = font1['glyf'][uni1]for uni_address in uni_list_address:obj_address= font_address['glyf'][uni_address]if obj1 == obj_address:uni1_key_address= uni1.replace('uni', '')# print(uni2,dict1[uni1_key])uni2_key_address = uni_address.replace('uni', '')# print(uni2_key,dict1[uni1_key])num_key_list.append(uni2_key_address)num_value_list.append(dict1[uni1_key_address])
#进一步替换数字
new_address=address
for x, y in zip(num_key_list,num_value_list):# print(x, y)new_address = new_address.replace(x, y)
print(new_address)


完美替换了。

好了,这就算初步完成了。自己一步一步做一下,碰些坑,查些资料,慢慢就会有自己的思路和理解了,到时候再回来看这一类的文章,就会感觉没那么绕了

以下给出完整代码,有迷惑的地方可以留言询问我

# -*- coding: utf-8 -*-
# @Author   : LMD
# @FILE     : 大众点评有优化.py
# @Time     : 2020/1/4 14:40
# @Software : PyCharmimport requests
import re
from bs4 import BeautifulSoup
from fontTools.ttLib import TTFontsession = requests.session()
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36','Cookie': '_lxsdk_cuid=16e6e3d2d194c-0d71792c1bdecf-386a410b-100200-16e6e3d2d1ac8; _lxsdk=16e6e3d2d194c-0d71792c1bdecf-386a410b-100200-16e6e3d2d1ac8; _hc.v=72af60e2-253b-67a8-af88-90115c90c91f.1573807534; s_ViewType=10; cy=8; cye=chengdu; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; thirdtoken=6beb8daf-da47-4349-a856-2c34699b7f33; _thirdu.c=069a3f46cb5e9efce3f6c78af7eb6e4a; dper=5c332835a4921ed6a19a6ff4c841a0e57581755062bf917973148ac82c862dba700fa56c5231c7c650707b9358e2ac466c44c5995617ef708dae7d804ad8cb363fb8f539e965c8fca1cb52ac1ba00050369587f8c79e2f9d2c3afe1ce161e2e1; ll=7fd06e815b796be3df069dec7836c3df; ua=dpuser_1140076444; ctu=19556f57d2292d0bdda3d762beb289fccb7fcce4772a6764c862652131c80dad; _lxsdk_s=16f6569077f-a6-e48-dac%7C%7C148'
}
url = 'http://www.dianping.com/shop/93364485'
rq = session.get(url, headers=headers)
print(url)
rq.encoding = 'utf8'
data = rq.text
print(data)# svgtextcss = '//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/4bc2975ca0b73e5fcb749c122c05e932.css'
svgtextcss = re.findall(r'href="([^"]+svgtextcss[^"]+)"', data)[0]
print(svgtextcss)
woffs_url = 'http:' + svgtextcss
woff_text = requests.get(woffs_url).text
print(woff_text)
# print('*'*50)
# 通过'PingFangSC-'分隔
lines = woff_text.split('PingFangSC-')
print(lines)
# print('*'*50)
#分别匹配到各类文件
json_woff = {}
for line in lines:print('line:',line)print('*' * 50)woff_urls = re.findall('([^"]+woff)"\)', line)# review:评论,shopdesc:店铺描述type = re.findall('} .(.*?){', line)# print(a)if len(woff_urls) > 0 and len(type) > 0:woff_url = 'http:' + woff_urls[0]print('文件url:',woff_url)a_key = type[0]print('文件对应的解密类型',a_key)print('=' * 50)json_woff[a_key] = woff_urlprint(json_woff)#下载对应的woff文件
for a, b in json_woff.items():print(a, b)woff_name = awith open('./{}.woff'.format(str(woff_name)), 'wb') as writer:writer.write(requests.get(b).content)#字体与编码对应表
dict1 = {'f409': '1', 'f338': '2', 'ed3d': '3', 'e40a': '4', 'e280': '5', 'ebcd': '6', 'f0a4': '7', 'ef8e': '8', 'ed09': '9','ee67': '0', 'e322': '店', 'e8c9': '中', 'eb24': '美', 'e527': '家', 'e252': '馆', 'f1e2': '小', 'e1b2': '车', 'f16f': '大','ea2e': '市', 'e441': '公', 'eeb7': '酒', 'ed74': '行', 'ef19': '国', 'e716': '品', 'e45e': '发', 'f529': '电', 'e7fb': '金','f576': '心', 'e9d8': '业', 'e729': '商', 'ed93': '司', 'e099': '超', 'e29d': '生', 'efad': '装', 'ec71': '园', 'f13e': '场','e9ce': '食', 'f1ad': '有', 'f07e': '新', 'f8e3': '限', 'e475': '天', 'f1bc': '面', 'e46c': '工', 'eb88': '服', 'e68b': '海','e4b6': '华', 'e348': '水', 'f3b4': '房', 'f1b8': '饰', 'e2a9': '城', 'eed6': '乐', 'ed60': '汽', 'e5f9': '香', 'e888': '部','e2d9': '利', 'eb26': '子', 'e515': '老', 'e885': '艺', 'f87a': '花', 'f650': '专', 'f20a': '东', 'f88b': '肉', 'ed45': '菜','e141': '学', 'ecb7': '福', 'e9c4': '饭', 'e960': '人', 'f038': '百', 'e65f': '餐', 'f566': '茶', 'e904': '务', 'e007': '通','ef46': '味', 'eecf': '所', 'e5ce': '山', 'ec37': '区', 'eaae': '门', 'e6c5': '药', 'eceb': '银', 'e66e': '农', 'f3a9': '龙','e0bb': '停', 'ea1d': '尚', 'e73f': '安', 'e51a': '广', 'ec69': '鑫', 'e982': '一', 'f7f9': '容', 'e93d': '动', 'e934': '南','f07c': '具', 'e698': '源', 'e3dc': '兴', 'f69f': '鲜', 'f381': '记', 'e2c4': '时', 'ea97': '机', 'f201': '烤', 'f2cd': '文','f34f': '康', 'e1ca': '信', 'e3bc': '果', 'e906': '阳', 'e2b9': '理', 'e3c6': '锅', 'e060': '宝', 'e8f9': '达', 'e559': '地','f75a': '儿', 'e6c9': '衣', 'e961': '特', 'f359': '产', 'ebe6': '西', 'f6d1': '批', 'e103': '坊', 'f24a': '州', 'f4d4': '牛','e72d': '佳', 'ed66': '化', 'edf8': '五', 'e209': '米', 'e8cc': '修', 'f03f': '爱', 'e01b': '北', 'f167': '养', 'ee43': '卖','e6f1': '建', 'ecff': '材', 'f335': '三', 'e719': '会', 'f8e8': '鸡', 'f237': '室', 'e154': '红', 'e921': '站', 'e9ca': '德','f03d': '王', 'ef91': '光', 'f567': '名', 'e8e4': '丽', 'efe8': '油', 'f0db': '院', 'e7ef': '堂', 'f68f': '烧', 'e767': '江','e4e8': '社', 'ead5': '合', 'e853': '星', 'f56f': '货', 'f563': '型', 'e5bf': '村', 'ed25': '自', 'e94e': '科', 'e553': '快','f2bf': '便', 'f1dc': '日', 'f7c3': '民', 'e387': '营', 'f233': '和', 'f54c': '活', 'e11c': '童', 'e5e2': '明', 'e0ef': '器','ee68': '烟', 'e1cf': '育', 'e6cb': '宾', 'e523': '精', 'e27d': '屋', 'e886': '经', 'ee2f': '居', 'f75e': '庄', 'e139': '石','e2ef': '顺', 'eaa9': '林', 'e53f': '尔', 'ea94': '县', 'e62a': '手', 'e198': '厅', 'ec74': '销', 'ef37': '用', 'edb0': '好','f81e': '客', 'eca3': '火', 'f00f': '雅', 'f0cb': '盛', 'eb3a': '体', 'f1ed': '旅', 'eea8': '之', 'e008': '鞋', 'eb47': '辣','e4a8': '作', 'efdb': '粉', 'e5c0': '包', 'e8d2': '楼', 'ef96': '校', 'f32c': '鱼', 'e318': '平', 'f105': '彩', 'e84b': '上','e4ec': '吧', 'f0ef': '保', 'e41c': '永', 'e566': '万', 'ebf3': '物', 'f6f9': '教', 'e3ad': '吃', 'f3d8': '设', 'f800': '医','e357': '正', 'f02b': '造', 'efe3': '丰', 'f8a6': '健', 'f26c': '点', 'ee6a': '汤', 'ed43': '网', 'f229': '庆', 'e205': '技','e225': '斯', 'ea1e': '洗', 'ee7c': '料', 'e4f3': '配', 'f26b': '汇', 'e8c0': '木', 'f760': '缘', 'e8ed': '加', 'ea0b': '麻','e8b3': '联', 'ee5c': '卫', 'e0e6': '川', 'f370': '泰', 'ea4d': '色', 'e803': '世', 'e248': '方', 'e896': '寓', 'f1ce': '风','eb29': '幼', 'f163': '羊', 'f17b': '烫', 'e0a6': '来', 'f7b7': '高', 'f836': '厂', 'e046': '兰', 'f503': '阿', 'eb55': '贝','eff4': '皮', 'f38c': '全', 'e3fa': '女', 'e526': '拉', 'e875': '成', 'edcd': '云', 'e3d3': '维', 'f033': '贸', 'ed6f': '道','f313': '术', 'e59f': '运', 'e242': '都', 'f371': '口', 'e94d': '博', 'f643': '河', 'e029': '瑞', 'e179': '宏', 'e066': '京','ef62': '际', 'e958': '路', 'e2a7': '祥', 'f8c4': '青', 'f4b6': '镇', 'e9f9': '厨', 'f5e7': '培', 'ead9': '力', 'eb59': '惠','f699': '连', 'ecf1': '马', 'f464': '鸿', 'f0a0': '钢', 'e80b': '训', 'f177': '影', 'f1d9': '甲', 'f13b': '助', 'e71d': '窗','f270': '布', 'f8ba': '富', 'e5c3': '牌', 'e78b': '头', 'e86c': '四', 'f345': '多', 'e4c8': '妆', 'e870': '吉', 'ed88': '苑','e1e9': '沙', 'e3a7': '恒', 'f3db': '隆', 'f4ca': '春', 'ec10': '干', 'eb28': '饼', 'e872': '氏', 'e056': '里', 'f662': '二','f4ef': '管', 'e8dc': '诚', 'ef1e': '制', 'ed03': '售', 'eb48': '嘉', 'ee26': '长', 'f0ff': '轩', 'eba5': '杂', 'ea45': '副','f182': '清', 'ed5c': '计', 'e256': '黄', 'f4a8': '讯', 'ec0f': '太', 'ea73': '鸭', 'e76b': '号', 'f434': '街', 'e1af': '交','ea67': '与', 'e825': '叉', 'f401': '附', 'eeb3': '近', 'f3df': '层', 'e9c6': '旁', 'ef7a': '对', 'eebf': '巷', 'e86a': '栋','ecba': '环', 'e821': '省', 'e335': '桥', 'eb70': '湖', 'f838': '段', 'edc1': '乡', 'ed95': '厦', 'ea35': '府', 'e14e': '铺','eff6': '内', 'ed4b': '侧', 'f58b': '元', 'e483': '购', 'ebea': '前', 'f641': '幢', 'efc6': '滨', 'e581': '处', 'f5fc': '向','e1b3': '座', 'f00c': '下', 'f4a6': '臬', 'f488': '凤', 'f25b': '港', 'f2e5': '开', 'e4e7': '关', 'e4c9': '景', 'f872': '泉','e820': '塘', 'f245': '放', 'e844': '昌', 'e356': '线', 'e650': '湾', 'ee1e': '政', 'e7bb': '步', 'e0b1': '宁', 'f33f': '解','e22d': '白', 'e61b': '田', 'f755': '町', 'e655': '溪', 'f06b': '十', 'e730': '八', 'e67d': '古', 'ecfc': '双', 'e9f2': '胜','eb12': '本', 'f586': '单', 'f826': '同', 'e739': '九', 'f570': '迎', 'e3f0': '第', 'e98a': '台', 'ed28': '玉', 'f623': '锦','e33b': '底', 'ebe8': '后', 'e7c1': '七', 'eb92': '斜', 'e34d': '期', 'e01e': '武', 'f603': '岭', 'eb60': '松', 'e052': '角','e9cb': '纪', 'efa5': '朝', 'f7d2': '峰', 'f204': '六', 'e9c2': '振', 'f214': '珠', 'f289': '局', 'e82e': '岗', 'f27c': '洲','ee54': '横', 'ec7f': '边', 'e7cd': '济', 'f8cc': '井', 'f258': '办', 'ec32': '汉', 'e84a': '代', 'e0b2': '临', 'e6b9': '弄','e73c': '团', 'f6e8': '外', 'f6d6': '塔', 'e217': '杨', 'efc4': '铁', 'eb78': '浦', 'f0b3': '字', 'e1e3': '年', 'e039': '岛','e10d': '陵', 'eab5': '原', 'e74c': '梅', 'f3e3': '进', 'f148': '荣', 'e021': '友', 'f646': '虹', 'f62f': '央', 'e340': '桂','eaff': '沿', 'e44e': '事', 'e543': '津', 'ec01': '凯', 'f285': '莲', 'edb3': '丁', 'e4fb': '秀', 'e46b': '柳', 'e55c': '集','eb50': '紫', 'e0f7': '旗', 'ed05': '张', 'e2d5': '谷', 'f136': '的', 'e020': '是', 'e58f': '不', 'eea6': '了', 'e995': '很','e1fd': '还', 'f1d8': '个', 'e384': '也', 'ed76': '这', 'e36e': '我', 'f6b5': '就', 'ec2e': '在', 'e308': '以', 'f694': '可','f4e7': '到', 'ec09': '错', 'f3b7': '没', 'e0b4': '去', 'f672': '过', 'e1fb': '感', 'e749': '次', 'eaef': '要', 'e048': '比','f592': '觉', 'e293': '看', 'f3ec': '得', 'e5a9': '说', 'e3d2': '常', 'e317': '真', 'f14a': '们', 'e415': '但', 'ee98': '最','ebb0': '喜', 'e075': '哈', 'ebf6': '么', 'f3a0': '别', 'e234': '位', 'e867': '能', 'ea80': '较', 'e770': '境', 'ebbb': '非','ecfb': '为', 'e8f1': '欢', 'e901': '然', 'e809': '他', 'e76c': '挺', 'f3cb': '着', 'e8df': '价', 'ed71': '那', 'eae5': '意','f4d1': '种', 'e6b3': '想', 'f3e2': '出', 'f2c2': '员', 'f2f9': '两', 'e7ae': '推', 'e842': '做', 'f069': '排', 'f5af': '实','f45b': '分', 'f3c3': '间', 'e7cb': '甜', 'e584': '度', 'f312': '起', 'f59f': '满', 'e3cb': '给', 'f4ec': '热', 'f07b': '完','e593': '格', 'f784': '荐', 'f107': '喝', 'e1db': '等', 'eb2a': '其', 'e992': '再', 'e3ff': '几', 'e2d1': '只', 'f613': '现','e05e': '朋', 'e891': '候', 'e001': '样', 'f043': '直', 'f585': '而', 'f1ee': '买', 'ed2d': '于', 'e754': '般', 'e07c': '豆','e40b': '量', 'f425': '选', 'e65b': '奶', 'e744': '打', 'f267': '每', 'e089': '评', 'e9e3': '少', 'ea8e': '算', 'ec85': '又','eca7': '因', 'edb7': '情', 'ee2e': '找', 'ee79': '些', 'e372': '份', 'e10c': '置', 'f856': '适', 'f157': '什', 'eb20': '蛋','e3f2': '师', 'f3aa': '气', 'ec9f': '你', 'f7eb': '姐', 'e030': '棒', 'e2f8': '试', 'ec40': '总', 'f664': '定', 'f4b5': '啊','ef80': '足', 'e823': '级', 'f776': '整', 'e286': '带', 'e407': '虾', 'f21e': '如', 'e9b9': '态', 'ea44': '且', 'e8be': '尝','f7ce': '主', 'ec9e': '话', 'efaa': '强', 'f5bb': '当', 'e680': '更', 'e266': '板', 'e12b': '知', 'eda3': '己', 'e4fe': '无','f0e3': '酸', 'e60a': '让', 'e4dc': '入', 'e88f': '啦', 'f682': '式', 'e8a0': '笑', 'f8ee': '赞', 'efd3': '片', 'f0fb': '酱','e8b5': '差', 'f19b': '像', 'eb53': '提', 'ea57': '队', 'e469': '走', 'e4a7': '嫩', 'e263': '才', 'ea42': '刚', 'f083': '午','e0de': '接', 'eec9': '重', 'e95e': '串', 'f8cd': '回', 'e16f': '晚', 'f405': '微', 'e3a3': '周', 'e0d4': '值', 'ed0b': '费','ed9e': '性', 'ec1b': '桌', 'e462': '拍', 'e145': '跟', 'efb2': '块', 'f7a9': '调', 'ed2b': '糕'
}font1 = TTFont('./hours.woff')
uni_list1 = font1.getGlyphOrder()[2:]#得到address对应的
address_key_list = []
address_value_list = []
font_address= TTFont('./address.woff')
uni_list_address = font_address.getGlyphOrder()[2:]
for uni1 in uni_list1:obj1 = font1['glyf'][uni1]for uni_address in uni_list_address:obj_address= font_address['glyf'][uni_address]if obj1 == obj_address:uni1_key_address= uni1.replace('uni', '')# print(uni2,dict1[uni1_key])uni2_key_address = uni_address.replace('uni', '')# print(uni2_key,dict1[uni1_key])address_key_list.append(uni2_key_address)address_value_list.append(dict1[uni1_key_address])
print('address_key_list:',address_key_list)
print('address_value_list:',address_value_list)
#得到数字对应的字体
num_key_list=[]
num_value_list=[]
font_address= TTFont('./num.woff')
uni_list_address = font_address.getGlyphOrder()[2:]
for uni1 in uni_list1:obj1 = font1['glyf'][uni1]for uni_address in uni_list_address:obj_address= font_address['glyf'][uni_address]if obj1 == obj_address:uni1_key_address= uni1.replace('uni', '')# print(uni2,dict1[uni1_key])uni2_key_address = uni_address.replace('uni', '')# print(uni2_key,dict1[uni1_key])num_key_list.append(uni2_key_address)num_value_list.append(dict1[uni1_key_address])#匹配并替换地址
new_data = data.replace('&#x', '')
soup = BeautifulSoup(new_data, 'lxml')
address = soup.find('span', id='address').get_text().replace(';', '')
print(address)
for x, y in zip(address_key_list, address_value_list):# print(x, y)address = address.replace(x, y)
print(address)
#进一步替换数字
new_address=address
for x, y in zip(num_key_list,num_value_list):# print(x, y)new_address = new_address.replace(x, y)
print(new_address)
# #匹配并替换电话
#
# soup = BeautifulSoup(new_data, 'lxml')
# tel = soup.find('p', class_='expand-info tel').get_text().replace(';', '')
# print(tel)
# for x, y in zip(num_key_list, num_value_list):
#     # print(x, y)
#     tel = tel.replace(x, y)
# print(tel)

大众点评文字反爬破解相关推荐

  1. 大众点评评论反爬解决方案

    目前大众点评主要有两种反爬的机制:css反爬和字体反爬. css反爬的解决方案 具体详见反爬机制之css反爬详解 字体反爬的解决方案

  2. 大众点评woff反爬

    一.调试 发现字体是加密的,猜测是自定义字体. 二.WTF woff? woff是一种网页采用的字体格式标准,-- 查看页面源代码,确认是woff加密 三.绕过 ①获取woff文件 随便选择一个标签, ...

  3. 大众点评文字加密反爬Python

    本文将 大众点评字体反爬方法及完整程序进行注释讲解,亲测有效!!! 以下是将网页字体库使用forcontent字体软件制作 woff_list = '1234567890店中美家馆小车大市公酒行国品发 ...

  4. python爬取大众点评数据_Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!...

    作者 | 胡萝卜酱 责编 | 伍杏玲 成都到处都是火锅店,有名的店,稍微去晚一点,排队都要排好久,没听说的店,又怕味道不好. 那么如何选择火锅店呢?最简单的肯定是在美团.大众点评上找一找啊.所以,本文 ...

  5. Python3 pyspider(二)大众点评商家信息爬取

    大众点评商家信息爬取 首页信息:http://www.dianping.com/ 我是按照城市----商家出售的商品类型----分页----商家----爬取 城市: 出售商品类型: 分页:(应该是反爬 ...

  6. python爬取电影票房前50_Python3爬取起猫眼电影实时票房信息,解决文字反爬~~~附源代码...

    上文解决了起点中文网部分数字反爬的信息,详细链接https://www.cnblogs.com/aby321/p/10214123.html 本文研究另一种文字反爬的机制--猫眼电影实时票房反爬 虽然 ...

  7. Go爬取起点中文网 解决文字反爬

    Go语言的爬虫库不如Python强大,却也五脏俱全. 今天我们分析如何爬取起点中文网数据,以及遇到反爬如何处理. 作品链接:http://www.365yg.com/i6678092837810078 ...

  8. 爬虫 — 大众点评商户信息的爬取和文字反爬

    信息爬取 import requests from lxml import etree import time import json import pandas as pd# 获取商户名称和ID r ...

  9. python爬取大众点评字体_python爬取大众点评解决字体反爬

    今天我们弄一下大众点评 学习阶段,我们要抱着学习的目的 重点是思路,做爬虫就不要想着一劳永逸了 方法公开,人家就换了 知识是你自己的,学到了,他换不掉 好了,我们开始吧 网站展示 https://ww ...

  10. Python,requests爬虫,使用代理爬取大众点评(含爬取结果。。。在文末)

    由于在工作中,客户需要大众点评的行业数据,因此本人使用Python对大众点评网站进行了爬取,虽然在爬取之前就想好了可能会遇到的坑,但是没想要从坑中爬出来这么难.本次大众点评爬虫代码编写耗时一个月.也算 ...

最新文章

  1. win 下 安装 iphone 环境
  2. 提升【百度网盘】下载速度
  3. Smooth Delivery:如何减少网络拥塞?
  4. 轻松掌握使用 SQL Server 浏览器,解决SQL Server 2005跨网段不能连接问题
  5. JVM调优总结(2):基本垃圾回收算法
  6. python 3 面向过程编程
  7. 15款优雅的 WordPress 电子商务网站主题
  8. jsp java代码报错,求助!JSP代码中调java服务出参返回正常 weblogic报错BEA-101017
  9. OpenStack Networking – FlatManager and FlatDHCPManager
  10. Vue之ElementUI导航菜单
  11. 易语言钩子DLL注入源码及源码说明
  12. 3D建模与处理软件简介
  13. dsp和通用计算机的区别,DSP处理器与通用处理器的比较
  14. 脱壳总结之 - upx,aspack, FSG,PECompact2.X,WinUpack脱壳
  15. 云存储:在Drobpox,Drive,S3和其他之间进行选择
  16. 3G门户4年衰落:转型平台遇阻 上市梦无期
  17. OBD-II协议对比介绍
  18. 邯郸“一趟清”业务改革,开创一窗受理新模式
  19. java update()方法代码_Java Datastore.update方法代码示例
  20. arduino 伸缩轨道_基于Arduino的多轨道Midi音序器的实现

热门文章

  1. 穷举法 解决用3个水桶等分8升水 python实现
  2. 传统方法车道线标注及相关知识
  3. 双频wifi是什么意思 双频wifi好处有哪些
  4. Maya粒子消散特效制作(三)
  5. 【maya】学习历程
  6. Matlab运算符总结
  7. WPS文字常用快捷键大全
  8. 网络编程day1-本地信息的获取
  9. 打造自己的博客(一)利用VuePress完成博客整体搭建,并支持评论和自动发布
  10. 二维数组定义及初始化