问题分析
我和一个朋友平时都很喜欢听歌。朋友的电脑上有很多他下载的mp3文件,但是他的这些mp3文件由于年代久远,其中很多都丢失了歌手、专辑、封面等信息,所以朋友想把这些歌的信息都整理起来。我们利用爬虫就可以解决这个问题。
一开始我们打算用先获取这些mp3文件的文件名,再在百度上搜索这些歌的信息,再用爬虫获取这些信息。然而这个办法遇到了困难,第一是无法获得百度搜索所得到的网页的链接,第二是就算获得了链接,从这个网页的源代码中也不一定能获得这首歌的信息。
于是我通过浏览各个音乐网站,发现网易云音乐的网站是可以进行爬虫,并且最适合爬虫的。只要将这些歌都添加到一个歌单中,我们就可以通过爬虫获得这些歌的很多信息。
我将我想到的这个办法告诉了朋友,朋友将他的歌全部添加到了一个歌单中,我们就可以开始爬虫了。
结果展示
获取到的歌曲信息分为7列,分别为"歌曲名称",“歌曲链接”,“时长”,“歌手”,“专辑”,“专辑链接”,“专辑封面”。
我们没有设置歌手链接,是因为每首歌的歌手可能有好几个,歌手链接设置起来很麻烦。
遇到的新问题和解决方法
1.我们从一级源代码中是看不到这些信息的,于是我们使用“审查元素”,查找这些信息的源代码的位置。
可以看出这些歌的信息都处在“tbody”这一层中,所以我们将这一层的内容全部复制下来,粘贴到记事本中,命名为"b.txt"。
因为我不知道怎么获取网页中的二级源代码,所以只能用这个比较low的方法来获取代码了。
这也是我从这次爬虫中所学到的新方法,以后可以用这个方法进行更广泛的爬虫了。
2.正则表达式中问号的妙用。
只需要一个小小的问号(?)就可以让正则表达式尽量匹配到较少的字符。
比如:
name=regexpi(b,’< title="[\s\S]{1,}?">’,‘match’);
就可以让正则匹配在遇到第一个”>后就停止。
3.matlab的正则表达式无法识别问号。
所以本来是这样的代码:
albumid=regexpi(b,‘a href="/https/blog.csdn.net/album?id=[\s\S]{1,15}"’,‘match’);
只能写成这样了:
albumid=regexpi(b,‘a href="/https/blog.csdn.net/album[\s\S]{1,15}"’,‘match’);
4.字符串连接:
先初始化一个字符串数组:
albumid2=strings(1,size(album,2));
再将这个数组与其他字符串连接:
for i=1:size(album,2)
albumid2(i)=“https://music.163.com/#/album?id=”+albumid(i);
end
5.去掉数组中的重复元素(不改变数组原来的顺序)
j=1;
for i=1:size(songid,2)
if(any(songid2==songid(i))==0)
songid2(j)=songid(i);
j=j+1;
end
end
6.常见替换:
 替换成空格,"替换成双引号。
name=strrep(name,’ ‘,’ ‘);
name=strrep(name,’"’,’"’);
源代码
a=importdata('b.txt');
b=convertCharsToStrings(a);
name=regexpi(b,'<b title="[\s\S]{1,}?">','match');
name=strrep(name,'<b title="','');
name=strrep(name,'">','');
name=strrep(name,' ',' ')