在列表爬取时,经常存在分页问题(某一页采集失败),为了避免资源浪费,我们不可能再从第一页开始采集;那么每个采集成功的页码进行标识就很有必要了,在所需采集页码数少的情况下我们可以通过给采集任务表添加上每个页码的字段,在对应页码采集成功的时候更新采集完成时间,但在页码数多的情况下(如采集淘宝某关键词前100页的产品)该方法就不切实际了;
我采用的思路是通过0和1来标识对应顺序的页码是否采集成功;
如现在需要采集前10页,那么初始化页码标识就是10个0的字符串;(下面案例使用的是php语言)
// 初始化页码标识,不够位数的用0填充
$page_init = str_pad(0,10,'0',STR_PAD_LEFT);
$pages = str_split($page_init);// 将字符串转换为数组
$pagesLength = count($pages);
for($ii = $pagesLength - 1;$ii >= 0;$ii--){
if($pages[$ii] == 0){
// 如果值为0则还未采集成功,可以取走任务页码
$currentPage = $pagesLength - $ii;// 当前页码
# code... 后面就是你要采集的url拼接方法了
}
}
// 以上就是任务分派的页码逻辑;
下面开始处理采集返回的数据(处理采集成功的页码前需要大家先了解下或运算的规则)
运算规则:
0|0=0; 0|1=1; 1|0=1; 1|1=1; 即 :参加运算的两个对象,一个为1,其值为1。 例如:3|5 即
00000011 | 0000 0101 = 00000111,因此,3|5=7。
/*
首先获取当前返回的采集任务id和采集的页码$page;
再通过id获取到页码标识如$page_flag;
$page_flag 页码标识
$maxPage 采集条件里定的最大采集页数
bindec() 函数是将二进制转为10进制
$limit 是采集里每页的产品数
$count 是该搜索关键词的总产品数,如果总产品数只有5页但我们规定要采10页肯定采集不到的所以也要更新采集成功了;
*/
$page_flag = #你的查询语句,获取出页码标识
// 对页码数进行或运算
$page_flag = $page_flag|pow(2,$page-1);// 或运算(页码为对应的第几位的1)
// 接着判断是否已经采集完了;采集完成的规则是:完成了规定的页码数或实际总产品数小于我们规定的采集数
if($page_flag == bindec(str_pad(1, $maxPage,1,STR_PAD_LEFT)) || $page * $limt >= $count){
#code... 下面就是你处理采集成功的更新机制了,当前不再派发该任务了
}else{
#code... 将该任务的的page_flag字段值设置为$page_flag
}