前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python爬虫案例教学:批量下载某狗所有热门榜单歌曲(附完整源码)

Python爬虫案例教学:批量下载某狗所有热门榜单歌曲(附完整源码)

作者头像
松鼠爱吃饼干
发布2021-09-02 10:08:32
5330
发布2021-09-02 10:08:32
举报
文章被收录于专栏:Python分享Python分享

环境

  • Python 3.6
  • Pycharm

模块使用

代码语言:javascript
复制
import os 
import requests 
import parsel 
import re
# 模块安装 
''' 
如何安装模块: 
1. win + R 输入 cmd 输入安装命令:pip install 模块名 回车 
2. pycharm里面安装 terminal 输入安装命令:pip install 模块名 回车 

模块安装失败的原因:
1. 提示:pip 不是内部命令 你python环境变量可能没有设置好 
2. 有安装进度条显示,但是安装到一半出现报错了 因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大 概只有 几KBread time out 网络连接超时 你可以切换为国内的镜像源 
3. 明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块 你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下 
'''

爬虫的基本思路

数据来源分析

  1. 确定需求
  2. 通过开发者工具进行抓包分析

代码实现过程

  1. 发送请求 对于榜单url地址发送请求
  2. 获取数据 获取网页源代码数据
  3. 解析数据 提取所有榜单相对应的url地址
  4. 发送请求 对于 榜单的url地址发送请求
  5. 获取数据 获取网页源代码数据
  6. 解析数据 提取音乐 hash 和 id 值
  7. 发送请求 把 hash 和 id 值 参数相对url里面 发送请求
  8. 获取数据 获取json字典数据
  9. 解析数据 提取 歌名 音乐播放地址
  10. 保存数据

数据来源分析 >>> 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据

完整代码

代码语言:javascript
复制
filename = 'music\\'
if not os.path.exists(filename):
    os.mkdir(filename)


def change_title(title):
    pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]")  # '/ \ : * ? " < > |'
    new_title = re.sub(pattern, "_", title)  # 替换为下划线
    return new_title


#  1. 发送请求 对于榜单url地址发送请求
url = 'https://www.kugou.com/yy/html/rank.html'
# 请求头 作用: 伪装  把python代码伪装成浏览器发送请求
# 任意一个数据包的 user-agent 都是一样的
# user-agent 表示的就是浏览器的基本信息
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
#  2. 获取数据 获取网页源代码数据
# print(response.text) # html 字符串数据(想直接解析字符串数据 只能用re) 转成 selector 对象
#  3. 解析数据 提取所有榜单相对应的url地址
selector = parsel.Selector(response.text)
# print(selector)
# css选择器  根据标签的内容 提取想要的数据
# 第一次提取 获取li 标签
lis = selector.css('.pc_rank_sidebar li')
lis = lis[13:]
# 返回的是列表, 所以可以遍历 把里面每一个元素提取出来  Selector 对象
for li in lis:
    title = li.css('a::attr(title)').get()
    link_url = li.css('a::attr(href)').get()
    print(f'=====================正在爬取{title}=====================')
    # print(title, link_url)
    # 4. 发送请求 对于 榜单的url地址发送请求
    response_1 = requests.get(url=link_url, headers=headers)
    # re.findall('')
    # 5. 获取数据 获取网页源代码数据 response_1.text
    # print(response_1.text)
    # 6. 解析数据 提取音乐 hash 和 id 值
    hash_list = re.findall('"Hash":"(.*?)"', response_1.text)
    # \d 匹配一个数字 \d+ 匹配多个数字 .*? 可以匹配任意字符 (除了\n)
    # 正则表达式匹配的数据 返回的是列表
    album_id = re.findall('"album_id":(\d+),', response_1.text)
    for index in zip(hash_list, album_id):
        hash = index[0]
        music_id = index[1]
        # 7. 发送请求 把 hash 和 id 值 参数相对url里面 发送请求
        index_url = 'https://wwwapi.kugou.com/yy/index.php'
        params = {
            'r': 'play/getdata',
            # 'callback': 'jQuery19106964302346548317_1629810585326',
            'hash': hash,
            'dfid': '1JdWoI2IQjNS2aq9KB1Ylhf3',
            'mid': 'fe0e97001229790f9065ef29dec3bdcd',
            'platid': '4',
            'album_id': music_id,
            '_': '1629810585327',
        }
        response_2 = requests.get(url=index_url, params=params, headers=headers)
        # json_data = response_2.json()['data']
        music_name = response_2.json()['data']['audio_name']
        new_name = change_title(music_name)
        music_url = response_2.json()['data']['play_url']
        if music_url:
            music_content = requests.get(url=music_url, headers=headers).content
            with open(filename + new_name + '.mp3', mode='wb') as f:
                f.write(music_content)
                print(music_name)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 松鼠爱吃饼干 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 模块使用
  • 爬虫的基本思路
    • 数据来源分析
    • 代码实现过程
      • 数据来源分析 >>> 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据
      • 完整代码
      相关产品与服务
      云开发 CLI 工具
      云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档