Python爬虫入门教程:如何爬取网易云音乐热歌榜歌曲
Python 爬虫入门:爬取网易云音乐热歌榜歌曲
教学目标:
- 理解网络爬虫基本原理
- 掌握
requests库的 HTTP 请求方法 - 学会使用
BeautifulSoup解析 HTML 页面 - 实现文件下载与目录管理
- 了解反爬机制与应对策略
第一小时:环境搭建与基础库使用
1. 开发环境准备(15 分钟)
知识点:
Python 解释器安装(推荐官网下载 3.8 + 版本)
pip包管理工具的使用
第三方库安装:
pip install requests beautifulsoup4 # 安装爬虫必备库
操作演示:
python --version和pip 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