这几天朋友说想看电子书,但是只能在网上看,不能下载到本地后看,问我有啥办法?我找了好几个小说网址看了下,你只能直接在网上看,要下载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. 聊一聊Spring中的线程安全性
  2. C++单链表学习随想
  3. .NET 6 的 docker 镜像可以有多小
  4. 使用Spring的缓存管理器缓存Web内容
  5. 为什么C# md5 32位加密算法,密码明文会出现31位
  6. 《算法图解》之狄克斯特拉算法
  7. java 4.0 下载_javax.servlet-api-4.0.1.jar包下载
  8. ESP8266串口转wifi模块AT指令调试TCP通信
  9. Tar的详细用法(转自Linux伊甸园)_拔剑-浆糊的传说_新浪博客
  10. 使用vcpkg安装cgal前安装yasm报错
  11. 对话腾讯金融云胡利明:金融机构数字化,迈进了“深水区”
  12. 交换机工作原理和配置命令
  13. Android 开发常见问题汇总
  14. html5怎么将字体变成斜体,;html5斜体字
  15. UI/UE设计学习路线图(超详细)
  16. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
  17. 入门Python400集视频,Python学会之后,一般能拿到多少工资?
  18. Python数据分析案例-利用多元线性回归与随机森林回归算法预测笔记本新品价格
  19. Java中多线程、多线程的实现方式、同步代码块的方式
  20. 模板字符串 `` + 简化对象写法

热门文章

  1. 安装部署elasticsearch过程详解
  2. Android中Java与web通信
  3. 你的邮件为何被标记为垃圾邮件?
  4. Qlikview Session Recovery
  5. weblogic IllegalArgumentException 解决办法
  6. js中for循环的优化写法
  7. 【配置关系】—Entity Framework实例详解
  8. remote验证方法请求没有发送
  9. 形容人的内核是什么意思_那些对你忽冷忽热的人到底什么意思?
  10. 16.Mongodb之预写日志(Journaling)