使用php采集产品图片以及内容实例
简单需求
根据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);
}
?>