小强:thinkphp文章采集模块开发之(二)snoopy采集文章内容实验
上次给出了文章列表的采集实验程序后本博主到现在为止初步完成了thinkphp采集模块的大部分功能了,跟phpcms的采集模块很像,现在只差文章内容的采集了,可以先看个图先,展示一下本博主最近的成果,哈哈哈。。。
上面这是采集节点的管理页面
以上这几个就是添加采集节点的界面啦
上面这个是测试采集文章列表的
这个就是正牌的列表采集进行中界面
上面这个就是采集完成入库的文章列表啦,由于文章内容还没采集,所以result还是NULL,怎么样还不错吧,是不是很期待,那就期待着吧先,本博主还 会继续写下去的,在后面的文章里我会一一把源码放上来的,希望能帮到有需要的朋友,也希望朋友们能多多来博客看我给我留言啊!
下面就是开发thinkphp文章内容采集模块所用到的实验代码了:
fetch($sourceURL);
$c = $snoopy->results;
$c_p = $c;
$data = array();
//文章标题的标记
$c_title_s = '';
$c_title_e = '
';
//文章内容的标记
$c_content_s = '';
$c_content_e = '';
//文章分页的标记(这里用的是全部列出式,我见到的分页几乎都是全部列出式,这种方式很普遍也比较好操作)
$page_s = '';
$page_e = '';
//采集文章标题
$start_num = stripos($c, $c_title_s)+strlen($c_title_s);
$end_num = stripos($c, $c_title_e)-$start_num;
$data['title'] = substr($c, $start_num, $end_num);
$data['title'] = strip_tags($data['title']);
//采集文章内容的第一页
$start_num = stripos($c, $c_content_s)+strlen($c_content_s);
$end_num = stripos($c, $c_content_e)-$start_num;
$data['content'] = substr($c, $start_num, $end_num);
$data['content'] = strip_tags($data['content'],'
');
//采集文章的分页链接
$start_num = stripos($c, $page_s)+strlen($page_s);
$end_num = stripos($c, $page_e)-$start_num;
$c_p = substr($c_p, $start_num, $end_num);
$c_p = strip_tags($c_p, '');
$a = "/]*>(.*?)<\/a>/i";
preg_match_all($a, $c_p, $content);
$l = array();
foreach ($content[1] as $k=>$v){
if (trim($v) != $sourceURL && !in_array(trim($v), $l)){
$l[$k] = FillUrl($sourceURL, trim($v));
}
}
//采集文章的分页内容
foreach ($l as $v){
$snoopy->fetch($v);
$c = $snoopy->results;
$start_num = stripos($c, $c_content_s)+strlen($c_content_s);
$end_num = stripos($c, $c_content_e)-$start_num;
$temp_c = substr($c, $start_num, $end_num);
$temp_c = strip_tags($temp_c,'
');
$data['content'] .= $temp_c;
}
//完成
print_r($data);
/**
* 补全网址
*
* @access public
* @param string $refurl 来源地址
* @param string $surl 站点地址
* @return string
*/
function FillUrl($refurl,$surl)
{
$i = $pathStep = 0;
$dstr = $pstr = $okurl = '';
$refurl = trim($refurl);
$surl = trim($surl);
$urls = @parse_url($refurl);
$basehost = ( (!isset($urls['port']) || $urls['port']=='80') ? $urls['host'] : $urls['host'].':'.$urls['port']);
//$basepath = $basehost.(!isset($urls['path']) ? '' : '/'.$urls['path']);
//由于直接获得的path在处理 http://xxxx/nnn/aaa?fdsafd 这种情况时会有错误,因此用其它方式处理
$basepath = $basehost;
$paths = explode('/',preg_replace("/^http:\/\//i", "", $refurl));
$n = count($paths);
for($i=1;$i < ($n-1);$i++)
{
if(!preg_match("/[\?]/", $paths[$i])) $basepath .= '/'.$paths[$i];
}
if(!preg_match("/[\?\.]/", $paths[$n-1]))
{
$basepath .= '/'.$paths[$n-1];
}
if($surl=='')
{
return $basepath;
}
$pos = strpos($surl, "#");
if($pos>0)
{
$surl = substr($surl, 0, $pos);
}
//用 '/' 表示网站根的网址
if($surl[0]=='/')
{
$okurl = $basehost.$surl;
}
else if($surl[0]=='.')
{
if(strlen($surl)<=2)
{
return '';
}
else if($surl[1]=='/')
{
$okurl = $basepath.preg_replace('/^./', '', $surl);
}
else
{
$okurl = $basepath.'/'.$surl;
}
}
else
{
if( strlen($surl) < 7 )
{
$okurl = $basepath.'/'.$surl;
}
else if( preg_match("/^http:\/\//i",$surl) )
{
$okurl = $surl;
}
else
{
$okurl = $basepath.'/'.$surl;
}
}
$okurl = preg_replace("/^http:\/\//i", '', $okurl);
$okurl = 'http://'.preg_replace("/\/{1,}/", '/', $okurl);
return $okurl;
}
?>
朋友们也可以根据上篇文章(小强:thinkphp文章采集模块开发之(一)snoopy采集网址列表实验)来结合,构成一个完整的采集实验代码,那就根据自己需要来了!
更多阅读