简单的网站小说爬取程序(通过直接模拟点击下一章、下一页等元素获取相应链接,简单修改就可以下载别的网站的小说),运行后打开网站,选取你喜欢的小说,打开小说的开始页面(小说内容页),复制网址(如:https://www.88xiaoshuo.net/Partlist/80415/60635 846.shtml)后粘贴到输入提示窗口回车即可。
[Python] 纯文本查看 复制代码
#coding=utf-8 import requests from lxml import etree import time import re headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363' } def get_chaptercontent(chapterurl=''): # 获取每个章节的内容并保存 markbook = '' while True: try: chaptercontent = '' response = requests.get(chapterurl, headers=headers, timeout=10) html=response.content.decode(response.apparent_encoding) selector = etree.HTML(html) bookname = selector.xpath('//a[@id="bookname"]/strong/text()')[0] chaptername = selector.xpath('//div[@class="zhangjieming"]/h1/text()')[0] # 章节名称 chaptername = re.sub(r'\d{1,5}\.', '', chaptername) # 去掉里面数字开头,点号结尾的数字 # mainurl=selector.xpath('//a[text()="章节目录"]/@href')[0] mainurl=f'{url[:-1]}' try: ###mark用于判断是否是要写章节名称,如果值是上一章,表示换章节要写章节名称,nexturl配合mainurl用于判断是否是最后页 markchapter = selector.xpath('//a[text()="上一章" or text()="上一页"]/text()')[0] # 注意空格 except: markchapter = '上一章' # 出现异常,即不存在上一章,赋值为目录页的网址供后面检测为最后的章节 # 注意空格 try: nexturl = selector.xpath('//a[text()="下一章" or text()="下一页"]/@href')[0] # 注意空格 nexturl=f'{mainurl}{nexturl}' except: nexturl = mainurl # 出现异常,即不存在下一章,赋值为目录页的网址供后面检测为最后的章节 contents = selector.xpath('//div[@id="content"]/p/text()') for content in contents: # 把每一段内容连接起来 chaptercontent = chaptercontent + '\n ' + str(content).strip() chaptercontent = "".join([s for s in chaptercontent.splitlines(True) if s.strip()]) # 去除字符串中的空行 # print(chaptercontent) if markbook == '': # 判断是否是下载的第一章,如果是则写入书名,实际上同时把书名更改为非空,之后不写书名 markbook = bookname print(f'\n正在爬取小说...{bookname}\n') with open(bookname + '.txt', 'w', encoding='utf-8') as f: f.write(f'\n\n书名:{bookname}') f.write(f'\n\n网址:{chapterurl}\n\n\n') if len(chaptername) != 0 and len(chaptercontent) != 0: if markchapter == '上一章': # 注意空格 print(f'\t正在爬取...{chaptername}') with open(bookname + '.txt', 'a+', encoding='utf-8') as f: f.write(f'\n\n{chaptername}\n\n') with open(bookname + '.txt', 'a+', encoding='utf-8') as f: f.write(chaptercontent) if nexturl[-10:] != 'index.html': # 判断是否是最后一页,按需修改 chapterurl = nexturl # time.sleep(0.2) # 可能有反爬,如果不延迟,部分章节取不到内容 continue else: print('\n下载完成!\n') break except: print(' ######异常,重试######') print(' ######出错,重试######') url='https://www.88xiaoshuo.net/' chapturl = input(f"请输入网站({url})内选定小说开始章节内容所在页网址:") if chapturl == '': chapturl='https://www.88xiaoshuo.net/Partlist/47835/170601831.shtml' start_time = time.time() get_chaptercontent(chapterurl=chapturl) end_time = time.time() print(f'总耗时:{end_time-start_time:.2f}秒')