概述

在这一篇博客中,我会用python来实现一个简单的网络爬虫。简单的爬取一下一些音乐网站(以网易云音乐 (163.com)为例)的付费音乐。

环境准备

Python和IDE安装

首先安装python,我使用的是3.11.4. python版本迭代很快,不过这次的测试爬虫比较简单,你可以安装更新的版本如3.12.3,不会出现兼容性问题。

Python最新版本的下载地址

https://www.python.org/downloads/windows/

图片1.png

选择windows安装包install Now即可。下面两个选项可以选上。

IDE可用vscode或pycharm。不论你哪一个,知道怎么打开终端(Terminal)就可以。

微信图片_20241006165616.png

Vscode的命令行一开始是隐藏的。用鼠标拖动下部边缘,向上拉起就能看到了。

Requests库的安装

requests属于第三方库,Python不内置,因此需要我们手动安装。无论是Windows、Linux还是Mac,都可以通

过包管理工具pip来安装requests。

在编译器的终端界面运行如下命令,即可完成requests库的安装:

pip install requests

Pycharm的终端在这里打开

图片2.png

使用vscode并在终端里完成pip install requests。

安装完成后可以验证一下。

•首先在编译器的终端(Terminal)中启用python环境

•在命令行中输入import requests库来测试requests是否安装成功。

没出现报错信息,则说明requests库安装成功。

图片3.png

另一个方法,新建一个.py文件,输入import requests,如果没有出现下划波浪线,则说明该库可以正常使用。

图片4.png

对网页进行分析:

通过对每首歌曲打开,进行网页源代码分析不难发现,本网页的10首歌曲都有一个共同的特点:

即前面的网址为 https://music.163.com/m/song?id= 加每首歌曲的 id 号,这很简单。

联想截图_20241006203002.png

然而,我们永远想得过于简单了,到目前为止,我们仅仅是找到了些许规律,但是要真正下载到每一首歌曲,还遥不可及。
因为我们进行了这么久的分析,并没有找到歌曲的真正链接。

联想截.png

通过对这些内容的查找,我们是可以说,根本就无法找到音乐文件(MPEG、MP3、MPEG-4、MIDI、WMA、M4A等)。

对文件进行筛选后,我们可以找到MP3文件,当点击这些文件打开时会发现,有一个新的 Request URL

联想截图_20241006200325.png

编写代码

首先,我们需要导入所需的库:

1
2
import requests
from bs4 import BeautifulSoup

然后,我们可以创建一个函数,指定了要发送请求的URL。

1
2
def get_music_url():
url = 'https://music.163.com/' # 替换为你要抓取音乐的网站URL

接下来使用BeautifulSoup对网页进行解析;然后,根据网页结构找到目标元素;接着,从该元素中提取出音乐文件的URL;最后,将这个URL保存在music_url变量中并返回。

  response = requests.get(url)

    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # 在这里使用BeautifulSoup解析页面,找到包含音乐文件URL的元素
        # 进行相应的操作,提取音乐文件URL

        music_url = ''  # 这里存储你获取到的音乐文件URL
        return music_url
    else:
        print('Failed to access the website.')
        return None

这里我们编写一个函数来下载音乐文件:

1
2
3
4
5
6
7
8
9
def download_music(music_url, file_name):
response = requests.get(music_url)

if response.status_code == 200:
with open(file_name, 'wb') as file:
file.write(response.content)
print('Music downloaded successfully.')
else:
print('Failed to download the music.')

这个函数设计有两个输入参数:music_url,它指向音乐文件的网络地址;file_name,它定义了音乐文件在本地存储时的名称(这个名称需要包含文件的扩展名,例如.mp3)。

函数内部会调用requests.get方法来访问music_url所指向的音乐文件。一旦成功获取到文件内容,函数会将这些内容保存到本地,文件名由file_name参数指定。

最后,我们可以编写一个主函数来使用上述两个函数:

1
2
3
4
5
6
7
8
9
10
def main():
music_url = get_music_url()
if music_url:
file_name = 'music.mp3' # 替换为你要保存的文件名
download_music(music_url, file_name)
else:
print('Failed to get the music URL.')

if __name__ == '__main__':
main()

运行程序以后我们可以再终端里看到下载成功的提示

下.png

联想截图_20241006220527.png
联想截图_20241006220934.png

可以看到,MP3文件已经被下载下来了。