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

目录

Python爬取有声小说


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

摘要

功能如下:
1.批量下载
2.批量命名
3.界面化显示

使用工具:
1.pycharm
2.网站为 https://www.qktsw.net/ (如有侵权请联系作者删除)

整体思路:
1.请求网站,根据返回的网站源码,查找包含资源链接的标签
2.请求资源链接,将资源保存的本地,并命名
3.分析包含资源的网页规律(url),循环爬取
4.设计界面,实现自动分析,方便操作
5.(可选项)打包成exe文件,提升移植性

1.获取下载链接

#获取下载链接的方法
def getinfo(url0):
    #请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }
    #请求网页数据
    req = requests.get(url=url0, headers=headers)
    req.encoding = 'gb2312'
    html = req.text
    # 通过正则查找下载链接
    res = re.findall(r"http://(.*).m4a", html)
    # 拼合链接
    res = 'http://' + res[0]+'.m4a'
    #print(res)
    return res

2.分析规律,循环爬取

    #设置所要下载的起始终止集数
    begin = int(begin0)
    end = int(end0)
    #全局变量 批量命名时的集数
    global file_name_num
    file_name_num = begin
    #正则匹配包含资源链接页的规律  wangzhi为后期界面传过来的网址数据
    wangzhi_1 = wangzhi
    strinfo = re.compile('-(\d|\d\d|\d\d\d|\d\d\d\d).shtml')
    wangzhi_2 = strinfo.sub('-{}.shtml', wangzhi_1)
    #https://www.qktsw.net/ting-book-play-3483-1-2.shtml
    #根据匹配规则实现循环访问页面  详情页
    urls = [wangzhi_2.format(str(i)) for i in range(begin, end+1)]
    #'https://www.qktsw.net/ting-book-play-3483-1-{}.shtml'
    #https://www.qktsw.net/

    print("############开始下载############")
    for url in urls:

    #设置要保存到的路路径
        folderpath = store_path
    #通过函数返回下载链接
        url_download = getinfo(url)
    #开始下载
        #调用保存文件函数,实现下载到本地
        download_file(url_download, folderpath, file_name_num, file_name)
        #休眠1秒  防止访问速度过快
        time.sleep(1)
    #全部下载完成后输出信息
    print("############全部下载完成############")

3.保存到本地,批量命名

#下载文件的方法
def download_file(url,folderpath,num,file_name):     #参数中 folderpath 为要保存的文件夹的路径    num 为文件编号
    #文件夹不存在则创建文件夹
    folder = os.path.exists(folderpath)
    if not folder:
        os.makedirs(folderpath)
    #输出保存信息
    print('---正在下载第' + str(num) + '集>>>>>', folderpath+'/'+file_name+'-'+str(num)+'.mp3')
    #请求资源链接 读取远程MP3资源
    res = requests.get(url)
    res.raise_for_status()

    #设置保存的文件名
    filename = os.path.basename(file_name+'-'+str(num)+'.mp3')
    file_path = os.path.join(folderpath, filename)
    #保存到本地
    mp3_file = open(file_path, 'wb')
    for chunk in res.iter_content(chunk_size=1000000):
        mp3_file.write(chunk)
    mp3_file.close()
    #每集下载完成后 输出提示
    print('  ***第'+str(num)+'集下载成功')

    #修改文件编号  加 1
    global file_name_num
    file_name_num+=1

4.界面设计

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#界面库使用 tkinter
import tkinter
from tkinter import *
import next  #==next文件为1-3中函数保存的位置

root = tkinter.Tk()  # 创建窗口对象的背景色
root.title("听书爬虫程序")
root.geometry("450x350")

L1 = Label(root, text="小说名字:(如:****)")
L1.pack( side = TOP)
E1 = Entry(root, bd =1, width='50')
E1.pack(side = TOP)

L2 = Label(root, text="保存路径:(如:D:/****)")
L2.pack( side = TOP)
E2 = Entry(root, bd =1, width='50')
E2.insert(0, "D:/")
E2.pack(side = TOP)

L3 = Label(root, text="小说网址:(如:https://www.qktsw.net/ting-book-play-5264-1-1.shtml)")
L3.pack( side = TOP)
E3 = Entry(root, bd =1, width='50')
E3.pack(side = TOP)

L4 = Label(root, text="起始集数:(如:1)")
L4.pack( side = TOP)
E4 = Entry(root, bd =1, width='50')
E4.pack(side = TOP)

L5 = Label(root, text="终止集数:(如:67)")
L5.pack( side = TOP)
E5 = Entry(root, bd =1, width='50')
E5.pack(side = TOP)

L6 = Label(root,text="作者:***",fg="red")
L6.pack( side = BOTTOM)
#
E7 = Entry(root, bd =1, width='50')
E7.insert(0, 'https://www.qktsw.net/')  #在文本框开始位置插入“内容一”
E7.pack(side = BOTTOM)
L7 = Label(root, text="网址备忘:(复制后用浏览器打开)")
L7.pack( side = BOTTOM)
#信息输入完成后 确认键调用的函数
def on():
    #获取各个输入框的内用
    name = E1.get()
    path = E2.get()
    wangzhi = E3.get()
    begin = E4.get()
    end = E5.get()
    #传递参数
    next.onclick(name,path,wangzhi,begin,end)

B = tkinter.Button(root, text="确认", height="1", command=on, width='50')
B.pack(side=TOP)

root.mainloop()  # 进入消息循环

5.效果展示

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

上一篇:struct模块的使用


下一篇:python pack()和grid()方法在一起