本文仅供学习。
还没有解过css加密,今天就来试一次,虽然也看过其他文章,但是自己动手解一遍熟悉的更快一些。
首先打开链接 http://www.dianping.com/shijiazhuang/ch10
刷新网页后分析页面,结果是加密的。既然知道了是css映射,那就直接把字体文件下载下来。这个总共有三个字体文件,对应三种标签,shopnum,tagname,address,如图
找到css文件(css文件名字会变,大概率就在前几个,名字是一堆英文字母加数字的,点开后看preview就一目了然) 看到每个分类后边都有一个woff文件,直接下载下来,并记好哪个文件对应哪个分类。
下载一个这个工具可以打开woff文件,链接 https://www.high-logic.com/FontCreatorSetup-x64.exe(这个是64位的)
然后随便打开一个woff文件,是这样的(文件名字我已经改成了对应的,方便记)
我先发一个对应好的
可以看到 在shopnum里边e61e 对应的是 4 ; e139 对应的是3。
然后按照流程:
1.请求到html
2.匹配所有的标签和加密字符 类似这样()
3.根据class选择是哪个woff里的字体 ,然后修改为解密后的字体
4.然后替换掉原来的html里的标签就可以
最后上代码:
#-*-coding:utf-8-*-
from fontTools.ttLib import TTFont
import requests,re
def get_fond():
count_font = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '店', '中', '美', '家',
'馆', '小', '车', '大', '市', '公', '酒', '行', '国', '品', '发', '电', '金',
'心', '业', '商', '司', '超', '生', '装', '园', '场', '食', '有', '新', '限',
'天', '面', '工', '服', '海', '华', '水', '房', '饰', '城', '乐', '汽', '香',
'部', '利', '子', '老', '艺', '花', '专', '东', '肉', '菜', '学', '福', '饭',
'人', '百', '餐', '茶', '务', '通', '味', '所', '山', '区', '门', '药', '银',
'农', '龙', '停', '尚', '安', '广', '鑫', '一', '容', '动', '南', '具', '源',
'兴', '鲜', '记', '时', '机', '烤', '文', '康', '信', '果', '阳', '理', '锅',
'宝', '达', '地', '儿', '衣', '特', '产', '西', '批', '坊', '州', '牛', '佳',
'化', '五', '米', '修', '爱', '北', '养', '卖', '建', '材', '三', '会', '鸡',
'室', '红', '站', '德', '王', '光', '名', '丽', '油', '院', '堂', '烧', '江',
'社', '合', '星', '货', '型', '村', '自', '科', '快', '便', '日', '民', '营',
'和', '活', '童', '明', '器', '烟', '育', '宾', '精', '屋', '经', '居', '庄',
'石', '顺', '林', '尔', '县', '手', '厅', '销', '用', '好', '客', '火', '雅',
'盛', '体', '旅', '之', '鞋', '辣', '作', '粉', '包', '楼', '校', '鱼', '平',
'彩', '上', '吧', '保', '永', '万', '物', '教', '吃', '设', '医', '正', '造',
'丰', '健', '点', '汤', '网', '庆', '技', '斯', '洗', '料', '配', '汇', '木',
'缘', '加', '麻', '联', '卫', '川', '泰', '色', '世', '方', '寓', '风', '幼',
'羊', '烫', '来', '高', '厂', '兰', '阿', '贝', '皮', '全', '女', '拉', '成',
'云', '维', '贸', '道', '术', '运', '都', '口', '博', '河', '瑞', '宏', '京',
'际', '路', '祥', '青', '镇', '厨', '培', '力', '惠', '连', '马', '鸿', '钢',
'训', '影', '甲', '助', '窗', '布', '富', '牌', '头', '四', '多', '状', '吉',
'苑', '沙', '恒', '隆', '春', '干', '饼', '氏', '里', '二', '管', '诚', '制',
'售', '嘉', '长', '轩', '杂', '副', '清', '计', '黄', '讯', '太', '鸭', '号',
'街', '交', '与', '叉', '附', '近', '层', '旁', '对', '巷', '栋', '环', '省',
'桥', '湖', '段', '乡', '厦', '府', '铺', '内', '侧', '元', '购', '前', '幢',
'滨', '处', '向', '座', '下', '県', '凤', '港', '开', '关', '景', '泉', '塘',
'放', '昌', '线', '湾', '政', '步', '宁', '解', '白', '田', '町', '溪', '十',
'八', '古', '双', '胜', '本', '单', '同', '九', '迎', '第', '台', '玉', '锦',
'底', '后', '七', '斜', '期', '武', '岭', '松', '角', '纪', '朝', '峰', '六',
'振', '珠', '局', '岗', '洲', '横', '边', '济', '井', '办', '汉', '代', '临',
'弄', '团', '外', '塔', '杨', '铁', '浦', '字', '年', '岛', '陵', '原', '梅',
'进', '荣', '友', '虹', '央', '桂', '沿', '事', '津', '凯', '莲', '丁', '秀',
'柳', '集', '紫', '旗', '张', '谷', '的', '是', '不', '了', '很', '还', '个',
'也', '这', '我', '就', '在', '以', '可', '到', '错', '没', '去', '过', '感',
'次', '要', '比', '觉', '看', '得', '说', '常', '真', '们', '但', '最', '喜',
'哈', '么', '别', '位', '能', '较', '境', '非', '为', '欢', '然', '他', '挺',
'着', '价', '那', '意', '种', '想', '出', '员', '两', '推', '做', '排', '实',
'分', '间', '甜', '度', '起', '满', '给', '热', '完', '格', '荐', '喝', '等',
'其', '再', '几', '只', '现', '朋', '候', '样', '直', '而', '买', '于', '般',
'豆', '量', '选', '奶', '打', '每', '评', '少', '算', '又', '因', '情', '找',
'些', '份', '置', '适', '什', '蛋', '师', '气', '你', '姐', '棒', '试', '总',
'定', '啊', '足', '级', '整', '带', '虾', '如', '态', '且', '尝', '主', '话',
'强', '当', '更', '板', '知', '己', '无', '酸', '让', '入', '啦', '式', '笑',
'赞', '片', '酱', '差', '像', '提', '队', '走', '嫩', '才', '刚', '午', '接',
'重', '串', '回', '晚', '微', '周', '值', '费', '性', '桌', '拍', '跟', '块',
'调', '糕']
#评分
shopnum_list = TTFont('shopnum_2a20.woff').getGlyphOrder()[2:]
#标签
tagname_list = TTFont('tagname_464f.woff').getGlyphOrder()[2:]
#地址
address_list = TTFont('address_09e4.woff').getGlyphOrder()[2:]
for f_index,f_value in enumerate(count_font):
shopnum_dict[shopnum_list[f_index].replace('uni','&#x') + ';'] = f_value
tagname_dict[tagname_list[f_index].replace('uni','&#x') + ';'] = f_value
address_dict[address_list[f_index].replace('uni','&#x') + ';'] = f_value
def main():
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Cookie": "fspop=test; cy=24; cye=shijiazhuang; _lxsdk_cuid=1780fd116f7c8-0ec7a3b8d0b363-53e356a-1fa400-1780fd116f7c8; _lxsdk=1780fd116f7c8-0ec7a3b8d0b363-53e356a-1fa400-1780fd116f7c8; _hc.v=2acaf8e3-7981-fe66-af37-d4e3b3f417fa.1615173065; s_ViewType=10; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1615173065,1615251712; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1615252991; _lxsdk_s=1781589955a-823-3a6-f0%7C%7C2",
"Host": "www.dianping.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
}
url = 'http://www.dianping.com/shijiazhuang/ch10'
response = requests.get(url,headers = headers).text
#匹配出所有映射标签
svgmtsi_lists = re.compile('(<svgmtsi class=".*?">.*?</svgmtsi>)').findall(response)
#循环所有标签并替换为正常字体
for svgmtsi_tag in svgmtsi_lists:
svg_name = re.compile('<svgmtsi class="(.*?)">').findall(svgmtsi_tag)[0]
font_key = re.compile('>(.*?)<').findall(svgmtsi_tag)[0]
if svg_name == 'shopNum':
font_value = shopnum_dict[font_key]
response = response.replace(svgmtsi_tag,'<svgmtsi class="shopNum">' + font_value + '</svgmtsi>')
elif svg_name == 'tagName':
font_value = tagname_dict[font_key]
response = response.replace(svgmtsi_tag, '<svgmtsi class="tagName">' + font_value + '</svgmtsi>')
elif svg_name == 'address':
font_value = address_dict[font_key]
response = response.replace(svgmtsi_tag, '<svgmtsi class="address">' + font_value + '</svgmtsi>')
#最后匹配需要的数据就行了
divs = re.compile('(<div class="txt">.*?<span class="comment-list">.*?</div>)',re.S).findall(response)
for div in divs:
title = re.compile('<h4>(.*?)</h4>').findall(div)[0]
sorce = re.compile('<div class=".*?star_score_sml">(.*?)</div>').findall(div)[0]
street = re.compile('<a href = ".*?" data-click-name="shop_tag_region_click" data-shopid=".*?".*?>(.*?)</a>').findall(div)[0]
detail_address = re.compile('<span class="addr">(.*?)</span>').findall(div)[0]
print(title)
print(sorce)
print(re.sub('<.*?>','',street))
print(re.sub('<.*?>', '', detail_address))
print('-------------------------------------')
if __name__ == '__main__':
shopnum_dict = {}
tagname_dict = {}
address_dict = {}
#对应好字体
get_fond()
print('shopnum_dict',shopnum_dict)
print('tagname_dict', tagname_dict)
print('address_dict', address_dict)
#抓取并替换
main()
抓取结果: