求个分页采集思路。
时间:2011-04-28
来源:互联网
当分布是以部分列出时
比如第1页的分页链接
[1] 2 3 4
第2页的分布链接
1 [2] 3 4 5
第3页的分布链接
1 2 [3] 4 5
第4页的分布链接
2 3 [4] 5 6
第5页的分布链接
3 4 [5] 6 7
……
求助这种情况需要如何采集。
我先前的想法是采用递归,发现自己用递归用得不熟悉,算法里有错,造成内存溢出。
我的递归是这样的,麻烦大家帮我指出错误。
比如第1页的分页链接
[1] 2 3 4
第2页的分布链接
1 [2] 3 4 5
第3页的分布链接
1 2 [3] 4 5
第4页的分布链接
2 3 [4] 5 6
第5页的分布链接
3 4 [5] 6 7
……
求助这种情况需要如何采集。
我先前的想法是采用递归,发现自己用递归用得不熟悉,算法里有错,造成内存溢出。
我的递归是这样的,麻烦大家帮我指出错误。
复制内容到剪贴板
//ini_set("memory_limit" , "128M");
static $tmpcontent = array();
static $tmpurl = array();
static $data = array();
$decode = $collect['lang'] == 'gb2312'? 1:0;
$html = fetch($collect['url'],$decode); //fetch是一个自定义函数,使用CURL
//echo $html;
if($rulecontent['content']){
preg_match("/".$rulecontent['content']."/is",$html,$content);
if(empty($content[1])) collect_error('内容','content');
}
//echo $html;
//print_r($content);exit;
$data = array(
'content'=>$content[1]
);
if($rulecontent['page']){
preg_match_all("/".$rulecontent['page']."/is",$html,$page);
//分页部分列表
//exit($rulecontent['page_mode']);
//echo($html);
//print_r($page[1]);exit;
if($page[1]){
$tmpcontent[] = $data['content'];
$tmpurl[] = $collect['url'];
if($rulecontent['page_mode'] == 'page_part'){
foreach($page[1] as $key=>$val){
//判断网址是否是完整路径
$host = parse_url($collect['url']);
if(!strpos($val,$host['host'])) $val = 'http://'.$host['host'].$val;
$collect['url'] = $val;
$tmpurl = array_unique($tmpurl);
if(in_array($collect['url'],$tmpurl)) continue;
$tmpurl[] = $collect['url'];
$results = collect_content($collect,$rulecontent,'page_part');
if(!in_array($results['content'], $tmpcontent)) $tmpcontent[] = $results['content'];
}
}
//合并内容
$data['content'] = implode('[page]', $tmpcontent);
}
}
return $data;
}
代码:
function collect_content($collect,$rulecontent,$page_mode=''){//ini_set("memory_limit" , "128M");
static $tmpcontent = array();
static $tmpurl = array();
static $data = array();
$decode = $collect['lang'] == 'gb2312'? 1:0;
$html = fetch($collect['url'],$decode); //fetch是一个自定义函数,使用CURL
//echo $html;
if($rulecontent['content']){
preg_match("/".$rulecontent['content']."/is",$html,$content);
if(empty($content[1])) collect_error('内容','content');
}
//echo $html;
//print_r($content);exit;
$data = array(
'content'=>$content[1]
);
if($rulecontent['page']){
preg_match_all("/".$rulecontent['page']."/is",$html,$page);
//分页部分列表
//exit($rulecontent['page_mode']);
//echo($html);
//print_r($page[1]);exit;
if($page[1]){
$tmpcontent[] = $data['content'];
$tmpurl[] = $collect['url'];
if($rulecontent['page_mode'] == 'page_part'){
foreach($page[1] as $key=>$val){
//判断网址是否是完整路径
$host = parse_url($collect['url']);
if(!strpos($val,$host['host'])) $val = 'http://'.$host['host'].$val;
$collect['url'] = $val;
$tmpurl = array_unique($tmpurl);
if(in_array($collect['url'],$tmpurl)) continue;
$tmpurl[] = $collect['url'];
$results = collect_content($collect,$rulecontent,'page_part');
if(!in_array($results['content'], $tmpcontent)) $tmpcontent[] = $results['content'];
}
}
//合并内容
$data['content'] = implode('[page]', $tmpcontent);
}
}
return $data;
}
作者: 6772017 发布时间: 2011-04-28
白话版:
2.分析内容做数据采集
3.取页码的显示部分,根据当前页的规则分析是否有下一页.
在这里 当前页的形式可以用正则表示为
然后得到下一页的地址,传递给程序,继续从第一部开始,如果没有取到
那就是证明已经到了最后一页了,整个数据采集完成.
引用:
1.取内容2.分析内容做数据采集
3.取页码的显示部分,根据当前页的规则分析是否有下一页.
在这里 当前页的形式可以用正则表示为
复制内容到剪贴板
然后根据这个位置,向下找一个,如果能找到,那就是还有下一页,代码:
\[\d+\]然后得到下一页的地址,传递给程序,继续从第一部开始,如果没有取到
那就是证明已经到了最后一页了,整个数据采集完成.
作者: faeng220 发布时间: 2011-05-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28