这几天朋友说想看电子书,但是只能在网上看,不能下载到本地后看,问我有啥办法?我找了好几个小说网址看了下,你只能直接在网上看,要下载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-
import urllib
import urllib.request
import multiprocessing
from bs4 import BeautifulSoup
import re
import os
import time def 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')[].text
# 判断是否有感言
if re.search(r'.*?章', subtitle) is None:
return
# 获取章节文本
content = soup.select('#htmlContent')[].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')[].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 = []
# 提取出书的每章节不变的url
indexUrl = 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=
for i in charts_url:
p.apply_async(get_ChartTxt, args=(i,title,num))
num+=
print('等待 %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))) return if __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/

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

大家写文都不容易,请尊重劳动成果~ 这里谢谢大家啦(*/ω\*)

python 爬取全本免费小说网的小说的更多相关文章

  1. python 爬取全量百度POI

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

  2. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...

  3. Python 爬取途虎养车 全系车型 轮胎 保养 数据

    Python 爬取途虎养车 全系车型 轮胎 保养 数据 2021.7.27 更新 增加标题.发布时间参数 demo文末自行下载,需要完整数据私聊我 2021.2.19 更新 增加大保养数据 2020. ...

  4. Python学习-使用Python爬取陈奕迅新歌《我们》网易云热门评论

    <后来的我们>上映也有好几天了,一直没有去看,前几天还爆出退票的事件,电影的主题曲由陈奕迅所唱,特地找了主题曲<我们>的MV看了一遍,还是那个感觉.那天偶然间看到Python中 ...

  5. python爬取当当网的书籍信息并保存到csv文件

    python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...

  6. Python爬取中国天气网

    Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...

  7. python入门学习之Python爬取最新笔趣阁小说

    Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...

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

    最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...

  9. Python爬取网易云音乐歌手歌曲和歌单

    仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...

随机推荐

  1. [Swift]LeetCode477. 汉明距离总和 | Total Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  2. 机器学习入门17 - 嵌套 (Embedding)

    原文链接:https://developers.google.com/machine-learning/crash-course/embeddings/ 嵌套是一种相对低维的空间,可以将高维矢量映射到 ...

  3. python高级-迭代器(18)

    一.什么是迭代器 迭代是访问集合元素的⼀种⽅式. 迭代器是⼀个可以记住遍历的位置的对象. 迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退 二.可迭代对象 直 ...

  4. mongodb高级聚合查询

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  5. Javascript的原型继承,说清楚

    一直以来对Javascript的原型.原型链.继承等东西都只是会用和了解,但没有深入去理解这门语言关于继承这方面的本质和特点.闲暇之余做的理解和总结,欢迎各位朋友一起讨论. 本文本主要从两段代码的区别 ...

  6. Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取

    写在前面 从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院,CSDN学院,网易云课堂,慕课网 ...

  7. .NET应用程序管理服务AMS设计

    AMS全称是Application Management Server即应用程序管理服:由于经常要写些一些应用服务,每次部署和维护都比较麻烦,首先要针对服务编写一个windows服务程序方便系统启动里 ...

  8. source map 的原理探究

    线上产品代码一般是编译过的,前端的编译处理过程包括不限于 转译器/Transpilers (Babel, Traceur) 编译器/Compilers (Closure Compiler, TypeS ...

  9. C#线程安全使用(四)

    这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationTokenSource,C ...

  10. Signalr指定Websocket方式跨域数据传输

    跨域通俗理解就是两个域名后面的web服务地址,即都是独立的网站.现实业务的情况会有很多需要跨域推送数据的情况, 比如类似饿了么商户后台会收到客户端确认订单后,后台服务会推送一条订单消息给商户前台. S ...