import requestsimport osimport jsonfrom lxml import etreeimport pandas as pdimport time# 导入字体解密模块from fontTools.ttLib import TTFont'''小说数据的爬取及其数据化分析'''results = { 'title': [], # 文章标题 'author': [], # 小说作者 'classifies': [], # 小说类别 'describes': [] # 小说的描述 # 'detail': [], # 文章详情地址 # 'wordcount': [] # 文字统计}class novel: def __init__(self, value): self.header = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4464.5 Safari/537.36', } self.page = value self.url = 'https://www.qidian.com/rank/recom?dateType=1&page={}'.format(self.page) self.foreach(value) # 页面请求 def dataAnalysis(self): res = requests.get(self.url, headers=self.header).text return res # 页面解析 def etreehtml(self): # 使用etree.Html方法 lists = etree.HTML(self.dataAnalysis()) # print(lists) content = lists.xpath('//*[@id="rank-view-list"]/div/ul/li') return content # self.dataAnalysis() # 对加密字体进行解密处理 def decodeTtf(self): font = TTFont('UdygXvZa.ttf') font.saveXML('fft.xml') # 获取字体映射关系 font_cmap = font['cmap'].getBestCmap() print(font_cmap) # 对数据进行遍历分析 def foreach(self,value): for i in self.etreehtml(): # 小说标题 title = i.xpath('./div[2]/h4/a/text()')[0].replace('\n', '') results['title'].append(title) # 小说作者 author = i.xpath('./div[2]/p[1]/a[1]/text()')[0].replace('\n', '') results['author'].append(author) # 小说类别 classifies = i.xpath('./div[2]/p[1]/a[2]/text()')[0].replace('\n', '') results['classifies'].append(classifies) # 小说描述 describes = i.xpath('./div[2]/p[2]/text()')[0].replace(" ", '').replace('\n', '').replace('\t', '').replace('\r', '') results['describes'].append(describes) print('第%s个页面已爬取完成------' % value) def buildcsv(self): # 创建表格 df = pd.DataFrame(results) # 将解码方式改为ANSI 打开可以解决中文乱码的问题 df.to_csv('qidian1.csv', encoding='utf8') print('------表格数据创建完成!!!') # # 文章详情页面 # detail = i.xpath('./div[3]/p/a[1]/@href')[0].replace('\n', '') # 将获取到的换行数据取消,并且导入到新的数组中 # results['detail'].append(detail) # # print(results) # # 进入子页面对页面的数据进行爬取遍历分别爬取 # print(results['detail']) # for i in results['detail']: # url = 'https:%s' % i # res = requests.get(url, headers=self.header).text # # 对子页面进行解析 # childPage = etree.HTML(res) # # numcount = childPage.xpath('/html/body/div/div[6]/div[1]/div[2]/p[3]/em') # # 字数tongj # wordcount = childPage.xpath('/html/body/div/div[6]/div[1]/div[2]/p[3]/em[1]/span/text()') # # 将字数统计加入到wordcounts当前数组中 # results['wordcount'].append(wordcount) # print(results['wordcount'])if __name__ == '__main__': # 也可以使用for i range(1,6) 将所有的数据爬取出来 # novel(value=input('请输入爬取的页面1-5:')) # 选择单页爬取或者多页爬取 for a in range(1, 6): p = novel(str(a)) time.sleep(1.5) print("------开始创建表格信息") p.buildcsv()