网址: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'