这几天没事自己开发了一个抓取豆瓣信息的接口,是在phpcms上做的二次开发了,基本没动源程序。
好了,一般都不太喜欢废话,直接上代码吧:
api目录下创建一个抓取豆瓣信息的接口文件get_dbinfo.php,内容如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
/*********************
custom field
#dbid 豆瓣ID
#years 发布年份
#dbinfo 豆瓣资料
#dbscore 豆瓣评分
#description 电影简介
**********************/
function GrabImage($url, $img_path) {
if ($url == ""){
return false;
}
$filename = date("Ymdhis").".jpg ";
ob_start();//打开输出
readfile($url);//输出图片文件
$img = ob_get_contents();//得到浏览器输出
ob_end_clean();//清除输出并关闭
$size = strlen($img);//得到图片大小
$fp2 = @fopen($img_path.$filename, "a");
fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名
fclose($fp2);
return $filename;//返回新的文件名
}
$dbid = intval($_GET['id']);
$db_url = "https://movie.douban.com/subject/";
$item = file_get_contents($db_url.$dbid);
//电影海报
$pic_start = strpos($item, "<div id=\"mainpic\" class=\"\">");
$pic_end = strpos($item, "<div id=\"info\">") - 16;
$pic_length = $pic_end - $pic_start;
$pic = substr($item, $pic_start, $pic_length);
$pic_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|webp)).*?>/i';
preg_match($pic_tag, $pic, $img_url);
$img_path = "uploadfile/".date("Y/md/");
if(!file_exists($img_path)){
mkdir($img_path, 0777, ture);
}
$picname = GrabImage($img_url[1], $img_path);
$data[0]['pic'] = APP_PATH.$img_path.$picname;
//电影名字
preg_match("/<span property=\"v:itemreviewed\">(.*)<\/span\>/i", $item, $title);
$data[0]['name'] = $title[1];
//上映年份
preg_match("/<span class=\"year\">(.*)<\/span>/i", $item, $years);
$posttime = ereg_replace("\(|\)","",$years[1]);
$data[0]['years'] = $posttime;
//电影信息
$content_start = strpos($item, "<div id=\"info\">") + 16;
$content_end = strpos($item, "<div id=\"interest_sectl\">");
$content_length = $content_end - $content_start;
$content_str = substr($item, $content_start, $content_length);
$content = str_replace("</div>", "",$content_str);
$content = ereg_replace("<a [^>]*>|<\/a>","",$content);
$content1 = ereg_replace("<span class=\"pl\">IMDb链接:<\/span> (.*)<br>", "", $content);
$content2 = ereg_replace(" property=\"v:genre\"| property=\"v:runtime\"| property=\"v:initialReleaseDate\"", "", $content1);
$data[0]['content'] = trim($content2);
//电影评分
preg_match("/<strong class=\"ll rating_num\" property=\"v:average\">(.*)<\/strong>/i", $item ,$score);
$data[0]['score'] = $score[1];
//电影类型
preg_match("/<span property=\"v:genre\">(.*)<\/span>/i", $content, $type);
$type = str_replace("/ ", "", $type[0]);
$data[0]['type'] = strip_tags($type);
//IMDB ID
preg_match("/<span class=\"pl\">IMDb链接:<\/span> (.*)<br>/i", $content, $imdbid);
$data[0]['imdbid'] = $imdbid[1];
//电影简介
$description_start = strpos($item, "<div class=\"indent\" id=\"link-report\">");
if($description_start){
$description_str = substr($item, $description_start);
$description_end = strpos($description_str, "</div>");
$description = substr($description_str, 0, $description_end)."</div>";
//$description = ereg_replace("<a [^>]*>(.*)<\/a>","",$description);
$data[0]['description'] = $description;
}else{
$data[0]['description'] = "暂无电影介绍";
}
echo json_encode($data);
?>使用这个当然你还得创建一下自定义字段,当然要对应我接口上的dom标签的名字来,豆瓣id 字段名dbid(int),发布年份 字段名years (int(4)) 豆瓣资料 字段名dbinfo (mediumtext) 豆瓣评分 dbscore (decimal(1,1)) ,电影类型直接使用关键词表单,IMDB ID 字段名imdbid(int) ,电影简介这个使用原文件内容的编辑器
接口写好了,返回来的是JSON数据,我们来改添加文件的地方,是content_add.tpl.php(如果是编辑那就是content_edit.tpl.php)这个文件,添加一个ajax并在豆瓣ID后面添加一个获取按钮,主要都是操作DOM树,直接上代码
$("#dbid").after("<input type='button' name='dbid' id='btn' value='获取豆瓣信息' />");
$("#dbid").attr("placeholder","请输入豆瓣ID来获取信息!");
$("#btn").click(function(){
if($("#dbid").val()==""){
alert("请先输入豆瓣ID,再点击获取豆瓣信息!");
$("#dbid").focus();
return false;
}else{
var dbid = $("#dbid").val();
$.get("/api.php?op=get_dbinfo", {id:dbid},
function(data){
//alert(data);
var info = eval(data);
$("#thumb_preview").attr("src",info[0]['pic']);
$("#thumb").val(info[0]['pic']);
$("#title").val(info[0]['name']);
$("#years").val(info[0]['years']);
$("#dbinfo").val(info[0]['content']);
$("#dbscore").val(info[0]['score']);
$("#keywords").val(info[0]['type']);
$("#imdbid").val(info[0]['imdbid']);
//$("#content").val(info[0]['description']);
var ckEditor = CKEDITOR.instances.content;
ckEditor.setData(info[0]['description']);
});
}
}); 目前只抓取了这些资料,点击豆瓣ID获取的电影信息如下图

内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://sulao.cn/post/384
相关阅读
- python下自定义k8s操作类及使用方法
- apiserver报错failed with: failed to retrieve openAPI spec, http error: ResponseCode: 503
- apiserver报http: TLS handshake error from xxx:xxx: remote error: tls: bad certificate
- kubelet报错nable to connect to the server: x509: certificate is valid for xxx, not xxx
- phpcms二次开发增加分词百度分词接口功能
- PHPCMS程序删除文章后TAG标签记录仍存在数据库中的解决方案
- phpcms二次开发增加网站快速登录功能
- phpcms二次开发图片采集接口
- php使用阿里大鱼短信API实现验证码短信发送和查询
- phpcms二次开发添加评分系统
评论列表