这几天朋友说想看电子书,但是只能在网上看,不能下载到本地后看,问我有啥办法?我找了好几个小说网址看了下,你只能直接在网上看,要下载txt要冲钱买会员,而且还不能在浏览器上直接复制粘贴。之后我就想到python的爬虫不就可以爬取后下载吗?

  码源下载:

    https://github.com/feiquan123/GetEBook/

  思路:

  首先,选择网址:http://www.yznnw.com/files/article/html/1/1129/index.html 这个是全本免费小说网上《龙血战神》的网址:

  

  F12,分析网页元素,可以看到,在此页的 .zjlist4 li a 下存放了所有章节的URL,首先我们要获取这些url放在一个数组里。然后循环遍历下载

  

  有了这些网址后开始分析具体的每一章:

  书名:

  

  章节名:

  

  内容:

  

  下一章:

  

  有了这些信息我们就可以开始爬取了(其实这里可以不爬取下一章的,主要我之前的思路是:下载小说的第一章后,返回小说的下一章,之后不断递归直到最后一页,这么做后下载速度慢,不能并发,还有就是一直递归占用资源大,一直请求服务器会断开连接,导致失败)

  所以我换成了这种思路:就是先获取所有的章节的网页连接,再用线程(你也可以用进程)开始下载,果然速度上升了好多,

  但是,仔细分析后发现,其实有些章节是作者的感言啥的,这些是不用下载的,而真正的章节的标题一定含有:****章*****,所以要用正则排除掉(这个要具体分析,不一定每个作者的感言标题都是这样的,不过直接使用此程序也可以,这样也没啥)

           

  代码如下:

  

#coding:utf-8
import urllib
import urllib.request
import multiprocessing
from bs4 import BeautifulSoup
import re
import os
import timedef get_pages(url):soup=""try:# 创建请求日志文件夹if 'Log' not in os.listdir('.'):os.mkdir(r".\Log")# 请求当前章节页面  params为请求参数request = urllib.request.Request(url)response = urllib.request.urlopen(request)content = response.read()data = content.decode('gbk')# soup转换soup = BeautifulSoup(data, "html.parser")except Exception as e:print(url+" 请求错误\n")with open(r".\Log\req_error.txt",'a',encoding='utf-8') as f:f.write(url+" 请求错误\n")f.close()return soup# 通过章节的url下载内容,并返回下一页的url
def get_ChartTxt(url,title,num):soup=get_pages(url)# 获取章节名称subtitle = soup.select('#htmltimu')[0].text# 判断是否有感言if re.search(r'.*?章', subtitle) is  None:return# 获取章节文本content = soup.select('#htmlContent')[0].text# 按照指定格式替换章节内容,运用正则表达式content = re.sub(r'\(.*?\)', '', content)content = re.sub(r'\r\n', '', content)content = re.sub(r'\n+', '\n', content)content = re.sub(r'<.*?>+', '', content)# 单独写入这一章try:with open(r'.\%s\%s %s.txt' % (title, num,subtitle), 'w', encoding='utf-8') as f:f.write(subtitle + content)f.close()print(num,subtitle, '下载成功')except Exception as e:print(subtitle, '下载失败',url)errorPath='.\Error\%s'%(title)# 创建错误文件夹try :os.makedirs(errorPath)except Exception as e:pass#写入错误文件with open("%s\error_url.txt"%(errorPath),'a',encoding='utf-8') as f:f.write(subtitle+"下载失败 "+url+'\n')f.close()return# 通过首页获得该小说的所有章节链接后下载这本书
def thread_getOneBook(indexUrl):soup = get_pages(indexUrl)# 获取书名title = soup.select('#htmldhshuming')[0].text# 根据书名创建文件夹if title not in os.listdir('.'):os.mkdir(r".\%s" % (title))print(title, "文件夹创建成功———————————————————")# 加载此进程开始的时间print('下载 %s 的PID:%s...' % (title, os.getpid()))start = time.time()# 获取这本书的所有章节charts_url = []# 提取出书的每章节不变的urlindexUrl = re.sub(r'index.html', '', indexUrl)charts = soup.select(".zjlist4 li a")for i in charts:# print(j+i.attrs['href'])charts_url.append(indexUrl + i.attrs['href'])# 创建下载这本书的进程p = multiprocessing.Pool()#自己在下载的文件前加上编号,防止有的文章有上,中,下三卷导致有3个第一章num=1for i in charts_url:p.apply_async(get_ChartTxt, args=(i,title,num))num+=1print('等待 %s 所有的章节被加载......' % (title))p.close()p.join()end = time.time()print('下载 %s  完成,运行时间  %0.2f s.' % (title, (end - start)))print('开始生成 %s ................' %title )sort_allCharts(r'.',"%s.txt"%title)return# 创建下载多本书书的进程
def process_getAllBook(base):# 输入你要下载的书的首页地址print('主程序的PID:%s' % os.getpid())book_indexUrl=['http://www.yznnw.com/files/article/html/1/1129/index.html','http://www.yznnw.com/files/article/html/29/29931/index.html','http://www.yznnw.com/files/article/html/0/868/index.html']print("-------------------开始下载-------------------")p = []for i in book_indexUrl:p.append(multiprocessing.Process(target=thread_getOneBook, args=(i,)))print("等待所有的主进程加载完成........")for i in p:i.start()for i in p:i.join()print("-------------------全部下载完成-------------------")return
#合成一本书
def sort_allCharts(path,filename):lists=os.listdir(path)# 对文件排序# lists=sorted(lists,key=lambda i:int(re.match(r'(\d+)',i).group()))lists.sort(key=lambda i:int(re.match(r'(\d+)',i).group()))# 删除旧的书if os.path.exists(filename):os.remove(filename)print('旧的 %s 已经被删除'%filename)# 创建新书with open(r'.\%s'%(filename),'a',encoding='utf-8') as f:for i in lists:with open(r'%s\%s' % (path, i), 'r', encoding='utf-8') as temp:f.writelines(temp.readlines())temp.close()f.close()print('新的 %s 已经被创建在当前目录 %s '%(filename,os.path.abspath(filename)))returnif __name__=="__main__":# # 主页base = 'http://www.yznnw.com'# 下载指定的书process_getAllBook(base)   #如果下载完出现卡的话,请单独执行如下命令# sort_allCharts(r'.\龙血战神',"龙血战神.txt")

   如果要下载其他书的话,找到书的首页,添加到如下位置:

   找书的首页URL,随便点开一章,删除后面的***.html,后回车,就是这本书的首页URL。

  

  

  运行结果:

        

  

  

    请求URL失败的网页放在,Log\req_error.txt中

  爬取失败的章节存放在这本书的目录下的error_url.txt中

  之后,你可以使用电子书生成器,生成就好,也可以在跟目录下看到相应的总的小说:

  

  这个是我爬了3本书的结果,爬完后程序卡了,只能结束掉,单独执行最后一条命令了。。。。。。。。

  手机端打开,目录也正确

        

版权作者:feiquan出处:http://www.cnblogs.com/feiquan/

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。大家写文都不容易,请尊重劳动成果~ 这里谢谢大家啦(*/ω\*)

转载于:https://www.cnblogs.com/feiquan/p/9996204.html

python 爬取全本免费小说网的小说相关推荐

  1. python爬取QQ音乐免费歌曲 2020.7.26

    python爬取qq音乐免费歌曲 2020.7.26 目标分析 获取音乐列表 1.浏览器网络请求追踪 2.寻找音乐列表 解析qq音乐 1.下载连接组成 2.获取vkey 3.获取sign参数 关系图 ...

  2. 用python爬取网站_「自如网」关于用python爬取自如网信息的价格问题(已解决) - seo实验室...

    自如网 ###这是一篇求助文,我能获取图片并变成字符串,但是无法获取位移量### 前两坛突发奇想想要爬取自如网的租房数据,本来以为能够请求+美丽+ re能全部搞定,没想到这个网站的反爬机制有点让我搞不 ...

  3. python 爬取全量百度POI

    在网上找了很多关于爬取百度POI的文章,但是对"全量"的做法并没有得到最终的解决方案,自己写了一个,但还是不能实现全量POI抓取,能够达到至少50%的信息抓取. 注意:这里所指&q ...

  4. Python 爬取蜻蜓FM免费音频页面的音频

    ps:这段代码是9月用python写的,环境是在python3.6跑起来的.最初的构想是通过爬取微信公众号的音频文件,通过存储到mogodb和下载到本地.最后发现微信的页面千变万化,不好分析,正好&q ...

  5. 使用python爬取斗破苍穹小说网

    使用python爬取斗破苍穹小说网,学会了以后就不用去看付费的小说了不多bb直接上源码 import requests from bs4 import BeautifulSoupdef file(): ...

  6. python爬取小说并下载_python爬取138看书网小说源码

    python爬取138看书网小说源码由论坛用户制作并分享,适用于138小说网,能够帮助用户爬取网站获取小说资源,软件提供分类搜索查找的功能,支持目录爬取,还附带书签功能,用户使用这款软件能够更加轻松地 ...

  7. 【爬虫】用Python爬取去哪儿网热门旅游信息(并打包成旅游信息查询小工具)

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/det ...

  8. python爬取小说写入txt_Python BeautifulSoup 爬取笔趣阁所有的小说

    这是一个练习作品.用python脚本爬取笔趣阁上面的免费小说. 环境:python3 类库:BeautifulSoup 数据源:http://www.biqukan.cc 原理就是伪装正常http请求 ...

  9. 完全小白篇-使用Python爬取网络小说

    完全小白篇-使用Python爬取网络小说 一.找一个你要爬取的小说 二.分析网页 网页的展示方式 需要用到的库文件 三.向网站发送请求 四.正则提取 五.跳转的逻辑 六.后续处理 七.保存信息进入do ...

  10. 利用python爬取贝壳网租房信息

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

最新文章

  1. Qt学习笔记之网络和连接
  2. React 向children中传值,layouts
  3. python程序按钮怎么创建_如何使用pygame创建按钮?
  4. Java在 list 中对每个元素遍历其是否在原 list 中有相同元素的方法
  5. 启动vue项目的时候报错提示To install it, you can run: npm install --save core-js/modules/es.regexp.dot
  6. Maven的下载与配置(包含阿里云镜像配置)
  7. 操作系统server 2012 r2 安装简体中文语言包
  8. MOEA/D-RDG 2016 阅读笔记
  9. Linux 下编译出现“ln failed to create symbolic link operation not supported”
  10. search engine “DuckDuckGo”
  11. 诛仙服务器状态查询,《诛仙3》部分服务器数据互通公告
  12. Windows常用热键
  13. Camera360 一款强大的手机拍照必备软件
  14. oracle两个压缩包怎么解压,AIX下如何解压缩zip文件
  15. vue 浏览器调试 样式如何定位样式_Vue项目骨架屏注入实践和方法总结
  16. 忧郁的蓝色手机专业论坛
  17. 【Docker x Hadoop】使用 Docker 搭建 Hadoop 集群(从零开始保姆级)
  18. X4扭曲字体或图形 coreldraw_CorelDRAW X4下载
  19. 学渣小论文投稿期刊记录总结
  20. PW4056H充电芯片,1A可调充电

热门文章

  1. 计算机网络性能(2)
  2. 云桌面三大谎言之GPU虚拟化
  3. 比特币 的 正统 ——BCH
  4. hadoop输出统计
  5. 深入PHP变量存储结构
  6. 在linux命令行利用SecureCRT上传下载文件
  7. symantec病毒服务器的部署及配置
  8. 报表统计(六) 访问数据库
  9. 实现两个N*N矩阵的乘法,矩阵由一维数组表示
  10. 野外帐篷露营避难有感