运行后会在运行的目录下面建立一个建立一个笔趣阁的目录,小说会一每个目录分类,每部小说的章节都会在对应的小说目录里面
import time import requests from lxml import etree import os novel_name = "笔趣阁" novel_length = 0 def main(): getContents() get_novel_length() get_data() def get_data(): for i in range(novel_length): # 获取到一部小说的链接和名字 href_name = get_href_name(index=i) # 一部小说的链接 href = href_name[0] # 一部小说的名字 name = href_name[1] # 网页返回的内容 html = getHtml(url=href) # 整部小说的章节链接和名字 lists = link_title(html=html) for j in range(len(lists)): # 将要爬取的章节链接 link = lists[j][0] # 将要爬取的章节名字 title = lists[j][1] to_link = "https://www.xbiquge.la" + link # 章节内容网页返回的内容 novel_html = getHtml(to_link) store_novel(novel_html=novel_html, name=name, title=title) time.sleep(1) def store_novel(novel_html, name, title): """ 这个存储的流程是,先将服务器返回回来的信息储存到本地,或许你会问为什么要多次一举? 因为不做储存我取不到里面正文的内容,只能取到最后一段,所以我就先将它存放到本地然后读取出来 请出来之后在笔趣阁这个目录下建立一个以小说名为名称的目录,再将小说章节的内容放在这个目录下面 :param novel_html: 服务器放回的章节信息 :param name: 爬取的小说名字 :param title: 爬取的小说章节名 :return: """ # 将传输过来的 HTML 信息保存起来 with open(f"{novel_name}/novel.html", "w", encoding="utf-8") as f: f.write(novel_html) # 在主目录小判断有没有小说的目录,如果没有就创建 if not os.path.exists(f"{novel_name}/{name}"): # 创建一个以小说名为名称的目录 os.mkdir(f"{novel_name}/{name}") with open(f"{novel_name}/novel.html", "r", encoding="utf-8") as f: html = f.read() xml = etree.HTML(html) content = xml.xpath('//div[@id="content"]/text()') with open(f"{novel_name}/{name}/{title}.txt", "a", encoding="utf-8") as f: for result in content: f.write(f"{result.strip()}\n") print(f"{name}\t{title} 爬取完成>>>") def link_title(html): """ 这个函数是用来提取出每一部小说中的章节链接和名字的 :param html: 网页返回的内容 :return: 章节名字和链接 """ # 创建一个列表用来储存整部小说的章节链接和名字 lists = [] xml = etree.HTML(html) dd_list = xml.xpath('//div[@id="list"]/dl/dd') for data in dd_list: # 创建一个临时列表,用来存放单个章节的链接和名字 temp_list = [] # 提取章节链接 link = data.xpath('./a/@href') temp_list.append(str(link[0])) # 提取章节名字 title = data.xpath('./a/text()') temp_list.append(str(title[0])) lists.append(temp_list) return lists def get_href_name(index): """ 返回指定的链接和小说名字 :param index: 第几条数据 :return: 返回读取到的链接和名字 """ with open(f"{novel_name}/biqvge.txt", "r", encoding="utf-8") as f: data = f.readlines() href_name = data[index].split() return href_name def get_novel_length(): """ 获取笔趣阁文件中的链接有多少条 """ global novel_length with open(f"{novel_name}/biqvge.txt", "r", encoding="utf-8") as f: length = len(f.readlines()) novel_length = length def getContents(): """ 这个函数用来做储存处理,创建笔趣阁的目录,然后将小说的名字和链接保存起来 """ # 创建一个列表用来储存整个页面的信息 lists = [] url = "https://www.xbiquge.la/xiaoshuodaquan/" html = getHtml(url=url) xml = etree.HTML(html) li_list = xml.xpath('//div[@id="main"]/div/ul/li') for li in li_list: # 创建一个临时列表,用来储存单个信息的元素,例如小说的名字和链接 temp_list = [] # 找出小说的名字 title = li.xpath('./a/text()') temp_list.append(str(title[0])) # 找出小说的链接 href = li.xpath('./a/@href') temp_list.append(str(href[0])) # 追加到大列表中 lists.append(temp_list) # 判断笔趣阁目录是否存在,不存在则创建 if not os.path.exists(novel_name): print(f"没有“{novel_name}”这个目录,正在为你创建>>>>>") os.mkdir("笔趣阁") print("创建成功>>>>>") # 将信息保存起来,链接在前名字在后 with open(f"{novel_name}/biqvge.txt", "a", encoding="utf-8") as f: for data in lists: f.write(f'{data[1]} {data[0]}\n') print("储存成功") def getHtml(url): """ 由于笔趣阁的请求不需要请求头,所以就没有添加多余的头部信息 :param url: 请求的连接 :return: 返回请求后的处理内容 """ response = requests.get(url) html = response.content.decode("utf-8") return html if __name__ == '__main__': main()