爬虫css解密 大众点评

网址:http://www.dianping.com/beijing/ch10

代码:

"""
CSS加密:比较简单
    CSS ---> 层叠样式表,操作样式
    CSS都是对字体进行加密处理的,在网页源代码中显示[&#x+16进制数;]
    分析:
    1. 找到css加密文件即可
    @font-face是CSS中的一个模块,
    作用:可以将自定义的字体嵌入到网页中,让网页的字体不仅仅限定在WEB安全字体
    2. 从css文件中找到包含字体的woff文件
    有时候会出现多个woff,多个里面肯定会有一个或者几个woff文件是对网页的字体进行加密的。
    为什么会有多个?
    原因:
    1. 为了混淆分析者思路。
    2. 为了方便可以随时更换woff文件,更改woff文件后,页面中的16进制数同样发生变化

    解决方法:替换,需要我们生成一个字典{'16进制数':'对应的值'}

    步骤:
    1. 找到存放woff文件的css链接,并请求
    2. 找到woff文件的url,并请求(下载woff文件)
    3. 通过TTFont模块读取woff文件,得到16进制数
    4. 手动生成一个字典(作用:汉字和16进制数的对照表)
    5. 将页面中的16进制数替换成真实值
    6. 以上完成,css解密即可完成
"""
import requests,re
from fontTools.ttLib import TTFont

# 定义生成字典函数
def get_dict(url):
    # 对css链接发起请求
    response = requests.get(url=url,headers=headers)
    # 制定获取分类名规则
    type_name_patten = re.compile(r'"PingFangSC-Regular-(.*?)";')
    # 获取分类
    type_name_list = type_name_patten.findall(response.text)

    # 定义提取woff文件的规则
    woff_url_pattern = re.compile(r',url\("(.*?)"\)')
    # 获取woff链接
    woff_url_list = woff_url_pattern.findall(response.text)
    # 请求每一个woff文件
    for type_name,woff_url in zip(type_name_list,woff_url_list):
        # 拼接成完整的woff链接
        woff_url_full = 'http:'+woff_url
        # 获取文件名
        woff_name = woff_url_full.split('/')[-1]
        # 发起请求
        woff_response = requests.get(url=woff_url_full,headers=headers)
        # 保存文件
        # 注意:woff文件不是文本类型,是二进制的数据
        with open(type_name+'-'+woff_name,'wb') as fp:
            fp.write(woff_response.content)

        # 读取文件
        woff_font = TTFont(type_name+'-'+woff_name)

        # 保存xml格式数据
        # woff_font.saveXML('woff.xml')

        # 获取16进制数
        woff_font_content = woff_font.getGlyphOrder()
        # 去除前面两个内容
        keys = woff_font_content[2::]
        data = {
   }
        for k,v in zip(keys,woff_list):
            data[k] = v
        type_dic[type_name] = data
# 定义函数
def get_content():
    # 发起请求,接收响应
    response = requests.get(url=base_url,headers=headers)
    # 获取页面内容
    content = response.text
    # 提取css链接
    # 指定提取css链接规则
    css_href_pattern = re.compile(r'href="(//s3plus.*?)"')
    css_href = css_href_pattern.findall(content)[0]
    # 拼接完整链接
    css_full_href = 'http:' + css_href
    get_dict(css_full_href)
    # 开始替换
    # for k,v in data.items():
    #     # 替换
    #     content = content.replace('&#x'+k[-4::]+';',v)

    # 获取评价及人均价格
    get_shopNum(content)
    print(type_dic)
# 定义获取评价和人均价格的函数
def get_shopNum(content):
    shopNum  = type_dic['shopNum']
    # 开始替换
    for k,v in shopNum.items():
        # 替换
        content = content.replace('&#x'+k[-4::]+';',v)
    print(content)
    ...


if __name__ == '__main__':
    # type_dic = {'tagName':{'16进制数':'值'},'shopNum':{'16进制数':'值'},'address':{16进制数:值},'reviewTag':{16进制数:值}}
    type_dic = {
   }
    # 定义基础URL
    base_url = 'http://www.dianping.com/beijing/ch10'
    # 定义请求头字典
    headers = {
   
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
    }
    # 定义woff_list
    woff_list = ['1', '2', '3'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值