小强:thinkphp文章采集模块开发之(一)snoopy采集网址列表实验
由于公司要开发的项目我是用thinkphp建的,又需要采集功能进行文章、商品的采集,在网上找便了,好像没有类似的教程,所以自己研究了,打算仿照dedecms和phpcms里的采集模块写,由于刚开始研究,还没有完善,在这第一篇教程里只给出我做实验的代码吧,这段代码是实现采集文章列表的功能,本功能用到了snoopy类,大家可到官网上下,这此不提供了,对于snoopy类采集某些网站读取不到内容的解决办法请参照上篇文章:http://www.baidu3k.com/archives/576
以下是实验代码,并附带一个补全url的方法,是取自dedecms:
?Download download.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
<?php require_once 'Snoopy.class.php'; $snoopy = new Snoopy(); $sourceURL = "http://www.bjcang.cn/article_cat-14.html"; //要采集文章列表的网址 $snoopy->fetch($sourceURL); $fileContent = $snoopy->results; $start_str = '<dl>'; //文章列表的开始标记 $end_str = '<div id="pager">'; //文章列表的结束标记 $start_num = stripos($fileContent, $start_str)+strlen($start_str); $end_num = stripos($fileContent, $end_str)-$start_num; $fileContent = substr($fileContent, $start_num, $end_num); $fileContent = strip_tags($fileContent, '<a>'); $a = "/<a.*?href=[\"\'](.*?)[\"\'][^>]*>(.*?)<\/a>/i"; preg_match_all($a, $fileContent, $content); foreach ($content[1] as $k=>$v){ $content[1][$k] = FillUrl($sourceURL, $v); } print_r($content); /** * 补全网址 * * @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; } ?> |