SOUL_FERRYMAN 发表于 2019-3-24 10:07

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

自己喜欢听有声小说,常用的网站只能一集一集下载,因此想到用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">({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 + '.mp3'
    urlretrieve(quote(down_url,safe='/:?='), 'E:\python\%s.mp3'%(result), cbk)
    print("%s 已下载完毕!"%(result) + '.mp3')
    time.sleep(2)
可以看到,小说所在地址,和下载地址基址都是自己给出的,所以比较low

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

天空宫阙 发表于 2019-3-25 20:24

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

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

和楼主完全一样的实现思路,给各个功能分开成函数
不是很会urllib这个库,所以保存部分用了requests库
增加对本地保存路径的检测,没有相应文件夹自动创建,有声书保存在E盘python_down文件夹内
楼主正则表达式用的不错
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">({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 + '.mp3'
      print(down_url)
      path = root + name_list+'.mp3'
      save_a_file(down_url,path)
      time.sleep(1.5)

效果

SOUL_FERRYMAN 发表于 2019-3-26 09:24

天空宫阙 发表于 2019-3-25 20:24
这个网站是提供免费下载的
http://mp3-2.ting89.com:9090/2017/34/抬棺匠/
找的很巧妙


路径检测其实很有必要:handshake,一起交流学习,感觉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

看不懂诶{:1_908:}

SOUL_FERRYMAN 发表于 2019-3-24 12:14

毫无影 发表于 2019-3-24 11:04
看不懂诶

很水。。。。。

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
还是不懂,为小白弄个更简单点的呗

已经是小白了
页: [1] 2
查看完整版本: 借鉴网上教程,简单写了一个有声小说批量下载,菜鸟级别