php抓取页面生成html,PHP smiple html dom抓取页面内容
之前做頁(yè)面抓取,數(shù)據(jù)采集等功能的時(shí)候,第一個(gè)想到的就是用正則表達(dá)式去匹配頁(yè)面內(nèi)容。但是對(duì)于像我這種,正則只懂皮毛的人來(lái)說(shuō),寫(xiě)正則是真的很惡心的一件事。去網(wǎng)上找,也不一定能改成自己需要的正則。
今天給大家推薦一個(gè)很好用的工具smiple html dom。
文檔地址:http://www.phpddt.com/manual/simplehtmldom_1_5/manual.htm
解析器不僅僅只是幫助我們驗(yàn)證html文檔;更能解析不符合W3C標(biāo)準(zhǔn)的html文檔。它使用了類似jQuery的元素選擇器,通過(guò)元素的id,class,tag等等來(lái)查找定位;同時(shí)還提供添加、刪除、修改文檔樹(shù)的功能。當(dāng)然,這樣一款強(qiáng)大的html Dom解析器也不是盡善盡美;在使用的過(guò)程中需要十分小心內(nèi)存消耗的情況。不過(guò),不要擔(dān)心;本文中,筆者在最后會(huì)為各位介紹如何避免消耗過(guò)多的內(nèi)存。
下面是我解析的mm131.com的頁(yè)面內(nèi)容代碼,主要是盜鏈他的圖片,O(∩_∩)O哈哈~
index.php
require?'./dom/simple_html_dom.php';require?'./include/function.php';
//打開(kāi)錯(cuò)誤信息
error_reporting(E_ERROR?|?E_WARNING?|?E_PARSE);
$count?=?0;
error_reporting(0);
$url?=?trim(post("url"));
$str?=?'';
if($url){
$html?=?new?simple_html_dom();
$html->load_file($url.'.html');
$ret?=?$html->find('.content-pic?img');
$title?=?$html->find("title",0);
echo?str_ireplace("www.mm131.com","",iconv("GBK","UTF-8",$title->innertext))."
";
foreach($ret?as?$v){
if($v->src){
$str?.=?$v->src."\n";
$count++;
}
}
flush();
for($i?=?2;$i?
$html->clear();
$location?=?$url.'_'.$i.'.html';
if(!GetCurl($location)){
break;
}
$html->load_file($location);
$ret?=?$html->find('.content-pic?img');
foreach($ret?as?$v){
if($v->src){
$str?.=?$v->src."\n";
$count++;
}
}
flush();
}
echo?$count;
}
以上3個(gè)代碼塊都是index.php的內(nèi)容。
其中的require './dom/simple_html_dom.php'; 即引用的simple html dom 解析器。
function.php 只是封裝了2個(gè)方法?代碼如下:function?GetCurl($url){
$ch?=?curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,?CURLOPT_HEADER,?true);
curl_setopt($ch,?CURLOPT_NOBODY,true);
curl_setopt($ch,?CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,?CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,?CURLOPT_AUTOREFERER,true);
curl_setopt($ch,?CURLOPT_TIMEOUT,30);
$rtn?=?curl_exec($ch);
curl_exec($ch);
if(strpos($rtn,'404?Not?Found')==true)?{
return?false;
}
return?true;
}
function?post($id)?{
return?isset?(?$_POST?[$id]?)???$_POST?[$id]?:?'';
}
如何避免解析器消耗過(guò)多內(nèi)存在本文的開(kāi)篇中,筆者就提到了Simple HTML DOM解析器消耗內(nèi)存過(guò)多的問(wèn)題。如果php腳本占用內(nèi)存太多,會(huì)導(dǎo)致網(wǎng)站停止響應(yīng)等一系列嚴(yán)重的問(wèn)題。解決的方法也很簡(jiǎn)單,在解析器加載html文檔并使用完成后,記得清理掉這個(gè)對(duì)象就可以了。當(dāng)然,也不要把問(wèn)題看得太嚴(yán)重了。如果只是加載了2、3個(gè)文檔,清理或不清理是沒(méi)有多大區(qū)別的。當(dāng)你加載了5個(gè)10個(gè)甚至更多的文檔的時(shí)候,用完一個(gè)就清理一下內(nèi)存絕對(duì)是對(duì)自己負(fù)責(zé)啦^_^
總結(jié)
以上是生活随笔為你收集整理的php抓取页面生成html,PHP smiple html dom抓取页面内容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vim 显示行号_Vim给文件加行号,这
- 下一篇: php 上传文件简单实例,php文件上传