这几天没事自己开发了一个抓取豆瓣信息的接口,是在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获取的电影信息如下图