专业编程基础技术教程

网站首页 > 基础教程 正文

Python学不会来打我(48)正则表达式爬取网易云音乐

ccvgpt 2025-06-10 13:30:39 基础教程 7 ℃

在本篇文章中,我们将使用 Python + 正则表达式 编写一个简单的网络爬虫,从网易云音乐网页中提取歌曲信息,并通过正则表达式筛选出歌手“周杰伦”和“林俊杰”的歌曲,最后将结果保存到本地文件。

文章适合 Python初学者 学习如何结合正则表达式与爬虫技术进行数据抓取与分析。我们也将强调代码规范、法律合规性以及道德责任。

Python学不会来打我(48)正则表达式爬取网易云音乐


一、项目目标概述

我们要完成的任务如下:

  1. 使用 requests 模块请求网易云音乐的某一页歌曲列表页面。
  2. 使用 BeautifulSoup 解析 HTML 页面内容。
  3. 使用 正则表达式 提取页面中的歌曲名和歌手名。
  4. 筛选出属于“周杰伦”或“林俊杰”的歌曲。
  5. 将匹配结果保存为本地文本文件。

注意:本文仅为学习目的,仅模拟爬取公开网页内容,请勿用于非法用途或大规模访问影响服务器稳定。


二、环境准备

安装依赖库

pip install requests beautifulsoup4 lxml
  • requests:发送HTTP请求获取网页内容
  • beautifulsoup4:解析HTML结构
  • lxml:高效HTML解析器

三、了解网易云音乐页面结构(以搜索页为例)

我们假设要爬取的是网易云音乐的搜索页面,例如:

https://music.163.com/#/search/multi?id=xxx&keywords=流行

由于网易云音乐大部分内容采用 JavaScript 动态加载,直接使用 requests 可能无法获取完整的歌曲列表。

因此,为了演示目的,我们选择一个 静态网页示例模拟返回HTML内容 来进行讲解。你也可以使用 Selenium 或其他工具处理动态加载页面,但那超出了本文范围。


四、构建基础爬虫程序

示例代码:获取网页HTML内容

import requests

def fetch_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers, timeout=10)
        if response.status_code == 200:
            return response.text
        else:
            print(f"请求失败,状态码:{response.status_code}")
            return None
    except Exception as e:
        print("请求异常:", e)
        return None

五、解析HTML并提取歌曲信息

示例代码:使用 BeautifulSoup 解析 HTML

from bs4 import BeautifulSoup

def parse_songs(html):
    soup = BeautifulSoup(html, 'lxml')
    song_list = []

    # 假设歌曲列表位于 tbody 标签中,每个 tr 表示一首歌
    table = soup.find('table', class_='m-table')
    if table:
        rows = table.find_all('tr')[1:]  # 跳过表头行
        for row in rows:
            cols = row.find_all('td')
            if len(cols) >= 3:
                song_name_tag = cols[1].find('b')
                artist_tag = cols[2].find('div')

                if song_name_tag and artist_tag:
                    song_name = song_name_tag.get_text(strip=True)
                    artist_name = artist_tag.get_text(strip=True)
                    song_list.append({'song': song_name, 'artist': artist_name})
    return song_list

六、使用正则表达式筛选特定歌手的歌曲

我们希望只保留歌手是“周杰伦”或“林俊杰”的歌曲。

示例代码:使用正则表达式匹配歌手名

import re

def filter_songs_by_artist(song_list, target_artists):
    filtered_songs = []
    pattern = re.compile(rf'({"|".join(map(re.escape, target_artists))})', re.IGNORECASE)

    for song_info in song_list:
        if pattern.search(song_info['artist']):
            filtered_songs.append(song_info)
    return filtered_songs

说明:

  • re.escape() 防止艺术家名字中包含特殊字符
  • 使用正则表达式构造动态匹配模式,支持多个歌手
  • re.IGNORECASE 忽略大小写匹配

七、保存结果到本地文件

示例代码:将筛选后的歌曲保存为txt文件

def save_to_file(songs, filename='filtered_songs.txt'):
    with open(filename, 'w', encoding='utf-8') as f:
        for idx, song in enumerate(songs, start=1):
            line = f"{idx}. 歌曲:{song['song']} - 歌手:{song['artist']}\n"
            f.write(line)
    print(f"已成功保存 {len(songs)} 首歌曲到 {filename}")

八、整合所有功能并运行测试

主程序入口

if __name__ == '__main__':
    search_url = 'https://music.163.com/#/search/multi?keywords=周杰伦'  # 示例URL
    html_content = fetch_html(search_url)

    if html_content:
        all_songs = parse_songs(html_content)
        target_artists = ['周杰伦', '林俊杰']
        result_songs = filter_songs_by_artist(all_songs, target_artists)
        save_to_file(result_songs)
    else:
        print("未能获取网页内容")

九、完整输出示例

假设我们成功爬取到了以下部分数据:

1. 歌曲:晴天 - 歌手:周杰伦
2. 歌曲:七里香 - 歌手:周杰伦
3. 歌曲:江南 - 歌手:林俊杰
4. 歌曲:曹操 - 歌手:林俊杰
...

最终会保存到本地文件 filtered_songs.txt 中。


十、注意事项与法律声明

合法使用建议:

  • 不要频繁访问网站造成服务器压力
  • 不要爬取受版权保护的内容用于商业用途
  • 不要爬取用户隐私信息或内部接口数据
  • 遵守网站的 robots.txt 规则

特别提醒:

网易云音乐的部分页面采用动态渲染,单纯使用 requests 无法获取全部内容。如需深入开发,建议学习使用 Selenium 或 Playwright 工具。


十一、总结

通过本文的学习,你应该已经掌握了以下技能:

  • 如何使用 Python 构建一个基础的网页爬虫
  • 如何使用 BeautifulSoup 解析 HTML 页面
  • 如何使用正则表达式提取和筛选关键信息(如歌手名)
  • 如何将爬取结果保存到本地文件
  • 如何编写结构清晰、模块化的代码

正则表达式与爬虫技术是 Python 数据采集与分析的核心技能之一。掌握它们不仅能帮助你快速获取所需数据,还能提升你的自动化处理能力。


十二、拓展建议

如果你对本项目感兴趣,可以尝试以下进阶方向:

  • 使用 Selenium 实现动态网页数据抓取
  • 使用 pandas 将结果保存为 Excel 文件
  • 构建 GUI 界面(如 Tkinter)实现可视化操作
  • 添加多线程或多进程加快爬取速度
  • 使用 Flask/Django 构建 Web 应用展示结果

希望这篇文章能帮助你在 Python 编程之路上越走越远!

如果你觉得有收获,欢迎点赞、收藏、转发!

Tags:

最近发表
标签列表