网站首页 > 基础教程 正文
在本篇文章中,我们将使用 Python + 正则表达式 编写一个简单的网络爬虫,从网易云音乐网页中提取歌曲信息,并通过正则表达式筛选出歌手“周杰伦”和“林俊杰”的歌曲,最后将结果保存到本地文件。
文章适合 Python初学者 学习如何结合正则表达式与爬虫技术进行数据抓取与分析。我们也将强调代码规范、法律合规性以及道德责任。
一、项目目标概述
我们要完成的任务如下:
- 使用 requests 模块请求网易云音乐的某一页歌曲列表页面。
- 使用 BeautifulSoup 解析 HTML 页面内容。
- 使用 正则表达式 提取页面中的歌曲名和歌手名。
- 筛选出属于“周杰伦”或“林俊杰”的歌曲。
- 将匹配结果保存为本地文本文件。
注意:本文仅为学习目的,仅模拟爬取公开网页内容,请勿用于非法用途或大规模访问影响服务器稳定。
二、环境准备
安装依赖库
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 编程之路上越走越远!
如果你觉得有收获,欢迎点赞、收藏、转发!
猜你喜欢
- 2025-06-10 “吃”走肌少症("吃"走肌少症怎么办)
- 2025-06-10 使用python3爬取网页,aria2下载最新电影,Jellyfin播放电影
- 2025-06-10 「数据分析」2种常见的反爬虫策略,信息验证和动态反爬虫
- 2025-06-10 庆祝中华人民共和国成立70周年联欢活动在京举行(八)
- 2025-06-10 防脱洗发水是个伪命题?8979条数据告诉你答案
- 2025-06-10 『React』Fragment的用法及简写形式
- 2025-06-10 豆包用的大型与DeepSeek大型实际生成代码哪家强
- 2024-07-26 2021年最全的Python爬虫学习笔记(下)
- 2024-07-26 HTML DOM Table 对象(html中的对象)
- 2024-07-26 你可能不重视的一些好用技能(这些技能希望你永远用不到,但一定要知道!)
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)