爬虫字体替换(二)起点

1、在抓取起点中文网的小说信息时,发现网站把一些数字都转换成 其他的东西,如《圣墟》。
爬虫字体替换(二)起点_第1张图片
查看网页源代码,发现如点击、推荐、总字数等的信息全是类似这样的,是一组十进制数据:
在这里插入图片描述
爬虫字体替换(二)起点_第2张图片
2、思路

方式一:
1、需要获取字体文件所在的url,通过抓包获取所有字体文件,然后和网页源代码中展示的字体(@font-face: src:url(xxx.woff))进行对比,确认当前页面是同的是哪一个字体文件。
2、将字体文件.woff转化成.xml文件(pip install fontTools 这个包可以静.woff转化成.xml文件)
3、分析xml文件中内容,找到数字0-9分别对应什么内容:发现网页源代码中的十进制数据和xml文件中的中name的值是对应的,先获取十进制,在转化为十六进制,再根据十六进制的name的值"one"转换为1即可。
方式二:
起点中文网中字体的文件名是变化的,但是从源代码里面获取的数字和真实数字的关系是不变的。直接用字典将位置数字和真实数字表示出来。

3、具体思路:

①先定义表示英文单词的数字和阿拉伯数字之间的对应关系。
②请求网页源代码,提取出字体文件的url(即http://xxx.woff),以及所有表示小说字数的十进制数据(& #100064;)
③将data这个十进制数据组成的字符串(& #100444;& #100444;& #100437;& #100438;& #100439;& #100445;)中的每一个十进制都转换成为十六进制。
④请求字体文件的url,获取字体文件的内容。 ⑤将本地保存的qd.woff转化为qd.xml文件
⑥根据十六进制的列表,从xml文件中根据code的值获取map标签。解析xml标签结构。

不附上代码的分析都是耍流氓,代码附上:

# 1.先定义表示英文单词的数字和阿拉伯数字之间的对应关系
convert_dict = {
    'one': '1',
    'two': '2',
    'three': '3',
    'four': '4',
    'five': '5',
    'six': '6',
    'seven': '7',
    'eight': '8',
    'nine': '9',
    'period': '.',
    'zero': '0'
}

# 2、请求网页源代码,提取出字体文件的url(http://xxx.woff),以及所有表示小说字数的十进制数据(𘛠)
url = 'https://book.qidian.com/info/1004608738'

response = requests.get(url, headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'})
font_url = re.search(re.compile(r"@font-face.*?src.*?src: url\('(.*?)'\)", re.S), response.text).group(1)
data = re.search(re.compile(r'
.*?

.*?.*?(.*?)', re.S), response.text).group(1) # 3、将data这个十进制数据组成的字符串(𘡜𘡜𘡕𘡖𘡗𘡝)中的每一个十进制都转换成为十六进制。 num_list = [] number = data.split(';') for num in number: if num: # %x:十六进制占位符 res = '%x' % int(num.strip('&#')) num_list.append(res) print(font_url, num_list) # 4、请求字体文件的url,获取字体文件的内容。 font_response = requests.get(font_url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}).content with open('qd.woff', 'wb')as f: f.write(font_response) f.close() # 5、将本地保存的qd.woff转化为qd.xml文件 f = TTFont('qd.woff') f.saveXML('qd.xml') # 6、根据十六进制的列表,从xml文件中根据code的值获取map标签。解析xml标签结构。 from xml.etree import ElementTree # 获取xml文件中的根节点(文档树对象) root_obj = ElementTree.parse('qd.xml').getroot() # 在root_obj的基础上,开始查找标签 # find()类似于selenium中的find() maps_element = root_obj.find('cmap').find('cmap_format_12').findall('map') # 遍历maps_element这个列表,里面保存的全部都是这样的对象。 map_ele_dic = {} for map_ele in maps_element: # 取出map标签内的code和name属性的值 # 以coder为键,name为值保存在字典map_ele_dic map_ele_dic[map_ele.attrib['code'].replace('0x', '')] = map_ele.attrib['name'] # 7、xml解析完毕,会得到如下数据: # a>网页源代码数据['187b2', '187b2', '187b1', '187b4', '187ae', '187b7'] # b>字体文件xml中的数据{'187ae': 'six', '187b0': 'three', '187b1': 'one', '187b2': 'four', '187b3': 'nine', '187b4': 'period', '187b5': 'zero', '187b6': 'eight', '187b7': 'five', '187b8': 'seven', '187b9': 'two'} # 接下来,将源代码数据遍历 result = '' for number in num_list: # 从字典中取出对应的one,two... english_number = map_ele_dic[number] # 再以one,two...为键,从字典convert_dict中取出阿拉伯数字 alb_num = convert_dict[english_number] result += alb_num print(result)

对比原网页字数和我们得出的结果,发现一致。此处仅提取了总字数做替换,其他信息望自行尝试。
爬虫字体替换(二)起点_第3张图片
爬虫字体替换(二)起点_第4张图片
O(∩_∩)O~
在这里插入图片描述

你可能感兴趣的:(爬虫,学习笔记)