Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
472 views
in Technique[技术] by (71.8m points)

python 大众SVG字体反爬替换加密字体问题!!!求解

import requests
import re
from lxml import etree
import time
from fontTools.ttLib import TTFont

# url = 'http://www.dianping.com/shanghai/ch10'
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36"}
parms = {"cookie":"s_ViewType=10; _lxsdk_cuid=1727845f7a3c8-0cae119ad6b9df-6b111b7e-240000-1727o=13774361762"}

def get_css_url(url):
    url = 'http://www.dianping.com/shanghai/ch10'
    res1 = requests.get(url,params=parms,headers=headers).text
    svgtexturl = "http://" + re.search(r's3plus.meituan.net/(.*?)/svgtextcss/(.*?).css', res1).group(0)
    print(svgtexturl)
    svg_res = requests.get(svgtexturl)
    # print(svg_res.text)
    return svg_res,res1,svgtexturl

def request_svg_url(svg_res):
    res = requests.get(url=svg_res,params=parms,headers=headers).text
    for text in res.split("@"):
        if "shopNum" in text:
            numsvg = "http:" + re.search(r',url("(.*?)");} .(.*?){font-family:', text).group(1)
            print(numsvg)
            ress = requests.get(numsvg).content
            with open('123.woff','wb+') as f:
                f.write(ress)
                print("!~!~!~!~!~!~!~~~~~~~")

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

    mappings = {}
    for k,v in font_name_map.items():
        if k.startswith('uni'):
            key_ = k.replace('uni','&#x')
            mappings[key_] = v
        else:
            mappings[k] = v
    #print(mappings)
    return mappings ###已经完成转换的字典     &#xdeca5b :糕

def html_font_parse(res,mappings):
    response = res
    for k,v in mappings.items():
        # print(mappings[k])
        uni_font = k + ';'
        # print(uni_font)
        if uni_font in response:
            respon = response.replace(uni_font,mappings[k])#重点在此!!!问题在此:此处想把网页返回的response.text的内容里 和加密字体相匹配的地方替换成正常的字,但是还是现实原先的加密字符。
            print(respon)

if __name__ == '__main__':
    url = 'http://www.dianping.com/shanghai/ch10'

    res = get_css_url(url)[1]
    svg_res = get_css_url(url)[2]
    rescc = request_svg_url(svg_res)
    rescc
    mappings = get_font_map()
    html_font_parse(res,mappings)


1.jpg这里应该上边我用 response.replace(uni_font,mappings[k])
应该是替换了的,但是返回的还是加密的。

2.jpg
这个是对应的字典。这些应该都没错,但就是原网页的替换不了怎么办啊。求大神给我指点迷津


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

代码没问题,代码逻辑有问题。

def html_font_parse(res, mappings):
    response = res
    for k, v in mappings.items():
        uni_font = k + ';'
        # 这块判断不判断无所谓 if
        response = response.replace(uni_font, mappings[k])
    print(response)
    return response

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...