去评论
dz插件网

采集网易云音乐排行榜入库并将封面、mp3上传到oss

xiao9469
2023/04/21 22:11:53
网易云音乐排行榜地址:https://music.163.com/#/discover/toplist


采集内容:歌曲名称、歌手、歌曲时长、歌曲封面、歌曲本身mp3、歌曲id
经过分析:歌曲列表里的内容在网页上分为歌曲名称、属性两大部分组成,由页面js通过歌曲id对应上,再展示到页面,即你看到的页面。
由于下载歌曲封面、歌曲mp3并再上传到oss可能会导致超时,所以分为两部分:一部分只取歌曲的基本信息,另一个程序根据基本信息取封面、mp3下载并上传到oss。

1、采集基本信息并入库:
  1.     public function mp3()
  2.     {
  3.         set_time_limit(0);
  4.         $caiji_list   = 'https://music.163.com/discover/toplist';
  5.         $html         = curl_($caiji_list);//自定义写的获取html信息函数,也可以直接用file_get_contents替换
  6.         preg_match('|(?<=<ul class="f-hide">)(.*?)(?=</ul>)|', $html, $matches);
  7.         if(empty($matches[0]))
  8.         {
  9.             echo '没有获取到数据';
  10.             return ;
  11.         }
  12.         $html2 = $matches[0];
  13.         unset($matches);
  14.         preg_match_all('/((id=(\d)+(?="))|((?<=">)(.*?)(?=<)))/', $html2, $matches);
  15.         if(empty($matches[0][0]))
  16.         {
  17.             echo '获取li里数据时错误';
  18.             return ;
  19.         }
  20.         $lis = $matches[0];
  21.         unset($matches);
  22.         $len = count($lis)/2;
  23.         for($i=0; $i<$len; $i++)
  24.         {
  25.             $j = $i * 2 + 1;
  26.             $k = $i * 2;
  27.             $data[$lis[$k]] = $lis[$j];
  28.         }
  29.         if(empty($data))
  30.         {
  31.             echo '组装好的$data数据为空';
  32.             return ;
  33.         }
  34.         //dd($data);//  示例数据: [id=1449794966] => 遇到, 入库即可
  35.         $dbmusic = Db::name('music');
  36.         foreach($data as $k => $v)
  37.         {
  38.             $tmp = explode('=', $k);
  39.             $id  = $tmp[1] ?? 0;
  40.             $row = $dbmusic->where('songid', $id)->find();
  41.             if(empty($row['songid']))
  42.             {
  43.                 $insert_data = [
  44.                     'title' => $v,
  45.                     'songid'=> $id,
  46.                 ];
  47.                 $dbmusic->insert($insert_data);
  48.             }
  49.         }
  50.         preg_match('/<textarea id="song-list-pre-data" ,$html, $matches);
  51.         if(empty($matches[1]))
  52.         {
  53.             echo '无法匹配到歌曲其它信息';
  54.             return ;
  55.         }
  56.         $song_other = $matches[1];
  57.         unset($matches);
  58.         $json = json_decode($song_other, true);
  59.         foreach($json as $k => $v)
  60.         {
  61.             $id         = $v['id'];
  62.             $duration   = intval($v['duration']/100);
  63.             $artistName = $v['artists'][0]['name'] ?? '';
  64.             $update = [
  65.                 'duration'  => $duration,
  66.                 'artistName'=> $artistName,
  67.             ];
  68.             $dbmusic->where('songid', $id)->update($update);
  69.         }
  70.         echo $caiji_list . '基础数据已经入库';
  71.         return;
  72.     }
2、根据基本信息获取图片、mp3下载到本地并上传到oss:
  1. //采集图片、下载mp3
  2.     public function mp33()
  3.     {
  4.         set_time_limit(0);
  5.         $dbmusic = Db::name('music');
  6.         $rows    = $dbmusic->where('songid', '<>', 0)->where('playPath', '')->select();
  7.         foreach($rows as $k => $v)
  8.         {
  9.             $urlimg = 'https://music.163.com/song?id='.$v['songid'];
  10.             $html   = curl_($urlimg);
  11.             preg_match('/(?<=<img src=")(.*?)(?=" class="j-img")/', $html, $match);
  12.             if(empty($match[1]))
  13.             {
  14.                 continue;
  15.             }
  16.             $remote_img_url = $match[1];
  17.             unset($match);
  18.             $img_short_name =  $v['songid'].'.jpg';
  19.             $filename       =  TEMP_PATH . $img_short_name;
  20.             file_put_contents($filename, file_get_contents($remote_img_url));
  21.             if(is_file($filename))
  22.             {
  23.                 $ret = upload_file_to_oss('home/music/20200523/', $filename);
  24.                 $url = $ret['code'] == 200 ? $ret['data'] : '';
  25.                 if($url)
  26.                 {
  27.                     $dbmusic->where('songid', $v['songid'])->update(['image'=>$url, 'create_time'=>time()]);
  28.                     @unlink($filename);
  29.                 }
  30.             }
  31.             //下载mp3
  32.             $download_url   = 'http://music.163.com/song/media/outer/url?id='.$v['songid'].'.mp3';
  33.             $mp3_short_name = $v['songid'].'.mp3';
  34.             $mp3filename    = TEMP_PATH . $mp3_short_name;
  35.             file_put_contents($mp3filename, file_get_contents($download_url));
  36.             if(is_file($mp3filename))
  37.             {
  38.                 $ret = upload_file_to_oss('home/music/20200523/', $mp3filename);
  39.                 $url = $ret['code'] == 200 ? $ret['data'] : '';
  40.                 if($url)
  41.                 {
  42.                     $dbmusic->where('songid', $v['songid'])->update(['playPath' => $url]);
  43.                     @unlink($mp3filename);
  44.                 }
  45.             }
  46.         }
  47.         echo '数据已经更新,请查看';
  48.         return ;
  49.     }
说实话,这些排行榜的音乐不符合我的胃口,听着想睡觉,没有抖音的音乐有劲、有情调。我基本上算是个抖音迷,每天都要刷刷。对于音乐,我喜欢我所喜欢的经典音乐。并非所有音乐我都会听。
本文只是练习正则来匹配自己想要的结果,仅此而已。如果本文侵犯了您的版权,可以联系我进行删除。