热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

「Python」纯干货,5000字的博文教你采集整站小说(附源码)

前言大家好我叫善念,这是我的第二篇技术博文(第一篇讲述的是自己的经历),连续三天更新了,每天花两小时写下一个实
前言

大家好我叫善念,这是我的第二篇技术博文(第一篇讲述的是自己的经历),连续三天更新了,每天花两小时写下一个实战案例,我也是乐在其中,谢谢大家对我的支持。

今天咱们要做的是利用Python爬取整个网站上的所有小说内容,其实在我心里面,采集什么内容根本无关紧要,最重要的是大家能学习到我的分析思路,授人以鱼不如授人以渔。


开始

既然是要采集整站数据,那么我们进入目标网站,点击全部作品。



分析(x0)

第一步右键一下查看网站源代码,看里面是否有咱们需要的书本源头文件地址(当然是看源头文件地址,因为一本书的内容这么大,然后一页有这么多本书,肯定不可能内容全部在源代码中)。

可以看到我在元素中可以找到书的名字和介绍,然后关键的是一个跳转的网址,这个网址很关键,因为咱们点击这个链接后他会跳到单本小说中。

而单本小说里面势必会有章节分类,而我们要做的肯定是需要把每本小说的章节名字也采集下来。

最终的目的就是,每本小说为一个文件夹,以书的名字命名,然后文件夹内保存所有章节,每一个章节为一个txt文档,没一个章节名与txt文件名对应。


分析(x1)

反转,切记不要以element作为源代码去考虑问题!!element可能是浏览器执行了一些Javascript后所展现的源码,与服务器传给浏览器的源代码是有所不同的。

所以咱们还是需要在源代码中找一找是否有跳转链接和书名。

好吧,源代码中也是有的。不过你们不能大意,一定要查看源代码中是否有,element代表不了源代码。

那么先采集一下第一页的书名和跳转链接咯

```
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流Q群号:928946953
群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
还有大牛解答!
```# 抓取第一页的所有书籍名字,书籍入口
# 到了书籍入口后,抓取章节名字,章节链接(文字内容)
# 保存
import requests
from lxml import etree
import os
url='https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')for bookname, tzurl in zip(booknames, tzurls):if not os.path.exists(bookname):# if os.path.exists(bookname) == False:os.mkdir(bookname) # 创建文件夹

这里对应着咱们的思路,每采集到一个书名就给它单独创建一个文件夹。

完全没问题,到这里咱们已经完成第一步了。


分析(x2)

那么接下来就是去模拟请求咱们采集到的书本目录的跳转链接,然后同样的方法去采集到章节名与章节内容的跳转链接了。

同样的你们自己查看下源代码,数据也是在里面的。

那就接着写代码咯

```
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流Q群号:928946953
群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
还有大牛解答!
```
import requests
from lxml import etree
import os
url = 'https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')for bookname, tzurl in zip(booknames, tzurls):if not os.path.exists(bookname):# if os.path.exists(bookname) == False:os.mkdir(bookname) # 创建文件夹req2 = requests.get("http:" + tzurl).texthtml1 = etree.HTML(req2)zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')for zjurl, zjname in zip(zjurls, zjnames):print(zjname+'\n'+zjurl)

效果图:


分析(x3)

知道这里为什么没有去把章节名字命名的txt文档保存在文件夹内吗?

因为咱们还没有获取到章节的内容呀,是不是需要先把章节内容写到章节的txt里面,然后再保存在文件夹内?

当然这句解释是为了照顾新手。

那么接下来采集章节内容,方法什么的不讲了, 一模一样的,章节内容同样在源代码中如上上图所示。

每一个标签只保存一行内容,那么就需要用到把采集到的所有内容都组合起来,并用换行符隔开,尽量保持文章格式。

代码走起:

```
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流Q群号:928946953
群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
还有大牛解答!
```
import requests
from lxml import etree
import os
url = 'https://www.qidian.com/all'
req = requests.get(url).text
html = etree.HTML(req)
booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')for bookname, tzurl in zip(booknames, tzurls):if not os.path.exists(bookname):# if os.path.exists(bookname) == False:os.mkdir(bookname) # 创建文件夹req2 = requests.get("http:" + tzurl).texthtml1 = etree.HTML(req2)zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')for zjurl, zjname in zip(zjurls, zjnames):print(zjname+'\n'+zjurl)req3 = requests.get('http:' + zjurl).texthtml2 = etree.HTML(req3)nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式内容nr = '\n'.join(nrs)file_name = bookname + "\\" + zjname + ".txt"print("正在抓取文章:" + file_name)with open(file_name, 'a', encoding="utf-8") as f:f.write(nr)

效果图:

这里要说明一下,咱们还只是抓取了第一页的数据。那么如何抓取整站的数据呢?


分析(x4)

一般稍微有经验的都知道一点,就是当我们翻页的时候,网站的url会发生变化,页码一般就是在url上面。

构建个for循环把页码数变为一个变量即可,无需多言,直接上最终的完整代码,代码仅供参考,你们最终可以自己去修改效果。


完整的代码

```
当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
学习Python中有不明白推荐加入交流Q群号:928946953
群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
还有大牛解答!
```import sys
import requests
from lxml import etree
import os
for i in range(sys.maxsize):url = f'https://www.qidian.com/all/page{i}/'req = requests.get(url).texthtml = etree.HTML(req)booknames = html.xpath('//div[@class="book-mid-info"]/h4/a/text()')tzurls = html.xpath('//div[@class="book-mid-info"]/h4/a/@href')for bookname, tzurl in zip(booknames, tzurls):if not os.path.exists(bookname):# if os.path.exists(bookname) == False:os.mkdir(bookname) # 创建文件夹req2 = requests.get("http:" + tzurl).texthtml1 = etree.HTML(req2)zjurls = html1.xpath('//ul[@class="cf"]/li/a/@href')zjnames = html1.xpath('//ul[@class="cf"]/li/a/text()')for zjurl, zjname in zip(zjurls, zjnames):print(zjname+'\n'+zjurl)req3 = requests.get('http:' + zjurl).texthtml2 = etree.HTML(req3)nrs = html2.xpath('//div[@class="read-content j_readContent"]/p/text()') # 分散式内容nr = '\n'.join(nrs)file_name = bookname + "\\" + zjname + ".txt"print("正在抓取文章:" + file_name)with open(file_name, 'a', encoding="utf-8") as f:f.write(nr)


我有话说

——女朋友就是私有变量,只有我这个类才能调用(纪念分手的第二周

emmm本来以前是录制过视频教程的,但是由于从上家公司离职后丢失了。在这里跟大伙说声抱歉。

但是文章的话是现写的,每篇文章我都会说得很细致,所以花费的python教程时间比较久,一般都是两个小时以上,每篇文章达到五千字左右。


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
author-avatar
我爱宝宝们小童鞋_244_571_742
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有