前面写了58同城的字体反爬,这几天又跟大众点评的文字反爬杠上了,多方查找,各种踩坑,好多文章是之前的解决办法,大众已经更改了反爬方式,好在磕磕绊绊终于是搞定了。详细记录一下
首先,我们要搞得网页是这个点击进入大众网页
这是网页
代码跑出来是这样
css字体反爬,确定了,接下来找字体文件
多方尝试,找到了这个
复制链接打开
这些就是这个网页里用到的字体文件。先不管,全部下载下来,用FontCreator文件打开,通过打开我们发现,字体都一样,数量也一样,就是字体对应的编码不一样
后四位就是网页源码里的样子,比如网页源码里的‘我’这个字是‘’。这里用软件打开的字体文件里的就是‘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 TTFont
session = 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_url
print(json_woff)
运行过程是这样的:
得到的json_woff是这样的:
这样一来,解密类型就和字体文件对应起来了。像前面那个,
我们就可以用address对应的字体文件解密了。
接下来,就把这些文件对应下载下来
#下载对应的woff文件
for a, b in json_woff.items():
print(a, b)
woff_name = a
with 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 : PyCharm
import requests
import re
from bs4 import BeautifulSoup
from fontTools.ttLib import TTFont
session = 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_url
print(json_woff)
#下载对应的woff文件
for a, b in json_woff.items():
print(a, b)
woff_name = a
with 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)