吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8656|回复: 14
收起左侧

[Python 转载] 借鉴网上教程,简单写了一个有声小说批量下载,菜鸟级别

[复制链接]
SOUL_FERRYMAN 发表于 2019-3-24 10:07
自己喜欢听有声小说,常用的网站只能一集一集下载,因此想到用python写一个批量下载的程序,不过几乎没有用过python,所以以下的代码几乎是东拼西凑出来的,不过还是放出来和大家交流一下。
[Python] 纯文本查看 复制代码
import urllib.request
from urllib.request import urlretrieve
from urllib.parse import quote
import re
import time
def cbk(a, b, c):
    per = 100.0 * a * b / c
    if per > 100:
        per = 100
    print('%.2f%%'%per)
req = urllib.request.Request('http://www.ting89.com/books/14657.html')
file = urllib.request.urlopen(req)
data = file.read().decode('gbk')
result = re.findall("""<a href='/down/\?[^-]+-\d+.html' target="_blank">([0-9]{3}_[^<]+)</a>""", data)
base_url = 'http://mp3-2.ting89.com:9090/2017/34/抬棺匠/'
for index in range(236, len(result)):
    down_url = base_url + result[index] + '.mp3'
    urlretrieve(quote(down_url,safe='/:?='), 'E:\python\%s.mp3'%(result[index]), cbk)
    print("%s 已下载完毕!"%(result[index]) + '.mp3')
    time.sleep(2)

可以看到,小说所在地址,和下载地址基址都是自己给出的,所以比较low

整个过程的主要难点有两个,一个是匹配章节名称时正则表达式的编写;还有一个就是urlretrieve是不支持中文url的,因此需要使用quote转换成ascii编码形式。最后的sleep是因为如果连续下载,远程服务器会强制中断连接,因此在下载之间加了延时。
另外第一次发帖,如果有什么犯规,希望及时指出

免费评分

参与人数 4吾爱币 +4 热心值 +3 收起 理由
天空宫阙 + 1 + 1 谢谢@Thanks!
410791007 + 1 我很赞同!
cxp521 + 1 + 1 编成exe文件啊
dsxue + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

天空宫阙 发表于 2019-3-25 20:24
本帖最后由 天空宫阙 于 2019-3-25 21:51 编辑

这个网站是提供免费下载的
http://mp3-2.ting89.com:9090/2017/34/抬棺匠/
找的很巧妙
想做一个全网通用的到最后一步才发现下载链接是js渲染的,浪费老子时间

和楼主完全一样的实现思路,给各个功能分开成函数
不是很会urllib这个库,所以保存部分用了requests库
增加对本地保存路径的检测,没有相应文件夹自动创建,有声书保存在E盘python_down文件夹内
楼主正则表达式用的不错
[Python] 纯文本查看 复制代码
import requests
import urllib.request
import re
import time
import os
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
}

root = "E://python_down//"
base_url = 'http://mp3-2.ting89.com:9090/2017/34/抬棺匠/'

#保存指定URL的文件
def save_a_file(url,path):
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            response =requests.get(url,headers=headers)
            with open(path,'wb') as f:
                f.write(response.content)
                f.close
                print('文件保存成功')
        else:
            print('文件已经存在')
    except:
        print('爬取失败')

#得到有声小说列表
def get_index():
    req = urllib.request.Request('http://www.ting89.com/books/14657.html')
    file = urllib.request.urlopen(req)
    data = file.read().decode('gbk')
    result = re.findall("""<a href='/down/\?[^-]+-\d+.html' target="_blank">([0-9]{3}_[^<]+)</a>""", data)
    return result

if __name__ == '__main__':
    name_list = get_index()
    for index in range(236, len(name_list)):
        down_url = base_url + name_list[index] + '.mp3'
        print(down_url)
        path = root + name_list[index]+'.mp3'
        save_a_file(down_url,path)
        time.sleep(1.5)

效果

QQ截图20190325201052.png
 楼主| SOUL_FERRYMAN 发表于 2019-3-26 09:24
天空宫阙 发表于 2019-3-25 20:24
这个网站是提供免费下载的
http://mp3-2.ting89.com:9090/2017/34/抬棺匠/
找的很巧妙

路径检测其实很有必要,一起交流学习,感觉python还是很强大的
jjc6174 发表于 2019-3-24 10:16
haile319 发表于 2019-3-24 10:41
还是不懂,为小白弄个更简单点的呗
410791007 发表于 2019-3-24 10:53
不会用python,好多东西只能看着
ytahdou 发表于 2019-3-24 10:58
简单了,不过感谢分享!!!!
ytahdou 发表于 2019-3-24 10:59
可以加上自动输入URL根据URL输入下载。目前只能源代码级别修改。
毫无影 发表于 2019-3-24 11:04
看不懂诶
 楼主| SOUL_FERRYMAN 发表于 2019-3-24 12:14

很水。。。。。
 楼主| SOUL_FERRYMAN 发表于 2019-3-24 12:15
ytahdou 发表于 2019-3-24 10:59
可以加上自动输入URL根据URL输入下载。目前只能源代码级别修改。

对的,网上看到的有的输入书名就可以下载,我现在得在审查元素找到下载基址。。。
 楼主| SOUL_FERRYMAN 发表于 2019-3-24 12:16
haile319 发表于 2019-3-24 10:41
还是不懂,为小白弄个更简单点的呗

已经是小白了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 21:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表