使用php采集产品图片以及内容实例

作者: admin 分类: php 发布时间: 2017-04-11 07:32

需要采集页面

简单需求

根据url提取文件名,然后图片命名为c6x.jpg。产品标题保存到title.html,产品banner的描述作为产品描述保存到des.html,产品内容,整理后,保存到content.html,产品内容的图片按序号保存并最终更新到产品内容。

刚开始使用正则表达式去提取文档,发现写的正则又臭又长,感觉很通用很牛逼的样子,但是作为一个有人文情怀的极客,代码可读性太差,不优雅,因为可能过段时间自己都忘了那一堆正则他妈的是什么意思。还不能完美的解决问题,尝试使用第三方库simple_html_dom解析html文档。尝试后发现simple_html_dom解析效果不是太理想,最后使用phpQuery发现解析效果还不错,phpQuery是一个第三方的库,模拟的大部分的jquery语法,非常实用,建议看下文档。phpquery github地址 参考文档

同事也提供了一套解决方案:这套方案主要也是借助jquery解析html文档的优越性

实现方法是使用Greasemonkey脚本利用jquery直接提取输出到控制台,然后人工整理成列表或者json供PHP脚本使用。

<?php 
@header("Content-Type: text/html; charset=UTF-8");
//不限执行时间
set_time_limit(0); 
error_reporting(0);
//根据url获取产品名称
function getProductName($url){
	$str=$url;
	$file=substr($str,strripos($str, "/")+1);
	$proName=substr($file,0,strripos($file, "."));
	return $proName;

}
//根据url下载图片
function downImg($url, $saveName)
{
	$in= fopen($url, "rb");
	if($in){
		if(file_exists($saveName)){
			unlink($saveName);
		}
		$out= fopen($saveName, "wb");
		while ($chunk = fread($in,8192))
		{
			fwrite($out, $chunk, 8192);
		}
		fclose($in);
		fclose($out);

	}else{
		echo "download ".$url." falil".'</br>'.PHP_EOL;
	}
	
}

function getProSource($url){
	$title="";
	$des="";
	$content="";
	$realImgSrc=array();
	$pName=getProductName($url);

	include_once('simple_html_dom.php'); 
	// 新建一个Dom实例
	$html = new simple_html_dom();
	// 从url中加载
	$html->load_file($url);



	$h1=$html->find('#pro-slide h1');

	foreach($h1 as $element) {
		$title.=$element->plaintext;
		$content.=mb_convert_encoding($element->outertext, 'utf-8',mb_detect_encoding($element->outertext)) .PHP_EOL;
	}


	$p=$html->find('#pro-slide p');

	foreach($p as $element){
		$des.=$element->plaintext; 
		$content.=mb_convert_encoding($element->outertext, 'utf-8',mb_detect_encoding($element->outertext)) .PHP_EOL;
	}
	$content.=PHP_EOL;	

	$imgs=$html->find('#pro-slide img');
	$i=1;
	foreach($imgs as $element) {
		
		$content.="<p><img src=\"/images/{$pName}/{$pName}-{$i}.jpg\" alt=\"{$pName}-{$i}\" /></p>".PHP_EOL;
		$realImgSrc[]=$element->src; 
		$i++;
	}


	$proDetail=$html->find('.pro-detail');


	foreach($proDetail as $element) {

		

		$strProDetail=mb_convert_encoding($element->outertext, 'utf-8',mb_detect_encoding($element->outertext));
		//echo $strProDetail;
		$sHtml=str_get_html($strProDetail);
		$h=$sHtml->find('h1');
		foreach($h as $elem) 
			$content.= $elem->outertext .PHP_EOL;
		$p=$sHtml->find('p');
		foreach($p as $elem) 
			$content.= $elem->outertext .PHP_EOL; 
		$img=$sHtml->find('img');
		foreach($img as $elem) {
			$content.="<p><img src=\"/images/{$pName}/{$pName}-{$i}.jpg\" alt=\"{$pName}-{$i}\" /></p>".PHP_EOL;
			$realImgSrc[]=$elem->src;
			$i++;

		}



	}

	return array('title'=>$title,'des'=>$des,'content'=>$content,'imgs'=>$realImgSrc);

}


?>

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

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