写了一个采集程序 但是采集的时候总是采集不全 比如目标网站更新了10条数据 我采集过来的只有3-5条(写的正则表达式都可以匹配这10条数据的)而且经常在采集过程中出现502错误 我用的是Nginx+php+mysql
采集的过程是这样的:
循环本站的一个栏目下的文章 比如有100篇
根据这一百篇的id 去目标网站找相关的文章
把这写相关的文章 插入到我网站的数据库程序 用到了4个while循环
我认为出现爬取不完全的现象 是因为服务器在处理这个程序的时候 因为执行时间太长 所以没有全部爬过来 大家有没有其他的看法 请高手指点
采集的过程是这样的:
循环本站的一个栏目下的文章 比如有100篇
根据这一百篇的id 去目标网站找相关的文章
把这写相关的文章 插入到我网站的数据库程序 用到了4个while循环
我认为出现爬取不完全的现象 是因为服务器在处理这个程序的时候 因为执行时间太长 所以没有全部爬过来 大家有没有其他的看法 请高手指点
cid name(栏目名称) navigation(描述) wiki_doc
did title(文章标题) conent(文章内容)
function docate(){
$docs=array();
$query=$this->db->query("SELECT * FROM wiki_categorylink as a WHERE a.cid=71"); //得到一个栏目下所有的文章 cid为栏目编号
while($row=$this->db->fetch_array($query)){
$sql="SELECT title FROM wiki_doc WHERE did=".$row['did']; //根据得到的没个did 去查询每个文章
$query2 =$this->db->query($sql);
while($row2=$this->db->fetch_array($query2)){
preg_match("/[A-Z|\/]*?[\d|.]*?\-\d{4}/",$row2['title'], $match);
$row2['title']=$match[0]; //对每个文章标题进行处理 处理后的标题可以用于 目标网站的查询
$str=urlencode($row2['title']);
$url="http://www.XXXX.com/s.jsp?keyword=".$str;
$stream = fopen($url, 'r');
$html=stream_get_contents($stream);
preg_match_all('~onclick="mClk\((.*?)\);"~is',$html,$data);
fclose($stream);//第一次查询 得到目标网站栏目页
$url2="http://www.XXX.com/detail/".$data[1][0].".html";
$stream2 = fopen($url2, 'r');
$html2=stream_get_contents($stream2);
$html2 = iconv("gbk", "utf-8//IGNORE",$html2);
preg_match_all("~<b>>></b><a href=(.*?) target='_blank'>(.*?)</a><b>>></b><a href=(.*?) target='_blank'>(.*?)</a>~is",$html2,$data2);
$cate=preg_replace("/[A-Z|0-9]{1,2}(.*?)/i","\\1",$data2[4][0]);
fclose($stream2);//进入栏目页 获得需要的内容
if($cate){
$query3=$this->db->query("SELECT * from wiki_category where name like '%".$cate."%' and navigation like '%SN%'");
$num =$this->db->num_rows($query3);
if($num==1){
while($row3=$this->db->fetch_array($query3)){
print_r($row['did'].'ok');
$this->db->query("UPDATE wiki_categorylink SET cid=".$row3['cid']." WHERE did=".$row['did']);//更新数据库
}
}
}
}
}
}
http://topic.csdn.net/u/20080824/07/0125890f-9a98-4296-ad84-c5c748c17581.html