- 论坛徽章:
- 1
|
最近学习了Perl异步模块Coro和Perl非阻塞的AnyEvent::HTTP模块,为了更深入的学习异步编程思想,准备写个入门程序。
最合适的就是爬虫了,我是用Coro的信号控制HTTP请求数量的,入口是一个网站主页,只准备抓一个站点。
有一个%root的hash变量,用来将站点的所有URL层次化的保存在%root里面,并保存抓取状态(是否已抓取)。
sub URL_add
{
# $p用于指向%root各个层次的指针
my $p = shift;
my $url = shift;
my $is_new = 0;
my @depths = split '/', $url;
foreach (@depths){
# 判断是否存在相同路径
if ( ! $p->{$_} ){
# 下级永远保存一个引用
$p->{$_} = {};
$is_new = 1;
}
# 指向下一级的引用
$p = $p->{$_};
}
# 标记新路径或则未标记路径,'//'代表标记结尾,值1代表未查询
$p->{'//'} = 1 if $is_new || ! $p->{'//'};
}
抓取的URL与该%root匹配,如果已存在就丢弃。
|
|