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. Directx11教程40 纹理映射(10)

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

  2. Directx教程(25) 简单的光照模型(4)

    原文:Directx教程(25) 简单的光照模型(4)      在本篇日志中,我们尝试用不带衰减的点光源来计算漫反射颜色.     前面的三个工程,我们都用的是方向光源(directional li ...

  3. 总结 ESP8266 RTOS 开发环境搭建

    总结 ESP8266 RTOS 开发环境搭建 仔细看官方文档. 必须一步一步操作. 不要想当然,以为 make 就可以. 忽略编译警告,除非是错误. 工具链必须使用官方提供的. 多看看 Issues ...

  4. oracle 共享服务器监控

    1.   观察sga的使用情况 select * from v$sgastat where pool=’large pool’; 2.   观察调度程序是否充足: 首先看每个调度程序的忙闲: sele ...

  5. Leetcode812.Largest Triangle Area最大三角形面积

    给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积. 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这 ...

  6. AtCoder Regular Contest 085 C HSI【概率论】

    AtCoder Regular Contest 085 C HSI 没学概率论还不怎么看得懂,虽然感觉不难,其实明明可以猜出来的..... 参考博客:https://www.cnblogs.com/g ...

  7. 2019-9-2-win10-uwp-随着数字变化颜色控件

    title author date CreateTime categories win10 uwp 随着数字变化颜色控件 lindexi 2019-09-02 12:57:38 +0800 2018- ...

  8. jQuery 鼠标移入图片 显示大图并跟随鼠标移动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. celery琐碎笔记

    -l 指定日志等级 -n 指定任务名称 -Q 指定任务执行队列 -c 指定启动celery的cpu数量 --logfile 指定日志输出到文件,会输出任务函数里的print,而控制台不会,用于调试. ...

  10. 2019-2-3-VisualStudio-扩展开发-添加输出窗口

    title author date CreateTime categories VisualStudio 扩展开发 添加输出窗口 lindexi 2019-02-03 11:41:40 +0800 2 ...