perl 爬ku6视频

   起因是自己想在公司做ku6视频缓存增加点工作经验(领导非常支持,找了7台720XD,有个好领导还是很幸福的),后来因为白天回源紧张,就停止计划了;某天突然想到那些视频公司都是主动推送热点文件到服务器,要是我自己凌晨回源同步热点,减少白天热点文件回源,那我视频缓存项目还可以继续推进;

个人是perl新手,下面代码有些是朋友帮忙写的(有好朋友也幸福...要不然自己要研究到啥时候),我自己写了点再把各部分功能组合起来;虽然跑的慢点,但有效果,也能接受; 这算写过最长的代码了。。。

[root@web-40 perl]# cat new_hash_ku6.pl
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use HTML::TreeBuilder;
use JSON qw(decode_json);
my $html = get ("http://www.ku6.com");
my $root = HTML::TreeBuilder->new_from_content($html);
my %images = ();
my @urls;
my $sub_html;
my $sub_root;
my %urls;
my @sub_urls;
foreach my $node ($root->find_by_tag_name('a')){
        $images{$node->attr('href')}++;
}
foreach my $pic (sort keys %images){
            if ( ($pic =~  /http:\/\/v\.ku6\.com.*/s) &&($pic =~ m{/show/})){
                            push(@urls, $pic);
                            $urls{$pic}++;
                                    }
}
上面代码是把ku6首页的视频连接都抓出来;
子程序get_sub_url 是逐个请求视频连接,顺便把每打开一个视频网页,那页上面的推广视频连接也抓下来保存到数组;
sub get_url {
    foreach my $url (@urls){
         $sub_html = get ($url);
         $sub_root = HTML::TreeBuilder->new_from_content($sub_html);
         my %href = ();
        for my $sub_node ($sub_root->find_by_tag_name('a')){
            $href{$sub_node->attr('href')}++;
        }
                                                                                      
            for my $sub_pic (sort keys %href){
                if (($sub_pic =~ /http:\/\/v\.ku6\.com.*/s) &&($sub_pic =~ m{/show/})){
                    if (exists $urls{$sub_pic}){next;}
                    else { push(@sub_urls,$sub_pic) };
                }
            }
    get_mail_url(@sub_urls);
    }
}
子程序get_mail_url 是模拟用户去访问ku6的调度服务器,下载视频内容;
这样就相当于主动把ku6的热点文件下载到缓存服务器,复用了,凌晨的空闲
带宽
sub get_mail_url {
    foreach my $get_mail (@sub_urls){
        my $url_mail =  "$get_mail";
        my $lwp =
          new LWP::UserAgent( agent =>
          'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; CIBA)'
            );
          my $request = HTTP::Request->new( GET => $url_mail );
          $lwp->max_redirect;
          $request->header( Accept => 'text/html' );
          my $response = $lwp->request($request);
          my $html = $response->decoded_content;
          my ($flv_download_link) = ( $html=~ /"f":"([^\"]+)"/s );
          my $json = '{ "url":"' . $flv_download_link. '"}';
          $flv_download_link = decode_json($json)->{url};
          system("wget $flv_download_link -O /dev/null");
    }
}
get_url (@urls);



下一步就是,让CDN跑一周以上,根据日志,分析用户主要看哪类视频,重点爬这些视频;

你可能感兴趣的:(perl,抓网页)