起因:需要批量下载音频,懒得手动下
用两天了解 python

  1. 分析需求
  2. 设计程序
  3. 编写代码
  4. 调试程序

分析需求

实现批量下载音频功能

设计程序

  1. 请求对象的定制
  2. 获取响应数据
  3. 下载文件

请求对象的定制

  1. 获取 url
    url 组成:固定 url + 以毫秒为单位的时间戳
  2. 获取请求头和请求参数
  3. 由于是 post 请求,所以必须编码
  4. 请求对象的定制
  5. 返回请求对象

获取响应数据

  1. 模拟浏览器向服务器发送请求
  2. 获取响应数据
  3. 返回响应数据

下载文件

  1. 将字符串转换为json 对象
  2. 获取整个对象
  3. 获取下载路径
  4. 完成下载


import json
import urllib.request
import time

def create_request(page):
    url = 'https://appymk8ms6i9430.h5.xiaoeknow.com/column_more_data_v2/column_more_data?' + str(int(time.time()*1000))

    # 请求头
    headers = {
        'cookie':'sensorsd%7D',
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39',
    }

    # 请求参数
    data = {
        'bizData[page_size]':str(page),
        'bizData[isDesc]':'0',
        'bizData[content_app_id]':'',
        'bizData[channel_id]':'',
        'bizData[product_id]':'p_5d3a92e84ff00_nwLrhOlP',
        'bizData[qy_app_id]':''
    }

    # post 请求的参数,必须要编码
    data = urllib.parse.urlencode(data).encode('utf-8')

    # 请求对象的定制
    request = urllib.request.Request(url=url,data=data,headers=headers)

    return request

def get_content(request):
    # 模拟浏览器向服务器发送请求
    response = urllib.request.urlopen(request)
    #获取响应的数据
    content = response.read().decode('utf-8')
    return content

def down_load(content):
    # 字符串 -> json 对象
    obj = json.loads(content)

    # 在预览中可以看到是每页 8 条数据
    for id in range(0,8):
        # 获取整个对象
        try:
            audio_obj = obj.get('data').get('contentData').get('contentInfo')[id]
        except IndexError:
            print("最后一页数据未满 8 条")
            return
        # 因为下载路径在json对象中
        # 获取下载路径
        download_url = audio_obj.get('audio_compress_url')
        download_name = audio_obj.get('resource_name')
        urllib.request.urlretrieve(download_url,filename=('D:/BaiduNetdiskDownload/' + download_name + '.mp3'))
        print(download_name + '--下载完成')
        

# 程序入口
if __name__ == '__main__':
    start_page = int(input('输入起始页码:'))
    end_page = int(input('输入结束页码:'))

    for page in range(start_page,end_page):
        # 每页都有自己的请求对象定制
        request = create_request(page)
        # 获取响应的数据
        content = get_content(request)
        # 下载文件
        down_load(content)
    
    print("全部下载完成!")
    
文章作者: 临川
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 临川羡鱼
Python Python
喜欢就支持一下吧