当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
环境 Python 3.6 Pycharm 模块使用 import os import requests import parsel import re # 模块安装 ''' 如何安装模块: 1. win + R 输入 cmd 输入安装命令: pip install 模块名 回车 2. pycharm里面安装 terminal 输入安


环境

  • Python 3.6
  • Pycharm

模块使用

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设置里面重新设置一下
'''

​​觉得Python自己学不下去的,或者不知道该怎么学,怎么样把知识变现的?​​

爬虫的基本思路

数据来源分析

  • 确定需求
  • 通过开发者工具进行抓包分析
  • 代码实现过程

  • 发送请求 对于榜单url地址发送请求
  • 获取数据 获取网页源代码数据
  • 解析数据 提取所有榜单相对应的url地址
  • 发送请求 对于 榜单的url地址发送请求
  • 获取数据 获取网页源代码数据
  • 解析数据 提取音乐 hash 和 id 值
  • 发送请求 把 hash 和 id 值 参数相对url里面 发送请求
  • 获取数据 获取json字典数据
  • 解析数据 提取 歌名 音乐播放地址
  • 保存数据
  • 数据来源分析 >>> 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据

    完整代码

    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)



    网友评论