最近想下载一些有声小说,但是苦于没有找到批量下载,每次都是单集单集的下载的,觉得很麻烦,就考虑用python写一个爬虫来实现自动搜集小说,自动下载。下面就是开始展开漫漫的爬虫之路。

基础的就不多说了,重点就是针对在项目中遇见的一些问题进行记录。主要就以下三个方面进行展开:

1.正则表达式的使用

2.编码格式

3.如何获取js动态加载生成的内容

1.正则表达式的使用

正则表达式主要是用于匹配相应的标签,这个可以快速定位出需要的标签,使爬虫更有效率。

如:

考虑使用如下正则表达式:

self.down_pattern = '<a title=.+? href=(.\/down.+?)target=.*?>.+?</a>'

一开始编写正则的时候,主要是刚开始使用,很多不是很熟悉,使用了\w来匹配,后来发现无法匹配,后来换成了.来匹配,同时使用了非贪婪匹配。非贪婪匹配就是在*+后加上?即可。具体的正则表达式相关的知识请参阅别的教程,总之正则是个很大很大的坑,日后还有再找机会慢慢填。

2.编码格式

编码格式也是个很恼火的问题,在编写爬虫爬取网页经常爆出unicodeencodeerror错误,几乎都是中文导致的影响,所以每次以后记住,如果网页中有中文出现,返回的响应用decode('gbk')或者decode('gb2312')解码,这样中文就可以显示正确了。同时如果在url中出现了中文,那么想当然也要进行相应的编码,可以使用urllib.parse.quote()来进行相应编码,一般默认utf-8,但在运用听书网的搜索功能时,发现它传入的中文转换成了gb2312格式,那么只需quote传入gb2312就行。这里也是当时费了一点时间,所以提醒自己日后一定要注意多种格式编码。后来借助一个在线编码转换网站,成功发现了它是转换成了gb2312,之前都是默认用的utf-8。这里安利一下这个网站,感觉方便的。http://tool.chinaz.com/tools/urlencode.aspx

3.获取js动态生成的内容

在编写自动下载小说的过程中发现,当我访问每个下载链接的主页的时候,我爬取不到下载的url,咦,当时就觉得很奇怪,查看了源之后发现确实没有写在源中,于是猜测可能是动态加载了,好吧,那就乖乖打开开发人员工具吧。之前有过爬取豆瓣排行榜的经历,所以首先想到的是xhr类型,返回一个json格式数据,后来发现并不是,接着查看了网页加载后的所有动态文件,发现一个叫down.js的文件有点意思啊,查看了它的响应结果,果真,就是下载地址。好吧,那么问题就来了,如果使用python3来爬取js动态加载的内容呢。这里就最简单的考虑了使用selenium+edge来模拟浏览器访问,等加载完成之后,再读取相应地址。这里呢安装selenium还是挺简单的,顺带还要下载一个edge的运行驱动吧,把驱动放在一个配置了path的目录下,这样似乎才可以正确调用浏览器。后面还要继续在学下selenium。

下面是全部代码:

   import urllib.requestimport urllib.parseimport reimport os.pathimport selenium.webdriver# <a title="第000章" href="/down/?26-0-0.html" target="_blank">第000章</a>class TingSpider:def __init__(self, bookname):self.down_pattern = '<a title=.+? href=(.\/down.+?) target=.*?>.+?</a>'  # 匹配下载主页self.pattern = '<a title=.+? href=.+? target=.*?>(.+?)</a>'  # 匹配章节名称self.hotpattern = '<a href=(.*?) title=.*>.*</a></h2>(\d*?)<b>'  # 匹配书的热度的正则表达self.index_url = "http://www.520tingshu.com/search.asp?searchword="  # 搜索主页self.down_url_pattern = '<a href=(.+)\/.*\.mp3" target=.*?>.+?</a>'  # 下载链接的地址self.bookname = booknamedef __getmax(self, result):  # 获取搜索的结果中热度最高的那本书max_item = Nonefor i in range(len(result)):if max_item == None:max_item = result[i]elif int(result[i][1]) > int(max_item[1]):max_item = result[i]return max_itemdef __searchbook(self):  # 获得要搜索的书的首页地址file = urllib.request.urlopen(self.index_url + urllib.parse.quote(self.bookname, encoding='gb2312'))data = file.read().decode('gbk')result = re.findall(self.hotpattern, data)if result is None:raise 'No book found'res = self.__getmax(result)new_url = "http://www.520tingshu.com"+res[0].replace('"', '')return new_urldef __getlist(self):  # 获得该有声小说所有的章节名,小说下载页的urlbookurl = self.__searchbook()req = urllib.request.Request(bookurl)file = urllib.request.urlopen(req)data = file.read().decode('gbk')result = re.findall(self.pattern, data)tmp_url = re.search(self.down_pattern, data)return result, "http://www.520tingshu.com" + tmp_url.group(1).replace("'", '')def __getdownurl(self, downpage):  # 获取下载链接地址的除去文件名的地址brower = selenium.webdriver.Edge()brower.get(downpage)brower.maximize_window()result = re.search(self.down_url_pattern, brower.page_source)brower.close()return result.group(1).replace('"', '') + '/'def __getAllUrl(self):  # 获得所有的章节的下载地址url = []result, downpage = self.__getlist()down_url = self.__getdownurl(downpage)for item in result:tmp_url = down_url + item + ".mp3"url.append(urllib.request.quote(tmp_url, safe='/:?='))return urldef down_file(self):result = self.__getAllUrl() # 所有的章节对应的下载地址for i in range(len(result)):s = str(i)+".mp3"if self.__exist(s) == False:self.__downfile(result[i], s)def __downfile(self, url, filename):  # 将文件下载到本地file = urllib.request.urlopen(url)data = file.read()with open(filename, "wb") as f:f.write(data)def __exist(self, s):if os.path.exists(s):return Trueelse:return Falsetest = TingSpider("诛仙")
test.down_file()

代码地址:https://github.com/xiaoHzp/python/blob/master/Ting_shu.py

python爬取有声小说网站实现自动下载实例相关推荐

  1. Python爬取有声小说

    Python爬取有声小说 文章目录 Python爬取有声小说 摘要 1.获取下载链接 2.分析规律,循环爬取 3.保存到本地,批量命名 4.界面设计 5.效果展示 通过python爬取网站的资源,实现 ...

  2. python爬取有声小说_2019-04-23-Python爬取有声小说

    Python爬取有声小说 [toc] 通过python爬取网站的资源,实现批量下载功能: 记录一次自己的学习经历,小白,非专业,难免有不足之处,望读者取其精华! 摘要 功能如下: 1.批量下载 2.批 ...

  3. 用Python爬取顶点小说网站中的《庆余年》思路参考——记一次不成功的抓取

    目的:用python爬虫抓取顶点小说网站中的<庆余年>小说内容个,并保存为txt格式文件. 环境:Win10系统,Anaconda3 + PyCharm, python3.6版本 思路:( ...

  4. Python爬虫新手入门教学(十四):爬取有声小说网站数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  5. python爬取有声小说_听说还有付费听书的朋友,用python带你爬取喜马拉雅有声小说...

    思路只有两个:获取一级页面.获取二级页面 先一步二步看一下代码: def get_mes(self): id_list = [] # 获取前三页的地址,range顾头不顾尾 for i in rang ...

  6. python爬取有声小说_200行代码实现一个有声听书网爬虫下载器

    [Python] 纯文本查看 复制代码""" @author:qh @datetime:2019-3-5 @mood: """ import ...

  7. python爬取有声小说_python 采集有声小说至本地文件夹(幻听网)

    [实例简介] [实例截图] [核心代码] import urllib.request from urllib.request import urlretrieve from urllib.parse ...

  8. Python网络爬虫(九):爬取顶点小说网站全部小说,并存入MongoDB

    前言:本篇博客将爬取顶点小说网站全部小说.涉及到的问题有:Scrapy架构.断点续传问题.Mongodb数据库相关操作. 背景: Python版本:Anaconda3 运行平台:Windows IDE ...

  9. Python爬取起点小说并保存到本地文件夹和MongoDB数据库中

    Python爬取起点小说并保存到本地MongoDB数据库中 工具:Python3.7 + Mongo4.0 + Pycharm """ 爬取起点小说<诡秘之主> ...

最新文章

  1. python网络编程——简单例子
  2. 关于锁机制:数据库锁
  3. 计算机技术应用及信息管理,计算机应用技术与信息管理整合研究(共2808字).doc...
  4. JavaScript 的DOM操作
  5. C/C++之变长数组(VLA)和可伸缩型数组成员
  6. GitHub 远程仓库 de 第一次配置
  7. linux mysql 操作命令
  8. 卡牌大师怎么玩_用卡牌大师如何上分
  9. nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
  10. unlink(file_name)
  11. android profiler 简书,(四)Android 性能优化 Energy Profiler
  12. android otg读取索尼相机usb_OTG是何物,手机的OTG功能还有存在的必要么?
  13. 《Python游戏编程入门》第二章编程挑战
  14. gis怎么提取水系_ArcGIS水文分析实战教程(7)细说流域提取
  15. ogg怎么转换成mp3格式?
  16. CentOS 编译安装 Nebula Graph 3.10
  17. 推荐一位字节大佬的刷题经验!
  18. 交换机/路由器实验:最后说些什么
  19. P1909 [NOIP2016 普及组] 买铅笔
  20. 四位行波进位加法器_【HDL系列】进位选择加法器原理与设计

热门文章

  1. 每日一题——众里寻花(并查集)
  2. 汉字转换拼音或拼音首字母(两个函数)--记录一下
  3. 迷你服务器开机无显示,迷你云服务器突然消失
  4. 项目中中文大写金额的工具类
  5. 2372: 连通块(blocks) 个人认为二维并查集为什么TLE?
  6. iis服务器 访问html,设置好IIS服务器后怎样在浏览器中进行访问
  7. html播放vcd,提取vcd光盘中的视频到电脑
  8. 平安普惠借款费用占本金一半 被诉未起告知义务、存代签情况
  9. Java 验证日期/时间的有效性
  10. 软件设计师笔记-操作系统基本原理