笔趣看是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更新速度。并且该网站只支持在线浏览,不支持小说打包下载。所以可以通过python爬取文本信息保存,从而达到下载的目的

以首页的《一念永恒》作为测试:

1、先查看第一章地址中的html文本:https://www.biqukan.com/1_1094/5403177.html

通过requests库获取:

# -*- coding:UTF-8 -*-
import requestsif __name__ == '__main__':target = 'http://www.biqukan.com/1_1094/5403177.html'req = requests.get(url=target)print(req.text)

运行代码,可以看到如下结果:(获取到他的html文本,你可以通过chrome审查元素来对照)

可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。

Beautiful Soup
爬虫的第一步,获取整个网页的HTML信息,我们已经完成。接下来就是爬虫的第二步,解析HTML信息,提取我们感兴趣的内容。对于本小节的实战,我们感兴趣的内容就是文章的正文。提取的方法有很多,例如使用正则表达式、Xpath、Beautiful Soup等。对于初学者而言,最容易理解,并且使用简单的方法就是使用Beautiful Soup提取感兴趣内容。

Beautiful Soup的安装方法和requests一样(我安装的是3.7版本):

pip3 install beautifulsoup4
Beautiful Soup中文的官方文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/

通过google chrome中审查元素方法,查看一下我们的目标页面,你会看到如下内容:

可以看到文本内容都放置在<div id=“content”, class=“showtxt”>这个标签中 ,这样就可以开始通过库来获取这个标签中的内容:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":target = 'http://www.biqukan.com/1_1094/5403177.html'req = requests.get(url = target)bf = BeautifulSoup(req.text)#查询所有div标签,并且class为'showtxt'texts = bf.find_all('div', class_ = 'showtxt') print(texts)

获取到如下内容:


我们可以看到,我们已经顺利匹配到我们关心的正文内容,但是还有一些我们不想要的东西。比如div标签名,br标签,以及各种空格。怎么去除这些东西呢?我们继续编写代码:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":target = 'http://www.biqukan.com/1_1094/5403177.html'req = requests.get(url = target) html = req.textbf = BeautifulSoup(html)texts = bf.find_all('div', class_ = 'showtxt')#replace(‘\xa0’*8,’\n\n’)就是去掉八个空格符号,并用回车代替print(texts[0].text.replace('\xa0'*8,'\n\n'))

find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(‘\xa0’*8,’\n\n’)就是去掉下图的八个空格符号,并用回车代替:

程序运行结果如下:

我们已经顺利获得了一个章节的内容,要想下载正本小说,我们就要获取每个章节的链接。我们先分析下小说目录:

通过审查元素,我们发现可以发现,这些章节都存放在了class属性为listmain的div标签下,选取部分html代码如下:

<div class="listmain">
<dl>
<dt>《一念永恒》最新章节列表</dt>
<dd><a href="/1_1094/15932394.html">第1027章 第十道门</a></dd>
<dd><a href="/1_1094/15923072.html">第1026章 绝伦道法!</a></dd>
<dd><a href="/1_1094/15921862.html">第1025章 长生灯!</a></dd>
<dd><a href="/1_1094/15918591.html">第1024章 一目晶渊</a></dd>
<dd><a href="/1_1094/15906236.html">第1023章 通天道门</a></dd>
<dd><a href="/1_1094/15903775.html">第1022章 四大凶兽!</a></dd>
<dd><a href="/1_1094/15890427.html">第1021章 鳄首!</a></dd>
<dd><a href="/1_1094/15886627.html">第1020章 一触即发!</a></dd>
<dd><a href="/1_1094/15875306.html">第1019章 魁祖的气息!</a></dd>
<dd><a href="/1_1094/15871572.html">第1018章 绝望的魁皇城</a></dd>
<dd><a href="/1_1094/15859514.html">第1017章 我还是恨你!</a></dd>
<dd><a href="/1_1094/15856137.html">第1016章 从来没有世界之门!</a></dd>
<dt>《一念永恒》正文卷</dt> <dd><a href="/1_1094/5386269.html">外传1 柯父。</a></dd>
<dd><a href="/1_1094/5386270.html">外传2 楚玉嫣。</a></dd> <dd><a href="/1_1094/5386271.html">外传3 鹦鹉与皮冻。</a></dd>
<dd><a href="/1_1094/5403177.html">第一章 他叫白小纯</a></dd> <dd><a href="/1_1094/5428081.html">第二章 火灶房</a></dd>
<dd><a href="/1_1094/5433843.html">第三章 六句真言</a></dd> <dd><a href="/1_1094/5447905.html">第四章 炼灵</a></dd>
</dl>
</div>

根据第一章的内容和获取到的列表中a标签 href后面的内容可以知道,每个章节的内容就是http://www.biqukan.com+a标签href后的内容:

http://www.biqukan.com/1_1094/5403177.html
<a href="/1_1094/5403177.html">第一章 他叫白小纯</a>我们先获取listmain中的内容:目录链接地址为:https://www.biqukan.com/1_1094/`````c
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":target = 'http://www.biqukan.com/1_1094/'req = requests.get(url = target)html = req.textdiv_bf = BeautifulSoup(html)div = div_bf.find_all('div', class_ = 'listmain')print(div[0])

还是使用find_all方法,运行结果如下:

很顺利,接下来再匹配每一个标签,并提取章节名和章节文章。如果我们使用Beautiful Soup匹配到了下面这个标签,如何提取它的href属性和标签里存放的章节名呢?

<a href="/1_1094/5403177.html">第一章 他叫白小纯</a>

方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":server = 'http://www.biqukan.com/'target = 'http://www.biqukan.com/1_1094/'req = requests.get(url = target) html = req.textdiv_bf = BeautifulSoup(html)div = div_bf.find_all('div', class_ = 'listmain')a_bf = BeautifulSoup(str(div[0]))a = a_bf.find_all('a')for each in a:print(each.string, server + each.get('href'))

因为find_all返回的是一个列表,里边存放了很多的标签,所以使用for循环遍历每个标签并打印出来,运行结果如下。

最上面匹配的一千多章的内容是最新更新的12章节的链接。这12章内容会和下面的重复,所以我们要滤除,除此之外,还有那3个外传,我们也不想要。这些都简单地剔除就好。

3)整合代码
每个章节的链接、章节名、章节内容都有了。接下来就是整合代码,将获得内容写入文本文件存储就好了。编写代码如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests, sys, threading , os , shutil"""
类说明:下载《笔趣看》网小说《一念永恒》
Parameters:无
Returns:无
Modify:2017-09-13
"""
class downloader(object):def __init__(self):self.server = 'http://www.biqukan.com/'self.target = 'http://www.biqukan.com/1_1094/'self.names = []            #存放章节名self.urls = []            #存放章节链接self.nums = 0            #章节数"""函数说明:获取章节列表以及对应的下载链接列表Parameters:无Returns:无Modify:2017-09-13"""def get_download_url(self):req = requests.get(url = self.target)html = req.textdiv_bf = BeautifulSoup(html)div = div_bf.find_all('div', class_ = 'listmain')a_bf = BeautifulSoup(str(div[0]))a = a_bf.find_all('a')self.nums = len(a[15:])  #剔除不必要的章节,并统计章节数for each in a[15:]:self.names.append(each.string)self.urls.append(self.server + each.get('href'))"""函数说明:获取对应章节的内容Parameters:target - 下载连接(string)Returns:texts - 章节内容(string)Modify:2017-09-13"""def get_contents(self, target):req = requests.get(url = target)html = req.textbf = BeautifulSoup(html)texts = bf.find_all('div', class_ = 'showtxt')texts = texts[0].text.replace('\xa0'*8,'\n\n')return texts"""函数说明:将爬取的文章内容写入文件Parameters:name - 章节名称(string)path - 当前路径下,小说保存名称(string)text - 章节内容(string)Returns:无Modify:2017-09-13"""def writer(self, name, path, text):write_flag = Truewith open(path, 'a', encoding='utf-8') as f:f.write(name + '\n')f.writelines(text)f.write('\n\n')class myThread (threading.Thread):   #继承父类threading.Threaddef __init__(self, name,temdl,startNum,endNum):threading.Thread.__init__(self)self.runlist = list()self.name = nameself.temdl = temdlself.startNum = startNumself.endNum = endNumdef run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 print ("Starting " + self.name)startDownloadTxt(self.temdl,self.startNum,self.endNum)print ("Exiting " + self.name)def mkdir(path):'''判断路径是否存在存在     True不存在   False''' isExists=os.path.exists(path)if not isExists:os.makedirs(path) return Trueelse:return Falsedef subFile(path):#特定目录下的文件列表docList = os.listdir(path)# 显示当前文件夹下所有文件并进行排序'''key = lambda x:int(x[:-4])忽略文件名开始到倒数第四个字符为止docList.remove(i)删除数组中点开头的系统隐藏文件,因为会影响排序'''for i in docList:if(i[0]=='.'):docList.remove(i)breakdocList.sort(key = lambda x: int(x[:-4]))#创建一个以书籍名字命名的文件fnamepath = path+'/一念永恒.txt'fname = open(fnamepath, "w")#打开你之前命名的下载文件for i in docList:tempath = path+'/'+ix = open (tempath,  "r")    #打开列表中的文件,读取文件内容fname.write(x.read())  #写入新建的文件中x.close()    #关闭列表文件fname.close()#移动最后的完成文件到桌面,在删除download文件夹(windows环境下根据情况自己修改路径)shutil.move(fnamepath, '/Users/chen/Desktop')shutil.rmtree(path)'''
temdl:downloader类
startNum,endNum开始和结束的rang
'''
def startDownloadTxt(temdl,startNum,endNum):mkdir('download')for i in range(startNum,endNum):temPath = './download/'+str(i)+'.txt'temdl.writer(temdl.names[i], temPath, temdl.get_contents(temdl.urls[i]))print(temdl.names[i]+'done')if __name__ == "__main__":dl = downloader()#获取章节列表以及对应的下载链接列表dl.get_download_url()print('《一年永恒》开始下载:')# 创建二十个线程(太多的话,会卡)threads = []threadNum = 20for p in range(threadNum):threadname = '"Thread'+str(p)stepNum = dl.nums//threadNumif(p==threadNum-1):thread = myThread(threadname,dl,p*stepNum,dl.nums)else:thread = myThread(threadname,dl,p*stepNum,(p+1)*stepNum)threads.append(thread)try:# 开启线程for t in threads:t.start()for t in threads:t.join()except:print ("Error: unable to start thread")subFile('./download')
print('一念永恒下载完成')

python爬取笔趣阁小说相关推荐

  1. python爬取笔趣阁小说(附源码)

    python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...

  2. python爬取小说爬取_用python爬取笔趣阁小说

    原标题:用python爬取笔趣阁小说 首先打开笔趣阁网址,链接,搜索自己想要的小说. 在网站内单击右键,点击检查,会出现如下界面! 我们需要的章节信息就在我划的这块, 可以将每个标签点一下,它对应的内 ...

  3. 1.python爬取笔趣阁小说

    前一阵无聊想学习python,就有了以下代码,选取了笔趣阁这个大众化的网站,百度发现以笔趣阁为名的小说网站很多,本段代码只在百度结果里选取前五条,并选取了三个叫笔趣阁的网站,前五条里包含笔趣阁的任意一 ...

  4. Python爬取笔趣阁小说,有趣又实用!

    上班想摸鱼?为了摸鱼方便,今天自己写了个爬取笔阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 1. 首先导入相关的模块 import os import requests from ...

  5. 用python爬取笔趣阁小说并分章节保存到本地

    在宿舍无聊时想做点小程序,刚好又看到笔趣阁的广告,就想着爬一下小说看看,通过网上的爬取教程整理的 使用beautifulsoup解析request获取的HTML http://beautifulsou ...

  6. Python爬取笔趣阁小说2.0版

    之前的爬虫文章中,我们只可以爬取某本特定的小说,小波大叔一般喜欢看玄幻和修真类的,那么想把这一类小说全部爬下来该怎么操作呢,2.0版本来了,依然还是笔趣阁网站,初学者而言,这个没有反扒机制,比较方便. ...

  7. 通过python爬取笔趣阁小说,获取图片保存本地,数据保存mysql

    通过python爬取小说图片.小说名称.作者.章节.内容.直接上代码 import requests import time from bs4 import BeautifulSoup from qu ...

  8. 1-4 python爬取笔趣阁小说(附带完整代码)

    笔趣看是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更新速度.并且该网站只支持在线浏览,不支持小说打包下载.所以可以通过python爬取文本信息保存, ...

  9. python爬取笔趣阁小说的代码微小调整修改

    原文来自:  https://blog.csdn.net/u012717715/article/details/92811743 本人说明:其实严格地这不是转载,实际上更应该算是原创!原文代码不能正常 ...

  10. python 爬取笔趣阁小说(TK可视化)

    import requests from lxml import etree from pyquery import PyQuery as pq import re import time from ...

最新文章

  1. AndoridSQLite数据库开发基础教程(4)
  2. dfs-Rank the Languages
  3. 维密求变,“自救”还是“挖坟”?
  4. linux chkconfig 和 systemctl 区别 对比
  5. android computescroll_Android问题:自定义ViewGroup,重载computeScroll()方法有什么用?...
  6. 通过 GitExtensions 来使用 Git 子模块功能
  7. Python中键映射多个值的方法:defaultdict
  8. python库测试记录(sys、time、datetime、random、hashlib)
  9. 【转载】6种.net分布式缓存解决方案
  10. 华为将发布鲲鹏 920 芯片数据;三星 S10 自燃;Mageia 7 正式发布 | 极客头条
  11. 编译“have the same erasure, yet neither overrides“
  12. 较为容易理解的MUSIC算法DOA估计
  13. 泛微oa ecology8.0创建工作流程示例
  14. 哈希原理与常见哈希函数
  15. Rate Limiting速率限制
  16. 【新型密集采样网络:遥感超分】
  17. oracle完整的练习,2021史上最全Oracle数据库基本操作练习题(含答案).docx
  18. leetcode 周赛214 学习笔记(5561、1647)
  19. app inventor入门详细教程(音乐播放器)01
  20. 2023北京旅行计划 2023带父母北京旅行计划

热门文章

  1. 添加过滤器后登录界面无法登录的bug--已解决
  2. word提示“Word上次启动失败,安全模式可以帮助您解决问题”的解决办法
  3. 隐藏计算机文件夹中,电脑高手教你如何隐藏文件夹的方法
  4. 苹果六电池_苹果7P更换电池教程,小白也能动手更换
  5. 最新顶级OA办公系统源码+CRM客户管理系统+自适应手机
  6. 国外的英文JAVA论坛
  7. HDU 1521 排列组合 (指数型母函数)
  8. python尔雅答案_2020尔雅通识课Python》程序设计查题公众
  9. CocosCreator矢量绘图组件(1)
  10. xbox360使用_从Xbox360浏览网页