1 """
2 起点中文网,在“数字”上设置了文字反爬,使用了自定义的文字文件ttf3 浏览器渲染不出来,但是可以在网页源代码中找到映射后的数字4 正则爬的是网页源代码 xpath是默认utf-8解析网页数据;网页源代码有数据,使用浏览器"检查"是方框,用xpath爬出来的也是方框5 以小说《斗罗大陆》为例 https://book.qidian.com/info/11152776 """
7 importrequests, time, re, pprint8 from fontTools.ttLib importTTFont9 from io importBytesIO10 from lxml importetree11
12 #此代码使用bs和xpath均无法爬出,需使用正则匹配
13 #selector = etree.HTML(html_data.text)
14 #word1 = selector.xpath('//div[2]/div[6]/div[1]/div[2]/p[3]/em[1]/span/text()')
15
16 defget_font(url):17 """
18 获取源代码中数字信息与英文单词之间的映射关系19 :param url: 网页源代码中的字体地址20 :return: 网页字体映射关系21 """
22 time.sleep(1)23 response =requests.get(url)24 font =TTFont(BytesIO(response.content))25 web_font_relation =font.getBestCmap()26 font.close()27 returnweb_font_relation28
29
30 #在fontcreator中查看此ttf文件中英文单词与阿拉伯数字的映射关系,写入字典
31 python_font_relation ={32 'one':1,33 'two':2,34 'three':3,35 'four':4,36 'five':5,37 'six':6,38 'seven':7,39 'eight':8,40 'nine':9,41 'zero':0,42 'period':'.'
43 }44
45 defget_html_info(url):46 """
47 解析网页,获取文字文件的地址和需要解码的数字信息48 :param url: 需要解析的网页地址49 :return: 文字文件ttf的地址50 反爬的数字,一维列表51 """
52 headers ={53 'User-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
54 }55 html_data = requests.get(url, headers=headers)56 #获取网页的文字ttf文件的地址
57 url_ttf_pattern = re.compile('',re.S)58 fonturl =re.findall(url_ttf_pattern,html_data.text)[0]59 url_ttf = re.search('woff.*?url.*?\'(.+?)\'.*?truetype', fonturl).group(1)60
61 #获取所有反爬的数字
62 word_pattern = re.compile('(.*?)', re.S)#制定正则匹配规则,匹配所有标签中的内容
63 numberlist =re.findall(word_pattern, html_data.text)64
65 returnurl_ttf,numberlist66
67
68 defget_encode_font(numberlist):69 """
70 把源代码中的数字信息进行2次解码71 :param numberlist: 需要解码的一维数字信息72 :return:73 """
74 data =[]75 for i innumberlist:76 fanpa_data = ''
77 index_i =numberlist.index(i)78 words = i.split(';')79 #print('words:',words)
80 for k in range(0,len(words)-1):81 words[k] = words[k].strip('')82 #print(words[k])
83 words[k] =str(python_font_relation[web_font_relation[int(words[k])]])84 #print(words[k])
85 fanpa_data +=words[k]86 #print(fanpa_data)
87 data.append(fanpa_data)88 print(data[0],'万字')89 print(data[1], '万阅文总点击')90 print(data[2], '万会员周点击')91 print(data[3], '万总推荐')92 print(data[4], '万周推荐')93 #return data
94
95 """程序主入口"""
96 if __name__=='__main__':97 url = 'https://book.qidian.com/info/1115277' #选取某一小说
98 get_html_info(url)99 web_font_relation =get_font(get_html_info(url)[0])100 pprint.pprint(web_font_relation)#格式化打印网页文字映射关系
101 get_encode_font(get_html_info(url)[1])