采集虾米音乐 基于phpQuery类库

采集虾米音乐 基于phpQuery类库

<!doctype html>
<head>
<title>虾米后台歌曲抓取脚本</title>
<meta charset=”utf-8″>
</head>
<style>
form{line-height:30px;}
input{width:300px;height:20px;padding:0px,3px,0px,3px;}
.i100{width:100px;}
.btn{width:100px;height:30px;background:#f90;border:none;color:#fff;}
.t_title{font-weight:700;text-align:center;}

</style>
<form action=”” method=”get” style=”line-height:30px;”>
专辑的链接地址:<input type=”text” name=”url” placeholder=”请输入专辑链接”>
专辑下歌曲数量:<input type=”text” name=”num” placeholder=”请输入歌曲数量”>
专辑下CD数量:<input type=”text” name=”cdNum” value=”1″ />
<input type=”submit” value=”开始采集” class=”btn”>
<br />
<br />
</form>
<?php
//设置php错误显示级别,屏蔽低级错误
error_reporting(E_ALL ^E_NOTICE ^E_DEPRECATED ^E_WARNING);
//包含所需要的库文件
require(‘phpQuery/phpQuery.php’);
//定义专辑URL地址
$url = $_GET[‘url’];
//定义当前专辑下面有几首歌曲
$num = $_GET[‘num’];
//定义当前有几张cd
$cdNum = $_GET[‘cdNum’];
//打开所需要抓取的专辑URL
phpQuery::newDocumentFile($url);
/*
*需要抓取得内容专辑页面
* @param $albumName 专辑名称
* @param $artist 艺人
* @param $language 语种
* @param $company 唱片公司
* @param $albumNumber 唱片编号
* @param $issueTime 发行时间
* @param $albumClass 专辑类别
* @param $albumStyle 专辑风格
* @param $introduction 专辑介绍
* @param $albumCover 专辑封面
* @param $xiamiId 虾米ID
* @param $songName 歌名
* @param $songOrder 歌曲在专辑中的顺序
*************************************************************************************************

//需要抓取的内容歌曲页面
* @param $singer 歌手
* @param $lyrics 作词
* @param $composer 作曲
* @param $arrangement 编曲
* @param $lyric 歌词
*/

//所有变量赋初始空值
$albumName = ”;
$albumCover = ”;
$songName = ”;
$songOrder = ”;
$artist = ”;
$language = ”;
$company = ”;
$albumNumber = ”;
$issueTime = ”;
$albumClass = ”;
$albumStyle = ”;
$introduction = ”;
$xiamiId = ”;
$singer = ”;
$lyrics = ”;
$composer = ”;
$arrangement = ”;
$lyric = ”;

//获取专辑页面的详细信息

//获取专辑名称
$albumName = pq(“#title h1:eq(0)”)->html();
//过滤掉专辑名称span标签的副标题
$albumName = preg_replace(“/<(span.*?)>(.*?)<(\/?span.*?)>/si”,””,$albumName);
//过滤单引号
$albumName = addslashes($albumName);
//获取专辑封面
$albumCover = pq(“.cdCover185″)->attr(‘src’);
$albumCover = str_replace(‘_2′,”,$albumCover);

//获取艺人名称
$artist = pq(“#album_info table td a:eq(0)”)->text();
$artist = addslashes($artist);

//获取语种
$language = pq(“#album_info table td:eq(3)”)->text();
$language = addslashes($language);

//获取唱片公司
$company = pq(“#album_info table td:eq(5)”)->text();
$company = addslashes($company);

//定义一个flag判断有无此选项
$flagNum = pq(“#album_info table td”)->text();
$flagNum = strstr($flagNum,’唱片编号’);
//判断有没有唱片编号,如果没有改变后面元素的位置
if($flagNum){
//获取唱片编号
$albumNumber = pq(“#album_info table td:eq(7)”)->text();
//获取发行时间
$issueTime = pq(“#album_info table td:eq(9)”)->text();
$issueTime =str_replace(‘年’,’-‘,$issueTime);
$issueTime =str_replace(‘月’,’-‘,$issueTime);
$issueTime =str_replace(‘日’,”,$issueTime);
//专辑类别
$albumClass = pq(“#album_info table td:eq(11)”)->text();
$albumClass = addslashes($albumClass);
//专辑风格
//定义专辑风格标记
$flagStyle = pq(“#album_info table td”)->text();
$flagStyle = strstr($flagStyle,’专辑风格’);
if($flagStyle){
$albumStyle = pq(“#album_info table td:eq(13) a:eq(0)”)->text();
$albumStyle = addslashes($albumStyle);
}
}else{
//获取发行时间
$issueTime = pq(“#album_info table td:eq(7)”)->text();
$issueTime =str_replace(‘年’,’-‘,$issueTime);
$issueTime =str_replace(‘月’,’-‘,$issueTime);
$issueTime =str_replace(‘日’,”,$issueTime);

//专辑类别
$albumClass = pq(“#album_info table td:eq(9)”)->text();
$albumClass = addslashes($albumClass);

//专辑风格
//判断专辑编号,和专辑风格是否存在
$flagStyle = pq(“#album_info table td”)->text();
$flagStyle = strstr($flagStyle,’专辑风格’);
if($flagStyle && $flagNum){
$albumStyle = addslashes(pq(“#album_info table td:eq(13) a:eq(0)”)->text());
}elseif($flagStyle && !$flagNum){
$albumStyle = addslashes(pq(“#album_info table td:eq(11) a:eq(0)”)->text());
}
}

//专辑介绍
//$introduction = addslashes(pq(“.album_intro_brief p”)->text());
$introduction = addslashes(pq(“.album_intro_brief”)->text());

/*
* 获取内页的歌曲详细页面然后再次抓取信息
* @param $songUrl 歌曲链接
*/
//获取当前一共有几张CD,获取每一张CD的第一首歌曲的xiamiId和歌曲名
for($j=0;$j<$cdNum;$j++){
$testName[$j] = pq(“.chapter table:eq($j) .song_name a:eq(0)”)->text();
$testUrl[$j] = pq(“.chapter table:eq($j) .song_name a:eq(0)”)->attr(‘href’);
$testXiaMiId[$j] = str_replace(‘/song/’,””,$testUrl[$j]);
//给cdOrder赋值
$cdOrder[$j] = $j+1;
}
//获取歌曲链接歌曲名称
for($i=0;$i<$num;$i++){
// $songUrl[$i] = pq(“.track_list .song_name a:eq($i)”)->attr(‘href’);
//获取歌曲url
$songUrl[$i] = pq(“.track_list .song_name:eq($i) a:eq(0)”)->attr(‘href’);
//获取歌名
$songName[$i] = addslashes(pq(“.track_list .song_name:eq($i) a:eq(0)”)->text());
//歌曲在专辑里的顺序
$songOrder[$i] = $i+1;
}
// echo ‘歌名:’;
// var_dump($songName);
//获取每首歌曲的详细信息
for($i=0;$i<$num;$i++){
// var_dump($songUrl);
//获取虾米ID
$xiamiId[$i] = str_replace(‘/song/’,””,$songUrl[$i]);

//打开所需要抓取的专辑URL
phpQuery::newDocumentFile(‘http://www.xiami.com’.$songUrl[$i]);
//获取歌手名字
$singer[$i] = addslashes(pq(“#albums_info td:eq(3) a:eq(0)”)->text());
//获取歌词内容
$lyric[$i] = trim(addslashes(pq(“.lrc_main”)->html()));
//做一个标记,查看是否存在作词
$flagLyrics = pq(“#albums_info td”)->text();
$flagLyrics =strstr($flagLyrics,’作词’);
if($flagLyrics){
$lyrics[$i] = addslashes(pq(“#albums_info td:eq(5)”)->text());
}else{
$lyrics[$i] = ”;
}

//做一个标记,查看是否存作曲
$flagComposer = pq(“#albums_info td”)->text();
$flagComposer = strstr($flagComposer,’作曲’);
if($flagComposer && $flagLyrics){
$composer[$i] = addslashes(pq(“#albums_info td:eq(7)”)->text());
}elseif($flagComposer && !$flagLyrics){
$composer[$i] = addslashes(pq(“#albums_info td:eq(5)”)->text());
}else{
$composer[$i] = ”;
}

//做一个标记,查看是否存编曲
$flagArrangement = pq(“#albums_info td”)->text();
$flagArrangement = strstr($flagArrangement,’编曲’);
if($flagComposer && $flagLyrics && $flagArrangement){
$arrangement[$i] = addslashes(pq(“#albums_info td:eq(9)”)->text());
}elseif($flagArrangement && (!$flagComposer || !$flagLyrics)){
$arrangement[$i] = addslashes(pq(“#albums_info td:eq(7)”)->text());
}elseif($flagArrangement && (!!$flagComposer && !$flagLyrics)){
$arrangement[$i] = addslashes(pq(“#albums_info td:eq(5)”)->text());
}else{
$arrangement[$i] = ”;
}

}

/*
* 写入数据到临时数据库
*
*/
//链接数据库
mysql_connect(“localhost”,’root’,”);

mysql_select_db(‘laravel’);

mysql_query(‘set names utf8’);

// for($i=0;$i<$num;$i++){

// $sql =”INSERT INTO song_temp (albumName,albumCover,songName,songOrder,artist,language,company,albumNumber,issueTime,albumClass,albumStyle,introduction,singer,lyrics,composer,arrangement,lyric,xiamiId) VALUES(‘{$albumName}’,'{$albumCover}’,'{$songName[$i]}’,'{$songOrder[$i]}’,'{$artist}’,'{$language}’,'{$company}’,'{$albumNumber}’,'{$issueTime}’,'{$albumClass}’,'{$albumStyle}’,'{$introduction}’,'{$singer[$i]}’,'{$lyrics[$i]}’,'{$composer[$i]}’,'{$arrangement[$i]}’,'{$lyric[$i]}’,'{$xiamiId[$i]}’)”;
// //echo $sql,PHP_EOL;
// $res = mysql_query($sql);
// }
// if(mysql_affected_rows()>0){
// echo ‘<font color=”red”>成功采集<b style=”color:#000;font-size:18px;”>’.$num.'</b>首歌,内容确认无误后即可入库!</font>’;
// }
// $sql = “select * from song_temp order by id asc limit {$num}”;
// $result = mysql_query($sql);
// //检测mysql返回行
// $number = mysql_num_rows($result);
//如果插入成功就显示到表单中
// if($number>0){
?>
<form action=”” method=”post”>
专辑名称:<input type=”text” value=”<?php echo $albumName; ?>” name=”albumName” /><br />
艺  人:<input type=”text” value=”<?php echo $artist; ?>” name=”artist” ><br />
语  言:<input type=”text” value=”<?php echo $language; ?>” name=”language” ><br />
发行公司:<input type=”text” value=”<?php echo $company; ?>” name=”company” /><br />
专辑编号:<input type=”text” value=”<?php echo $albumNumber; ?>” name=”albumNumber” /><br />
发行时间:<input type=”text” value=”<?php echo $issueTime; ?>” name=”issueTime” /><br />
专辑分类:<input type=”text” value=”<?php echo $albumClass; ?>” name=”albumClass” /><br />
专辑风格:<input type=”text” value=”<?php echo $albumStyle; ?>” name=”albumStyle” /><br />
专辑介绍:<textarea style=”width:1000px;height:200px;” name=”introduction”><?php echo $introduction ; ?></textarea><br />
专辑封面:<img width=”200″ height=”200″ src=”<?php echo $albumCover;?>” name=”albumCover” />
<table>
<tr>
<td class=”t_title”>编号</td>
<td class=”t_title”>歌曲名称</td>
<td class=”t_title”>歌手</td>
<td class=”t_title”>作词</td>
<td class=”t_title”>作曲</td>
<td class=”t_title”>编曲</td>
<td class=”t_title”>歌词</td>
<td class=”t_title”>虾米ID</td>
</tr>
<?php
for($i=0;$i<$num;$i++){
?>
<tr>
<td><input type=”text” value=”<?php echo $songOrder[$i];?>” class=”i100″ name=”<?php echo ‘songOrder_’.$i; ?>”/></td>
<td><input type=”text” value=”<?php echo $songName[$i];?>” name=”<?php echo ‘songName_’.$i; ?>”></td>
<td><input type=”text” value=”<?php echo $singer[$i];?>” class=”i100″ name=”<?php echo ‘singer_’.$i; ?>”></td>
<td><input type=”text” value=”<?php echo $lyrics[$i];?>” class=”i100″ name=”<?php echo ‘lyrics_’.$i; ?>”></td>
<td><input type=”text” value=”<?php echo $composer[$i];?>” class=”i100″ name=”<?php echo ‘composer_’.$i; ?>”></td>
<td><input type=”text” value=”<?php echo $arrangement[$i];?>” class=”i100″ name=”<?php echo ‘arrangement_’.$i; ?>”></td>
<td><input type=”text” value=”<?php echo $lyric[$i];?>” name=”<?php echo ‘lyric_’.$i; ?>” title=”<?php echo str_replace(‘<br>’,”,$lyric[$i]); ?>”></td>
<td><input type=”text” value=”<?php echo $xiamiId[$i];?>” class=”i100″ name=”<?php echo ‘xiamiId_’.$i; ?>”></td>
</tr>
<?php
}
?>
<tr><td><input type=”submit” value=”确认入库” class=”btn” name=”confirmButton”></td></tr>
</table>
</form>
<?php
//}
/***********
* 执行数据入库操作
* @param album 专辑表
* @param album_type 专辑分类表
* @param style 专辑风格表
* @param substyle 专辑子风格表
* @param idx_album_singer 专辑歌手索引表
* @param idx_album_style 专辑&&专辑风格所以表
* @param idx_album_type 专辑分类索引表
* @param idx_song_singer 歌曲歌手索引表
* @param singer 歌手表
* @param song 歌曲表
*
*/
//声明几个需要跳转传递的变量
$_POST[‘testXiaMiId’] = $testXiaMiId;
$_POST[‘cdOrder’] = $cdOrder;
$_POST[‘singer’] = $singer;

if(isset($_POST[‘confirmButton’])){

//添加专辑之后获取专辑的ID
$sql = “insert into album (name,comp,issuetime,description) values(‘{$_POST[“albumName”]}’,'{$_POST[“company”]}’,'{$_POST[“issueTime”]}’,'{$_POST[“introduction”]}’)”;
$result = mysql_query($sql);
$lastInsertId = ‘SELECT LAST_INSERT_ID()’;
$result = mysql_query($lastInsertId);
$album_id = mysql_fetch_assoc($result);
$album_id = $album_id[‘LAST_INSERT_ID()’];
/*
*添加歌曲信息后获取歌曲的ID
*目前流程比较复杂,先这样处理
*
*/
//循环插入歌曲信息
for($i=0;$i<$num;$i++){
$lyrics[$i] = $_POST[“lyrics_$i”];
$composer[$i] = $_POST[“composer_$i”];
$tags[$i] = ‘作词:’.$lyrics[$i].'<br>作曲:’.$composer[$i];
$sql = “insert into song (name,pubtime,albumid,geci,album_order_sn,cd_order_sn,xiami_song_id,tags) values (‘{$_POST[“songName_$i”]}’,’0000-00-00′,'{$album_id}’,'{$_POST[“lyric_$i”]}’,'{$_POST[“songOrder_$i”]}’,’1′,'{$_POST[“xiamiId_$i”]}’,'{$tags[$i]}’)”;
mysql_query($sql);
}
//修改歌曲里面的cd_order_sn属性
for($j=1;$j<=$cdNum;$j++){
//获取需要修改的cd_order_sn
$sql = “select id from song where xiami_song_id='{$_POST[“testXiaMiId”][$j-1]}'”;
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
$ids[$j] = $arr[‘id’];
//执行更改cd_order_sn
$sql1 = “update song set cd_order_sn={$_POST[“cdOrder”][$j-1]} where id>='{$ids[$j]}'”;
mysql_query($sql1);
}
//执行修改最后一张CD的编号
$sql = “update song set cd_order_sn={$cdNum} where id>={$ids[$cdNum]}”;
mysql_query($sql);
//获取去重复的歌手名称并且重新建立索引
$singerNoRepeat = array_values(array_unique($_POST[‘singer’]));
var_dump($singerNoRepeat);
$singerNum = count($singerNoRepeat);
//添加歌手信息
for($i=0;$i<$num;$i++){
//先检测是否可以添加如果库里面有了就不添加
// $sql = “select name from singer where name='{$singerNoRepeat[$i]}'”;
// $result = mysql_query($sql);
// $arr = mysql_fetch_assoc($result);
// $names[$i] = $arr[‘name’];
// if(empty($names[$i])){
$sql = “insert into singer (name) values(‘{$_POST[“singer_$i”]}’)”;
mysql_query($sql);
//}
}

//获取歌手singerIds信息,和歌曲songIds信息插入索引表
for($i=0;$i<$num;$i++){
$sql = “select id from singer where name='{$_POST[“singer_$i”]}'”;
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
//获取全部对应的歌手ID
$singerIds[$i]=$arr[‘id’];
//获取歌曲的ids信息集合
$sql = “select id from song where name='{$_POST[“songName_$i”]}’ and xiami_song_id='{$_POST[“xiamiId_$i”]}'”;
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
$songIds[$i] = $arr[‘id’];
//插入歌曲歌手索引表
$sql = “insert into idx_song_singer (singer_id,song_id) values(‘{$singerIds[$i]}’,'{$songIds[$i]}’)”;
mysql_query($sql);
}
//获取专辑分类id
$sql = “select id from album_type where name='{$_POST[“albumClass”]}'”;
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
$type_id= $arr[‘id’];
//获取专辑风格ID
$sql = “select id,pid from substyle where name like ‘%{$_POST[“albumStyle”]}%'”;
$result = mysql_query($sql);
$arr = mysql_fetch_assoc($result);
//获取专辑子风格
$sub_style_id = $arr[‘id’];
//获取专辑父风格
$style_id = $arr[‘pid’];
// 插入专辑分类索引表
$sql = “insert into idx_album_type (album_id,type_id) values(‘{$album_id}’,'{$type_id}’)”;
mysql_query($sql);
//插入专辑风格索引表
$sql = “insert into idx_album_style (album_id,sub_style_id,style_id) values(‘{$album_id}’,'{$sub_style_id}’,'{$style_id}’)”;
mysql_query($sql);

}
// echo “专辑名:”;
// var_dump($albumName);
// echo “艺名:”;
// var_dump($artist);
// echo “语言:”;
// var_dump($language);
// echo “发行公司”;
// var_dump($company);
// echo “专辑编号:”;
// var_dump($albumNumber);
// echo “发行时间:”;
// var_dump($issueTime);
// echo “专辑分类:”;
// var_dump($albumClass);
// echo “专辑风格:”;
// var_dump($albumStyle);
// echo “专辑介绍”;
// var_dump($introduction);
// //需要抓取的内容歌曲页面
// echo “歌手:”;
// var_dump($singer);
// echo “作词:”;
// var_dump($lyrics);
// echo “作曲:”;
// var_dump($composer);
// echo “编曲:”;
// var_dump($arrangement);
// echo “歌词:”;
// var_dump($lyric);
// echo “虾米ID”;
// var_dump($xiamiId);

?>

2 thoughts on “采集虾米音乐 基于phpQuery类库

回复 熊二 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据