前几天,有老铁留言说能不能VIP小说?-我回复说他是"坏人",因为我觉得他不尊重别人的劳动成果,如果是免费的,我倒可以考虑。
于是,我上网找呀找,搜呀搜,看有没有免费版,而且是大家都喜欢看的免费小说,爬下来,放在手机上看。经过终于让我找到了近几年特别火的、免费版的《盗墓笔记》。
6.1 爬取目标
用Chrome浏览器,打开http://seputu.com网址的那一刻,小伙伴们都惊呆了,第1部到第8部都有。爬取内容:把书名,章节名称,章节链接抽取出来,同时将每个文章的内容提取出来,保存成txt文件。将书名作为文件夹名称,将章节名称作为txt文件名。

6.2 节点定位
用F12查看源代码,你会发现htm的页面l结构非常分明,书名的html节点是// div[ @ class = "mulu-title"] / center / h2里面,章节节点的内容(章节名称和链接)是// div[ @ class = "box"] / ul标签中。Xpath规则挺简单的。
点击第1章节链接,进入详细页面,链接地址为:,页面详细内容分析,标题节点是在div.bg > h1的
里面,文章的内容节点是在div.bg > div.content > div.single-content > div > div.content里的
标签里面。Xpath的规则挺简单的。
6.3 爬小说
爬取小说内容有点多,编程不要急,理清思路,逐步实现功能。小说标题,作为文件夹名称。每章详细内容,存到对应的文件里面。在换页爬取时,暂停2秒钟,模拟真人点击链接的行为,否则会被认为是爬虫。
import requestsfrom requests.exceptions import RequestExceptionfrom lxml import etreefrom lxml.etree import ParseErrorimport timeimport os# 获取小说数据class Storybook: headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36" } def __init__(self, link): self.link = link def get_detail(self, title, section, href): try: # 创建文件 filename = title + "/" + section + ".txt" fd = open(filename, mode="w", encoding="utf-8") res = requests.get(href, headers=self.headers) # 解决乱码问题 res.encoding = 'utf-8' # 解析HTML文本内容 html = etree.HTML(res.text) contents = html.xpath('// div[ @ class = "content-body"] / p') for p in contents: data = p.text.strip() + "" fd.write(data) fd.close() except RequestException: print("请求服务器异常") except ParseError: print("数据解析错误") except IOError: print("创建文件夹失败") def get_page(self): try: res = requests.get(self.link, headers=self.headers) # 解析HTML文本内容 html = etree.HTML(res.text, etree.HTMLParser()) # 定位至需要的标签 titles = html.xpath('// div[ @ class = "mulu-title"] / center / h2') contents = html.xpath('// div[ @ class = "box"] / ul ') i = 0 for ul in contents: # 标题为文件夹名称 title = titles[i].text # 创建文件夹 os.mkdir(title) a_list = ul.xpath('li /a') for a in a_list: # 章节名称 section = a.text href = a.get("href") # 爬取小说详细内容 self.get_detail(title, section, href) # 暂停时间2秒,进入下一个详细内容 time.sleep(2) # 暂停2秒,进入下一章 time.sleep(2) i += 1 return None except RequestException: print("请求服务器异常") return None except ParseError: print("数据解析错误") return None except IOError: print("创建文件夹失败") return Noneif __name__ == '__main__': sb = Storybook("http://seputu.com") sb.get_page()
输出结果
好了,有关爬取小说的内容,老陈讲完了,如果觉得对你有所帮助,希望老铁能转发点赞,让更多的人看到这篇文章。你的转发和点赞,就是对老陈继续创作和分享最大的鼓励。
一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,可关注今日头条:老陈说编程。分享Python,前端(小程序)、App和嵌入式方面的干货。关注我,没错的。
#Python##网络爬虫##程序员##爬虫##盗墓笔记#