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_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)模拟人工浏览速度)

你可能感兴趣的:(python,爬虫,开发语言)