小强:thinkphp文章采集模块开发之(一)snoopy采集网址列表实验

作者: admin 分类: php 发布时间: 2012-09-11 09:37

由于公司要开发的项目我是用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;
}
?>