Python爬虫入门教程:如何爬取网易云音乐热歌榜歌曲

Python 爬虫入门:爬取网易云音乐热歌榜歌曲

教学目标

  1. 理解网络爬虫基本原理
  2. 掌握requests库的 HTTP 请求方法
  3. 学会使用BeautifulSoup解析 HTML 页面
  4. 实现文件下载与目录管理
  5. 了解反爬机制与应对策略

第一小时:环境搭建与基础库使用

1. 开发环境准备(15 分钟)

知识点

  • Python 解释器安装(推荐官网下载 3.8 + 版本)

  • pip包管理工具的使用

  • 第三方库安装:

    pip install requests beautifulsoup4  # 安装爬虫必备库
    
  • 操作演示

  • 验证安装:在终端输入python --versionpip list检查版本与库列表。
  • 2. 网络请求基础:requests 库入门

    知识点

  • HTTP 协议基础(URL 结构、请求方法、响应状态码)

  • requests.get()
    

    方法的参数:

  • url:目标网页地址

  • headers:请求头(模拟浏览器行为,绕过简单反爬)

  • 案例

    :网易云热歌榜 URL 分析

    url = 'https://music.163.com/discover/toplist'  # 目标页面
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0...'  # 模拟Edge浏览器
    }
    response = requests.get(url, headers=headers)  # 发送请求
    
  • 互动练习

  • 让学生打印response.status_code(预期 200 表示成功)
  • 查看响应内容:print(response.text[:100])(观察 HTML 结构)
  • 3. HTML 解析:BeautifulSoup 的使用

    知识点

  • 解析器选择:html.parser(Python 内置,无需额外安装)
  • 基本操作:
  • soup = BeautifulSoup(response.text, 'html.parser') # 创建解析对象
  • 标签查找方法:
  • find_all(tag, attrs):查找所有符合条件的标签
  • find():查找第一个符合条件的标签
  • 属性提取:tag['attr'](如href属性)
  • 文本提取:tag.text
    案例演示
  • # 查找所有带href属性的<a>标签
    a_tags = soup.find_all('a', href=True)
    for tag in a_tags:
        href = tag['href']
        if '/song?id=' in href:  # 筛选歌曲链接
            song_id = href.split('=')[-1]  # 提取ID
            song_name = tag.text.strip()  # 去除空白字符
            print(f"歌曲ID:{song_id},名称:{song_name}")
    

    常见问题

  • 为什么要加href=True?(排除无链接的标签)
  • split('=')[-1]的作用:通过分割字符串获取等号后的 ID
  • 第二小时:文件下载、异常处理与反爬应对

    1. 文件下载与目录管理

    知识点

  • os
    

    模块基础:

  • os.path.exists(path):检查路径是否存在
  • os.mkdir(path):创建目录(注意:只能创建单层目录)
  • 文件写入操作:

    with open('文件名.mp3', 'wb') as f:  # 'wb'表示二进制写入模式
        f.write(文件内容)
    
  • 案例代码

    def download(song_id, song_name):
        mp3_url = f'http://music.163.com/song/media/outer/url?id={song_id}.mp3'
        response = requests.get(mp3_url, headers=headers)
        
        # 创建存储目录
        dir_name = 'mp3'
        if not os.path.exists(dir_name):
            os.mkdir(dir_name)
        
        # 保存文件(注意文件名特殊字符处理)
        filename = f'{dir_name}/{song_name}.mp3'
        with open(filename, 'wb') as f:
            f.write(response.content)
        print(f'已下载:{song_name}')
    

    实操注意

  • 文件名可能包含特殊字符(如/),需用replace()方法过滤
  • 提示学生:实际网易云音乐可能返回加密的.ncm文件,需额外处理
  • 2. 异常处理与代码优化

    知识点

  • try...except
    

    异常捕获:

    try:
        # 可能出错的代码
        response = requests.get(url, timeout=5)  # 设置超时时间
        response.raise_for_status()  # 状态码非200时抛出异常
    except requests.exceptions.RequestException as e:
        print(f'请求失败:{e}')
    
  • 代码模块化:将功能拆分到独立函数(如dewn()主函数、download()下载函数)

  • 效率优化:避免重复请求(可添加time.sleep(1)模拟人工浏览速度)

  • 作者:qq_58092714

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python爬虫入门教程:如何爬取网易云音乐热歌榜歌曲

    发表回复