头像

用QueryList+thinkphp批量采集一个图片网站并保存到数据库的完整实例(2)

2017-09-07 11:05:57 来源:好分享   浏览()   评论 ( 0 )   

我们继续昨天没说完的内容。昨天说到了获取列表url批量采集详情页,抓取标题、关键词、描述和下载内容图片到本地的部分。今天我们讲下如何用QueryList+thinkphp抓取内容分页中的图片。


用QueryList+thinkphp批量采集一个图片网站并保存到数据库的完整实例(2)


思路是这样的:

第一、先获取到内容分页的规则;

第二、循环抓取分页中的图片src;

第三、把抓取到的图片src保存到一个数组中;

第四、批量下载图片到本地;

第五、把下载完的图片本地链接返回到采集主体函数中和内容一起保存到数据库。


下面开始说详细的采集过程。

目标链接:http://www.shuaigetu.net/xiaocao-118.html

该页面共有29个图片分页,内容通用的分页参数是“-p-”。


这里可能有朋友要问了,每个详情页的分页数都不同,那我应该如何获取它的页数呢?其实我们没必要去获取页数,我们只需要用do...while循环就能探测到它的页数,代码如下:


<?php
/*
$pageurl 详情页链接
$parameter  分页参数
*/
public function get_piclist($pageurl,$parameter){
//抓取分页图片
$piclist = array();
$ext = '.html';  //链接后缀
$tmpurl = str_replace($ext,'',$url);  //去掉链接后缀
$status = 1;
$p = 1;  //设置初始分页数
//循环抓取分页
do {
//拼接内容分页url
if($p > 1){
$pageurl = $tmpurl.$parameter.$p.$ext;
}
$reg = array(
pics" => array(".img_box img","src")  //图片匹配规则
);
$ql = QueryList::Query($pageurl,$reg);
$data = $ql->getData();
//为了避免出现死循环,这里要判断退出循环的条件,1、是否为空;2、抓取到的src是否重复;3、是否为图片格式。
if(!empty($data[0]['piclist']) && !in_array($data[0]['piclist'],$piclist)){
$imgext = strrchr($data[0]['piclist'],'.');
if($imgext == '.jpg' || $imgext == '.png' || $imgext == '.gif'){
$piclist[] = $data[0]['piclist'];
}else{
$status = 0;
}
}else{
$status = 0;
}
$p++;
} while ($status==1);
//最终我们得到了一个图片链接的数组$piclist
if(!empty($piclist)){  //如果数组不为空,那么就开始批量下载图片到本地,并返回路径
$pics = $this->downpics($piclist);
}
}
//批量下载图片
public function get_picurls($data){
$piclist = array();
foreach($data as $key=>$vo){
$picsrc = $vo;
$ext = strrchr($picsrc,'.');
$filename = md5($picsrc).$ext;
$localSrc = 'image/'.md5($src).$filename;
//下载图片
$status = $this->donwnload($picsrc,$localSrc);
if(!$status){
echo '['.$picsrc.']文件下载出错!<br>';
}else{
$piclist[] = $localSrc;
}
}
return $piclist;
}
//下载文件
public function donwnload($src,$localSrc){
//下载图片
ob_start();  
readfile($src); 
$stream = ob_get_contents();  
ob_end_clean();
$fp2=@fopen($localSrc,'a'); 
$result = fwrite($fp2,$stream);
fclose($fp2);
return $result;
}
?>


最终,我们得到了一个本地化的图片路径数组$pics,然后就可以根据自己数据库保存规则和之前采集到的数据一起进行处理保存了。给大家分享的内容已经讲完了,如果还有不清楚的朋友可以在下面评论区留言,或者直接加我QQ咨询。


声明:转载请注明来源(好分享)并保留原文链接:http://www.hfx8.com/jishu-555.html
评论0

后面还有条评论,点击查看>>