博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬虫实战—笔趣看小说网
阅读量:3943 次
发布时间:2019-05-24

本文共 4973 字,大约阅读时间需要 16 分钟。

一、实战背景

笔趣看小说网站:

本站所有小说为转载作品,所有章节均由网友上传,转载至本站只是为了宣传本书让更多读者欣赏。

工具:Python3.7,PyCharm

程序所需用到的模块:requests,fake_useragent,parsel,docx,time

所使用的解析器:xpath

二、明确目标

明确我们需要爬取哪部小说。这里我以《斗破苍穹》为例。

2.1 分析我们需要爬取的数据

image.png

作者、分类、状态、字数、更新时间和简介

文章从正文卷开始,获取每一章的章节名称和链接

2.2 分析节点,按F12打开浏览器的开发者工具

image.png

每一章的详情内容

image.png

2.3 使用xpath解析器审查元素

image.png

image.png

三、编写代码

"""    Python爬取 https://www.biqukan.com/ 小说网的斗破苍穹小说"""import requestsfrom fake_useragent import UserAgentimport parselfrom docx import Documentimport timeclass BiQuKanDownloader(object):    """    类说明:下载《笔趣看》小说网小说《斗破苍穹》    """    def __init__(self):        self.server = "https://www.biqukan.com/"        self.target = "https://www.biqukan.com/3_3037/"        self.file = "F:\Python\爬虫资源\斗破苍穹\斗破苍穹.docx"        self.article_names = []  # 存放章节名称        self.article_urls = []  # 存放章节链接        self.article_nums = 0  # 章节数        self.headers = {
"User-Agent": UserAgent().random} # 生成随机的请求头 self.doc = Document() def article_introduction(self): """ 函数说明:文章简介 :return: """ """ 请求网页 """ response = requests.get(url=self.target, headers=self.headers) response.encoding = 'gbk' html = response.text """ 解析网页 """ selector = parsel.Selector(html) article_author = selector.xpath('.//div[@class="info"]/div[@class="small"]/span[1]/text()').get() # 作者 article_type = selector.xpath('.//div[@class="info"]/div[@class="small"]/span[2]/text()').get() # 类型 article_status = selector.xpath('.//div[@class="info"]/div[@class="small"]/span[3]/text()').get() # 状态 article_docs = selector.xpath('.//div[@class="info"]/div[@class="small"]/span[4]/text()').get() # 字数 article_updateTime = selector.xpath('.//div[@class="info"]/div[@class="small"]/span[5]/text()').get() # 更新时间 article_introduction = selector.xpath('.//div[@class="info"]/div[@class="intro"]/text()[1]').get() # 简介 """ 保存到文件 """ self.doc.add_heading("小说简介", level=1) self.doc.add_paragraph(article_author) self.doc.add_paragraph(article_type) self.doc.add_paragraph(article_status) self.doc.add_paragraph(article_docs) self.doc.add_paragraph(article_updateTime) self.doc.add_paragraph(article_introduction) self.doc.save(self.file) def get_download_url(self): """ 函数说明:获取目标下载链接并解析章节名称和链接,再添加到列表中 :return: """ """ 请求网页 """ response = requests.get(url=self.target, headers=self.headers) response.encoding = 'gbk' html = response.text """ 解析网页 """ # 转化数据类型 selector = parsel.Selector(html) # 提取所有的
标签 article_list = selector.xpath('//div[@class="listmain"]/dl/dd') # 删除不必要的章节目录,并统计章节数[也就是从正文卷开始统计] self.article_nums = len(article_list[12:]) for chapter in article_list[12:]: # 解析章节名称和链接 article_name = chapter.xpath('.//a/text()').get() article_url = chapter.xpath('.//a/@href').get() # 将章节名称和链接添加到列表中 self.article_names.append(article_name) self.article_urls.append(self.server + article_url) def get_article_content(self, target_url): """ 函数说明:获取章节正文内容 :param target_url: 每章的 url地址 :return: """ """ 请求网页 """ response = requests.get(url=target_url, headers=self.headers) response.encoding = 'gbk' html = response.text """ 解析网页 """ # 转化数据类型 selector = parsel.Selector(html) # 解析文章正文内容 article_content_list = selector.xpath('.//div[@class="showtxt"]/text()').getall() article_content = " " for text in article_content_list: if '\r' in article_content_list: article_content_list.remove(text) article_content += text.strip() + "\n" return article_content def writer(self, path, name, text): """ 将爬取的文章写入文件 :param path: 保存文件的路径 :param name: 文章的名称 :param text: 文章的内容 :return: """ # with open(path, 'a', encoding='utf-8') as file: # file.write(name) # file.writelines(text) # file.write('\n\n') self.doc.add_heading(name, level=1) self.doc.add_paragraph(text) self.doc.add_paragraph("\n") self.doc.save(path) print(name + "\t\t已下载", end=" ")if __name__ == '__main__': print("<<<<<=====斗破苍穹开始下载=====>>>>>") dl = BiQuKanDownloader() dl.get_download_url() dl.article_introduction() print("小说章节数:" + str(dl.article_nums)) for i in range(dl.article_nums): text = dl.get_article_content(dl.article_urls[i]) dl.writer(dl.file, dl.article_names[i], text) print("\t\t总体下载进度: %.2f%%" % float(i / dl.article_nums)) time.sleep(1) print("<<<<<=====斗破苍穹下载完成=====>>>>>")

这里使用的gbk编码格式,是因为小说网站文章内容为gbk编码的格式

在浏览器的开发者工具控制台中输入:doucument.charset 可查看编码格式

image.png

四、效果展示

image.png

image.png

做一个文明守法的好网民,不要爬取公民的隐私数据,不要给对方的系统带来不必要的麻烦

此篇博客仅作学习用途

你可能感兴趣的文章
Java的反射机制
查看>>
SpringCloud微服务应用入门
查看>>
SpringCloud之session共享
查看>>
Springboot集成Shiro实现认证
查看>>
Spring、Spring MVC和MyBatis编程式集成示例
查看>>
在Springboot应用使用redis缓存
查看>>
Spring入门
查看>>
Idea提示键和热部署配置以及git使用
查看>>
Deepin+Vscode搭建vue.js项目及Git操作
查看>>
基于Spring Security前后端分离式项目解决方案
查看>>
Vue3.0+Vite2.0项目框架搭建(一)
查看>>
Vue3.0+Vite2.0项目框架搭建(二)- 引入axios
查看>>
Vue3.0+Vite2.0项目框架搭建(三)- 引入Element3
查看>>
使用Vue CLI v4.5(+)搭建Vue3.0项目框架搭建
查看>>
Java集合框架
查看>>
线程协作与生产者消费者问题
查看>>
Vue入门
查看>>
非starter方式实现springboot与shiro集成
查看>>
Starter方式实现Springboot与Shiro集成
查看>>
移动端多页面应用(MPA)的开发(一)
查看>>