·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

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

229 2
发表于 2023-4-21 22:11:53 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
网易云音乐排行榜地址:https://music.163.com/#/discover/toplist
采集网易云音乐排行榜入库并将封面、mp3上传到oss 采集,网易,网易云音乐,易云,音乐

采集内容:歌曲名称、歌手、歌曲时长、歌曲封面、歌曲本身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" style="display:none;">(.*?)<\/textarea>/',$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.     }
复制代码
说实话,这些排行榜的音乐不符合我的胃口,听着想睡觉,没有抖音的音乐有劲、有情调。我基本上算是个抖音迷,每天都要刷刷。对于音乐,我喜欢我所喜欢的经典音乐。并非所有音乐我都会听。
本文只是练习正则来匹配自己想要的结果,仅此而已。如果本文侵犯了您的版权,可以联系我进行删除。
我要说一句 收起回复

评论2

AI智能体Lv.7 发表于 2025-3-17 04:30:35 | 查看全部
要实现采集网易云音乐排行榜并入库的功能,可以分为以下几个步骤:

### 1. 采集基本信息并入库

首先,我们需要从网易云音乐排行榜页面获取歌曲的基本信息,包括歌曲名称、歌手、歌曲时长、歌曲封面、歌曲本身mp3、歌曲id等。由于页面内容是通过JavaScript动态加载的,我们可以通过分析页面结构,找到对应的数据接口。

#### 1.1 获取歌曲列表

网易云音乐排行榜的歌曲列表数据通常是通过API接口返回的JSON数据。我们可以通过抓包工具(如Fiddler、Charles等)找到对应的API接口。

假设我们找到了获取排行榜数据的API接口为:`https://music.163.com/api/playlist/detail?id=3778678`(这里的`id`是排行榜的ID,可以根据实际情况调整)。

我们可以通过以下代码获取歌曲列表:

  1. public function mp3()
  2. {
  3.     set_time_limit(0);

  4.     $api_url = 'https://music.163.com/api/playlist/detail?id=3778678';
  5.     $response = file_get_contents($api_url);
  6.     $data = json_decode($response, true);

  7.     if (isset($data['result']['tracks'])) {
  8.         foreach ($data['result']['tracks'] as $track) {
  9.             $song_id = $track['id'];
  10.             $song_name = $track['name'];
  11.             $artist = $track['artists'][0]['name'];
  12.             $duration = $track['duration'];
  13.             $cover_url = $track['album']['picUrl'];
  14.             $mp3_url = $track['mp3Url'];

  15.             // 将基本信息入库
  16.             $this->saveSongInfo($song_id, $song_name, $artist, $duration, $cover_url, $mp3_url);
  17.         }
  18.     }
  19. }

  20. private function saveSongInfo($song_id, $song_name, $artist, $duration, $cover_url, $mp3_url)
  21. {
  22.     // 这里假设你已经有一个数据库连接,并且有一个表来存储歌曲信息
  23.     $sql = "INSERT INTO songs (song_id, song_name, artist, duration, cover_url, mp3_url)
  24.             VALUES ('$song_id', '$song_name', '$artist', '$duration', '$cover_url', '$mp3_url')";
  25.     // 执行SQL语句
  26.     // ...
  27. }
复制代码


#### 1.2 处理封面和MP3文件

由于下载封面和MP3文件可能会超时,我们可以将这部分操作放到另一个程序中异步处理。

### 2. 下载封面和MP3文件并上传到OSS

我们可以编写一个独立的脚本来处理封面和MP3文件的下载和上传。

#### 2.1 下载封面和MP3文件

  1. public function downloadAndUpload()
  2. {
  3.     set_time_limit(0);

  4.     // 从数据库中获取需要处理的歌曲信息
  5.     $songs = $this->getSongsToProcess();

  6.     foreach ($songs as $song) {
  7.         $song_id = $song['song_id'];
  8.         $cover_url = $song['cover_url'];
  9.         $mp3_url = $song['mp3_url'];

  10.         // 下载封面
  11.         $cover_file = $this->downloadFile($cover_url, 'covers/' . $song_id . '.jpg');
  12.         // 下载MP3
  13.         $mp3_file = $this->downloadFile($mp3_url, 'mp3s/' . $song_id . '.mp3');

  14.         // 上传到OSS
  15.         $this->uploadToOSS($cover_file, 'covers/' . $song_id . '.jpg');
  16.         $this->uploadToOSS($mp3_file, 'mp3s/' . $song_id . '.mp3');

  17.         // 更新数据库状态
  18.         $this->updateSongStatus($song_id);
  19.     }
  20. }

  21. private function downloadFile($url, $save_path)
  22. {
  23.     $file_content = file_get_contents($url);
  24.     file_put_contents($save_path, $file_content);
  25.     return $save_path;
  26. }

  27. private function uploadToOSS($file_path, $oss_path)
  28. {
  29.     // 这里假设你已经有一个OSS客户端,并且配置好了
  30.     // 使用OSS客户端上传文件
  31.     // ...
  32. }

  33. private function getSongsToProcess()
  34. {
  35.     // 从数据库中获取需要处理的歌曲信息
  36.     // ...
  37. }

  38. private function updateSongStatus($song_id)
  39. {
  40.     // 更新歌曲状态为已处理
  41.     // ...
  42. }
复制代码


### 3. 定时任务

为了自动化这个过程,你可以设置一个定时任务(如Cron Job)来定期执行这两个脚本。

### 4. 注意事项

- **反爬虫机制**:网易云音乐可能有反爬虫机制,建议在请求时添加合理的请求头(如User-Agent)来模拟浏览器请求。
- **超时处理**:由于下载文件可能会超时,建议设置合理的超时时间,并在脚本中加入重试机制。
- **OSS配置**:确保你的OSS客户端配置正确,并且有足够的权限上传文件。

### 5. 参考文档

- [Discuz! 插件开发手册](https://www.dz-x.net/library/)
- [Discuz! 插件接口文档](https://open.dismall.com/?ac=document&page=plugin_module)
- [Discuz! 插件参数读取文档](https://open.dismall.com/?ac=document&page=plugin_vars)

通过以上步骤,你可以实现采集网易云音乐排行榜并入库的功能,并将封面和MP3文件上传到OSS。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-20 02:26:55 | 查看全部
要实现采集网易云音乐排行榜并入库的功能,可以分为以下几个步骤:

### 1. 采集基本信息并入库

首先,我们需要从网易云音乐的排行榜页面获取歌曲的基本信息,包括歌曲名称、歌手、歌曲时长、歌曲封面、歌曲本身mp3、歌曲id等。由于网易云音乐的页面是通过JavaScript动态加载的,直接通过HTTP请求获取的HTML内容可能不包含完整的歌曲信息。因此,我们需要通过分析页面的请求,找到获取数据的API接口。

#### 1.1 获取歌曲列表

网易云音乐的排行榜数据通常是通过API接口返回的JSON数据。我们可以通过浏览器的开发者工具(F12)查看网络请求,找到获取排行榜数据的API接口。

假设我们找到了获取排行榜数据的API接口为:`https://music.163.com/api/playlist/detail?id=3778678`,其中`3778678`是排行榜的ID。

我们可以通过以下代码获取歌曲列表:

  1. public function mp3()
  2. {
  3.     set_time_limit(0);

  4.     $api_url = 'https://music.163.com/api/playlist/detail?id=3778678';
  5.     $response = file_get_contents($api_url);
  6.     $data = json_decode($response, true);

  7.     if (isset($data['result']['tracks'])) {
  8.         foreach ($data['result']['tracks'] as $track) {
  9.             $song_id = $track['id'];
  10.             $song_name = $track['name'];
  11.             $artist = $track['artists'][0]['name'];
  12.             $duration = $track['duration'];
  13.             $cover_url = $track['album']['picUrl'];
  14.             $mp3_url = $track['mp3Url'];

  15.             // 将基本信息入库
  16.             $this->saveSongInfo($song_id, $song_name, $artist, $duration, $cover_url, $mp3_url);
  17.         }
  18.     }
  19. }

  20. private function saveSongInfo($song_id, $song_name, $artist, $duration, $cover_url, $mp3_url)
  21. {
  22.     // 这里实现将歌曲信息存入数据库的逻辑
  23.     // 例如使用MySQLi或PDO进行数据库操作
  24.     // 假设你已经有一个数据库连接 $db
  25.     $stmt = $db->prepare("INSERT INTO songs (song_id, song_name, artist, duration, cover_url, mp3_url) VALUES (?, ?, ?, ?, ?, ?)");
  26.     $stmt->bind_param("ississ", $song_id, $song_name, $artist, $duration, $cover_url, $mp3_url);
  27.     $stmt->execute();
  28.     $stmt->close();
  29. }
复制代码


#### 1.2 下载封面和MP3并上传到OSS

由于下载封面和MP3文件并上传到OSS可能会导致超时,我们可以将这部分操作放到另一个程序中执行。

  1. public function downloadAndUploadToOSS()
  2. {
  3.     set_time_limit(0);

  4.     // 从数据库中获取需要下载的歌曲信息
  5.     $songs = $this->getSongsToDownload();

  6.     foreach ($songs as $song) {
  7.         $song_id = $song['song_id'];
  8.         $cover_url = $song['cover_url'];
  9.         $mp3_url = $song['mp3_url'];

  10.         // 下载封面
  11.         $cover_file = $this->downloadFile($cover_url, 'covers/' . $song_id . '.jpg');
  12.         // 下载MP3
  13.         $mp3_file = $this->downloadFile($mp3_url, 'mp3s/' . $song_id . '.mp3');

  14.         // 上传到OSS
  15.         $this->uploadToOSS($cover_file, 'covers/' . $song_id . '.jpg');
  16.         $this->uploadToOSS($mp3_file, 'mp3s/' . $song_id . '.mp3');

  17.         // 更新数据库状态
  18.         $this->updateSongStatus($song_id);
  19.     }
  20. }

  21. private function downloadFile($url, $local_path)
  22. {
  23.     $file_content = file_get_contents($url);
  24.     file_put_contents($local_path, $file_content);
  25.     return $local_path;
  26. }

  27. private function uploadToOSS($local_file, $remote_path)
  28. {
  29.     // 这里实现上传文件到OSS的逻辑
  30.     // 例如使用阿里云OSS SDK
  31.     // 假设你已经有一个OSS客户端 $ossClient
  32.     $ossClient->uploadFile('your-bucket-name', $remote_path, $local_file);
  33. }

  34. private function getSongsToDownload()
  35. {
  36.     // 这里实现从数据库中获取需要下载的歌曲信息的逻辑
  37.     // 假设你已经有一个数据库连接 $db
  38.     $result = $db->query("SELECT * FROM songs WHERE status = 'pending'");
  39.     return $result->fetch_all(MYSQLI_ASSOC);
  40. }

  41. private function updateSongStatus($song_id)
  42. {
  43.     // 这里实现更新歌曲状态为已处理的逻辑
  44.     // 假设你已经有一个数据库连接 $db
  45.     $stmt = $db->prepare("UPDATE songs SET status = 'processed' WHERE song_id = ?");
  46.     $stmt->bind_param("i", $song_id);
  47.     $stmt->execute();
  48.     $stmt->close();
  49. }
复制代码


### 2. 注意事项

- **API接口**:网易云音乐的API接口可能会发生变化,因此在实际操作中需要根据最新的接口进行调整。
- **反爬虫机制**:网易云音乐可能会有反爬虫机制,建议在请求时添加适当的请求头(如User-Agent)以模拟浏览器请求。
- **OSS上传**:上传到OSS时,确保你有正确的OSS配置和权限。

### 3. 总结

通过以上步骤,你可以实现从网易云音乐排行榜采集歌曲信息并入库,然后将封面和MP3文件上传到OSS的功能。由于下载和上传操作可能会耗时较长,建议将这部分操作放到后台任务中执行,以避免超时问题。

如果你在实现过程中遇到任何问题,欢迎随时在DZ插件网(https://www.dz-x.net/)寻求帮助。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.115,GMT+8, 2025-10-2 13:58 , Processed in 0.294739 second(s), 94 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表