querybook.py

from bs4 import BeautifulSoup
from lxml import html
import xml
import requests
import splider
class QuName:
def __init__(self,number):
self.number = number
def getPageNum(self,url):
f = requests.get(url) # Get该网页从而获取该html内容
soup = BeautifulSoup(f.content, "lxml")
try:
pageNum = soup.find('div', class_="pagesnums").find('span').text
print('getPageNum执行成功')
return int(pageNum[3:5])
except:
print('getPageNum执行失败')
finally:
print('___________________________')
def getBookList(self):
for num in range(1,self.number):
pageNum = self.getPageNum('http://www.ting89.com/booklist/'+str(num)+'.html')
self.getBookInfo('http://www.ting89.com/booklist/'+str(num)+'.html')
print('http://www.ting89.com/booklist/'+str(num)+'.html')
for num1 in range(2,pageNum):
self.getBookInfo('http://www.ting89.com/booklist/'+str(num)+'_'+str(num1)+'.html')
print('http://www.ting89.com/booklist/'+str(num)+'_'+str(num1)+'.html') def getBookInfo(self,url):
f = requests.get(url) # Get该网页从而获取该html内容
soup = BeautifulSoup(f.content, "lxml")
try:
bookList = soup.find('div', class_="clist").findAll('li')
for i in bookList:
imgUrl = i.find('img')
print('书籍封面',imgUrl['src'])
# print('书名:',i.find('b').text)
pList = i.findAll('p')
for j in pList:
print(j.text)
#下载文件
splider.YsSpider(i.find('b').text).download_files()
except:
print('getBookInfo执行失败')
finally:
print('___________________________') qn = QuName(13) #这里是网站的类别数量(偷了个懒,直接写了个数字)
qn.getBookList()

splider.py

import requests
import urllib
import re
import os
import time
class YsSpider:
def __init__(self, name):
self.search_name = name
self.search_url = "http://www.ting89.com/search.asp?searchword="
self.home_url = "http://www.ting89.com/books/"
self.index_pattern = r"""<a href="/books/([0-9]+).html" title="(.+?)" target='_blank'>"""
self.chapter_pattern=r"""<a href='(/down/\?[^-]+-\d+.html)' target="_blank">(.+?)</a>"""
self.down_pattern=r"""url=(.*)/(.+?)\.mp3"""
self.book_id = ''
self.book_name = ''
self.Chapter_list = [] # 返回搜索书目的id
def searchbook(self):
file = requests.get(self.search_url + urllib.parse.quote(self.search_name, encoding='gb2312'))
data = file.content.decode('gbk')
result = re.findall(self.index_pattern, data)
if len(result):
for index, i in enumerate(result):
print('%d.%s'%(index+1,i[1]))
# str = input("输入你要下载的书目名称序号: ")
str = '1'
self.book_name = result[int(str)-1][1]
self.book_id = result[int(str)-1][0]
return self.book_id
else:
print('*******没有找到你输入的相关书籍,请更换后重新运行程序*******')
exit() def get_chapter_list(self):#获取各章节list和url
data = requests.get(self.home_url+self.searchbook()+'.html').content.decode('gbk')
result = re.findall(self.chapter_pattern, data)
return result
def _getAllUrl(self):# 获得所有的章节的下载地址
chapter_list = self.get_chapter_list()
chapter = [x[0] for x in chapter_list]
self.Chapter_list= [x[1] for x in chapter_list]
_list = [x[1] for x in chapter_list]
data = requests.get("http://www.ting89.com" + chapter[0]).content.decode('gbk')
result = re.findall(self.down_pattern, data)
# return result
return self.sub_get_url(result[0][0],_list, re.search("^0.*1$", result[0][1])) def sub_get_url(self, down_url, _list, down_url_flag):
url = []
if down_url_flag:
xulie = list(range(len(_list)))
weishu = len(str(xulie[-1]))
for i in xulie:
i1 = i + 1
tmp_url = down_url+'/' + str(i1).zfill(weishu) + '.mp3'
url.append(urllib.request.quote(tmp_url, safe='/:?='))
else:
for item in _list:
tmp_url = down_url + '/'+item + ".mp3"
url.append(urllib.request.quote(tmp_url, safe='/:?='))
return url # 保存指定URL的文件
def save_a_file(self, url, path, chapter):
try:
print('尝试下载',chapter)
if not os.path.exists(path):
response = requests.get(url)
with open(path, 'wb') as f:
f.write(response.content)
f.close
print(chapter,'保存成功')
response.close()
time.sleep(1)
else:
print('文件已经存在')
except:
print('爬取失败,已下载至',chapter,'即将重新尝试下载')
self.save_a_file(url, path, chapter) def download_files(self):
result = self._getAllUrl()# 所有的章节对应的下载地址
root = os.path.join(os.getcwd(), self.book_name)
if not os.path.exists(root):
os.mkdir(root)
for index,i in enumerate(result):
path = os.path.join(root, self.Chapter_list[index])+'.mp3'
self.save_a_file(i, path, self.Chapter_list[index])

python写的有声小说爬虫的更多相关文章

  1. python写的百度图片爬虫

    学了一下python正则表达式,写一个百度图片爬虫玩玩. 当技术遇上心术不正的人,就成我这样的2B青年了. python3.6开发.程序已经打包好,下载地址: http://pan.baidu.com ...

  2. Python写一个简单的爬虫

    code #!/usr/bin/env python # -*- coding: utf-8 -*- import requests from lxml import etree class Main ...

  3. 2019-04-23-Python爬取有声小说

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

  4. Python模块---制作属于自己的有声小说

    操作环境 Python版本: anaconda3 python3.7.4 操作系统: Ubuntu19.10 编译器: pycharm社区版 用到的模块: pyttsx3,requests pysst ...

  5. Python实战:下载鬼灵报告有声小说

    在家无聊,想看看小说,不过看的眼睛痛,就想着下个有声小说来听听.但风上找到的都是要一集一集下,还得重命名,122集啊,点到什么时候. 写个批处理下载的脚本.记录下过程. 一.老套路了,找到下载URL. ...

  6. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  7. Python写爬虫爬妹子

    最近学完Python,写了几个爬虫练练手,网上的教程有很多,但是有的已经不能爬了,主要是网站经常改,可是爬虫还是有通用的思路的,即下载数据.解析数据.保存数据.下面一一来讲.   1.下载数据 首先打 ...

  8. (转)Python新手写出漂亮的爬虫代码2——从json获取信息

    https://blog.csdn.net/weixin_36604953/article/details/78592943 Python新手写出漂亮的爬虫代码2——从json获取信息好久没有写关于爬 ...

  9. (转)Python新手写出漂亮的爬虫代码1——从html获取信息

    https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...

随机推荐

  1. java8的stream系列教程之filter过滤集合的一些属性

    贴代码 List<Student> lists = new ArrayList<>(); Student student = new Student(); student.se ...

  2. Anaconda入门使用指南

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...

  3. 友盟iOS sdk整理

    文档中心 :http://dev.umeng.com 集成文档:http://dev.umeng.com/analytics/ios-doc/integration 报表中心:http://www.u ...

  4. oracle水线的定义

    1.水线定义了表的数据在一个BLOCK中所达到的最高的位置. 2.当有新的记录插入,水线增高 3.当删除记录时,水线不回落 4.减少查询量

  5. Java中try catch finally语句中含return语句的执行情况总结-编程陷阱

    前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...

  6. typeof操作符,返回数据类型Array.isArray()、Object.prototype.toString.call()

    源地址https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof typeof操作符 // N ...

  7. some daily

    1. 一般div元素的background-color只覆盖到border,而其margin的颜色由外层元素的背景色决定. 2. 当设置了border-box以后,width=border+paddi ...

  8. JPA使用nativequery多表关联查询返回自定义实体类

    本文为JPA的学习采坑,如有问题欢迎指正. JPA官方推荐的多表关联查询使用不便,接触的有些项目可能会使用JPA 做简单查询,Mybaits做复杂查询.所以想要寻找一种好用的解决方案. JPA多表关联 ...

  9. iOS打包上传ipa文件时,报错<ERROR ITMS-90096: "Your binary is not optimized for iPhone 5 - New iPhone apps......>的解决方案

    很长一段时间习惯了用企业级证书发布,最近的新项目使用Xcode 9.1发布到AppStore时遇到了一个小问题(emm..其实问题跟Xcode版本没关系,我也不知道为什么要声明这个233),如下: E ...

  10. oracle函数 chartorowid(c1)

    [功能]转换varchar2类型为rowid值 [参数]c1,字符串,长度为18的字符串,字符串必须符合rowid格式 [返回]返回rowid值 [示例] SELECT chartorowid('AA ...