dedecms是一个开源的网站管理系统,内含的采集器功能比较强大和易用。然而作为一个
通用的采集器,它只能从一个列表页中选取合适的采集页,针对一个采集的对象下载一个
网页,对该网页内容做分析,通过采集规则的匹配完成字段的采集,在用途上往往会受到
限制,本文就是结合实际应用对该采集器扩充功能。
扩展一:重写待采集url
问题的提出: sohu影视库的列表页为[url]http://data.yule.sohu.com/movie/film.html[/url] 从列表页中可以采集到的页面为[url]http://data.yule.sohu.com/movie/data/23639/[/url] 但是发现这些页面中只是概要信息,详细信息的采集需要重新定向到
[url]http://data.yule.sohu.com/movie/data/23639/details.html[/url]
解决方法: 这个问题解决较为容易,只需要找到待采集的url,做一个字符串替换。
具体做法 打开include/pub_collection.php 1)在大约730行的地方,INSERT INTO #@__courl语句执行之前,对$k做处理。(注:对最
终采集过程起作用) 2)在大约615行的地方,两个echo "$k - ".$v."\r\n"语句之前,对$k做处理。(注:对测试结
果的显示起作用) 例如针对上面的问题,可以执行$k=eregi_replace("(/[0-9]{5})","\\1/details.html","$k");
扩展二:采集的字段属于不同的页面
问题的提出: mtime电影库的列表页为[url]http://www.mtime.com/movie/new/[/url] 从列表页中可以采集到的页面为[url]http://www.mtime.com/movie/71373/[/url] 但是这些页面中也是概要信息,有些字段的采集需要到其它相关页面去采集。例如上映
时间需要到[url]http://www.mtime.com/movie/71373/releaseinfo.html[/url],详细剧情需要到
[url]http://www.mtime.com/movie/71373/plots.html[/url]
解决方法: 对于一个采集对象,系统只下载一个网页然后进行分析,所以需要扩充底层的数据结构,
使其可以下载多个页面,并且不同的字段可以选择不同的页面作为采集的来源。
具体做法: 打开include/pub_collection.php 1)在DedeCollection类的成员变量定义中,tmpHtml是保存下载的采集页面。这里需要增加
一个数组成员变量tmpHtmls,用来保存下载的其它多个页面。 2)参考DownOnePage函数,写一个DownAllPages函数,用来下载指定的多个页面。 function DownAllPages($dourl){ $collectHtmlLists=array("plots.html","releaseinfo.html","details.html"); foreach($collectHtmlLists as $value){ $httempurl = $dourl.$value; $this->CHttpDown->OpenUrl($httempurl); $tmpHtmls[$value] = $this->CHttpDown->GetHtml(); $this->ChangeCode($tmpHtmls[$value]); } $this->CHttpDown->Close(); return $tmpHtmls; } 3)在GetPageFields函数中,增加字段的页面选择 即把$v = $this->GetHtmlArea("[var:内容]",$sarr["match"],$this->tmpHtml); 中的第三个参数改为合适的页面。 4)在DownUrl函数中,增加对DownAllPages函数的调用 $htmls = $this->DownAllPages($dourl); $this->tmpHtmls = $htmls;
转载于:https://blog.51cto.com/onlyforlin/95116