获取数字(fontTools)...举个栗子
起点中文网的例子撒...
# pip install fontTools 是用于将woff这种字体文件转化成XML文件
# 1.每次都刷新字体font-face文件:https://qidian.gtimg.com/qd_anti_spider/XnXLddDL.woff,所以每次请求,都需要取截取这个字体文件的url地址(url一直在变)。
# 2.请求这个地址,将这个字体文件下载到本地,然后将.woff文件转化成.xml文件。
# 3.去页面的源代码中提取字符串(十进制的编码): 𘜐𘜑𘜑𘜎𘜏𘜏
# 4.将100112/100113这些十进制编码的数据转化成十六进制的数据;
# 5.根据这个十六进制的数据从xml文件中找到对应的map对象,提取map的name属性,然后再根据name属性的值,从number_dict中提取对应的值。
=====================================================================
点开之后可以看到--->
==============================================================
from fontTools.ttLib import TTFont
number_dict = {
'period': '.',
'zero': '0',
'one': '1',
'two': '2',
'three': '3',
'four': '4',
'five': '5',
'six': '6',
'seven': '7',
'eight': '8',
'nine': '9',
}
url = 'https://book.qidian.com/info/1010734492'
import requests, re
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0'})
# 拿到下载字体的网址
# @font-face.*?src: url.*?src: url(.*?) format('woff'),
content = re.search(re.compile(r"@font-face.*?src: url.*?src: url(.*?)format.*?,", re.S), response.text)
# ('https://qidian.gtimg.com/qd_anti_spider/yMxThZoL.woff')
font_url = content.groups()[0].strip("( | )").strip("'")
print(font_url)
font_content = requests.get(font_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0'}).content
with open('qidian_lx.woff', 'wb') as f:
f.write(font_content)
font1 = TTFont('qidian_lx.woff')
font1.saveXML('qidian_lx.xml')
# 源码中提取十进制数据:
data = re.findall(re.compile(r'<div class="book-info ">.*?<p>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>', re.S), response.text)[0]
print(data) # ('𘜸𘜹𘜹𘜶𘜽𘜽', '𘜽𘜽𘜲𘜽𘜶𘜺', '𘜲𘜸𘜶𘜽𘜷', '𘜻𘜴𘜻𘜶𘜵𘜺')
four_list = []
# 遍历这四组数据
for d in data:
# print(d) # 拿到元组中的一个 𘜸𘜹𘜹𘜶𘜽𘜽
one_list = []
d = d.split(';') # 去除分号
# 遍历每组数据
for x in d:
res = x.replace('&#', '')
if res: # 判断是否有空格有的话不转化
# 将res十进制转化成16进制
a = int(res) # 先转化成int类型
r = '%x' %a
one_list.append(r)
four_list.append(one_list)
print('----', four_list)
# 解析xml
import xml.etree.ElementTree as et
root = et.parse('qidian_lx.xml').getroot()
# 找到map那一堆标签(PyQuery)
map_ele = root.find('cmap').find('cmap_format_12').findall('map')
# print(map_ele)
map_dict = {}
# 把map那一堆数据存到字典中
for m in map_ele:
# print(help(m))
code = m.attrib['code'].replace('0x', '')
map_dict[code] = m.attrib['name'] # code是键, name是值
print(map_dict)
# 遍历含有四组数据的列表
for one in four_list:
two_string = ""
# 遍历每一组数据
for a in one:
if a in map_dict:
number = map_dict[a] # 找到对应的键
number = number_dict[number] # 通过键找到对应的值
two_string += number
print(two_string)