No.078-药房网商品价格解密
评论
收藏

No.078-药房网商品价格解密

经验分享
云潮
2024-09-04 19:45·浏览量:905
云潮
发布于 2024-09-04 17:50更新于 2024-09-04 19:45905浏览

网站:https://www.yaofangwang.com/medicine/646305/

问题背景:

药房网商品详情页的价格直接从网页上复制是“乱码”,使用影刀通过捕获元素或者是网页监听等形式取数也是乱码。那么如何获取正确的价格呢?

解决思路:

1.F12搜索字体,发现这里有个响应这里有个字体文件,很明显是通过这个字体解密的

2.通过监听下载字体文件,将TTF文件转成XML文件

from fontTools.ttLib import TTFont
font = TTFont(r"xxxxxx\font.ttf")
xml_font = font.saveXML(r"xxxxx\font.ttf.xml")

3.找规律 这里可以看到对应关系

数字:0-->ID:

数字:1-->ID:2

数字:2-->ID:3

#根据找到的对应关系,构建解密字典
from fontTools.ttLib import TTFont
def decode_dict(font_path):
    font = TTFont(font_path)
    # 获取字形名称列表
    glyph_order = font.getGlyphOrder()
    #print(glyph_names)
    new_dict={}
    # 遍历字形名称列表,打印ID和名称
    for i, name in enumerate(glyph_order):
        if i>=1 and i<=10:
            #print(f"Glyph ID: {i}, Name: {name}")
            new_dict[name]=str(i-1)
            #数字5特殊处理
            if name=="uni0ECC":
                new_dict["uni1ECC"]=str(i-1)
    #print(new_dict)
    return new_dict

4.根据对应关系替换

解密字典: {'uniD6C2': '0', 'uni31ED': '1', 'uni9F43': '2', 'uni398D': '3', 'uni9220': '4', 'uni0ED3': '5', 'uni5B02': '6', 'uni69E5': '7', 'uniB899': '8', 'uniD0AC': '9'}

   4.1网页展示的数据:

   4.2获取元素文本信息的数据

       ㇭㦍.킬훂

   4.3将以上乱码转成十六进制字符串:hex(ord())

        0x31ed 0x398d 0x2e 0xd0ac 0xd6c2

   4.4将0x替换成uni

        uni31ed uni398d uni2e unixd0ac unid6c2

   4.5依据解密字典还原数据

        13.90

def decode_text(web_element_attribute,decode_dict):
    list_text=[]
    for i in range(0,len(web_element_attribute)):
        print(web_element_attribute[i])
        code=str(hex(ord(web_element_attribute[i])))
        print(code)
        code=code.upper().replace("0X","") 
        code="uni"+'0' * (4-len(code))+code
        key_list=decode_dict.keys()
        if code in key_list:
            list_text.append(decode_dict[code])
        else:
            list_text.append(web_element_attribute[i])
    return "".join(list_text)  

注意事项: 该网站比较特殊,每次加载数据,网站都会更新字体文件,所以排序,翻页这些动作之后需要重新获取解密字典

演示视频:

收藏4
全部评论1
最新
发布评论
评论