perl 爬取csdn

<pre name="code" class="python">use  LWP::UserAgent;
use POSIX;
use HTML::TreeBuilder::XPath;
use DBI;  
use Encode; 
use utf8;
use HTML::TreeBuilder;
open DATAFH,">csdn.html" || die "open csdn file failed:$!"; 
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
$ua->agent("Mozilla/8.0");
$base_dir='/root/lwp';
my $response = $ua->get('http://blog.csdn.net/zhaoyangjian724');


if ($response->is_success) {
 print DATAFH  $response->decoded_content;  # or whatever
# print   $response->decoded_content;  # or whatever
  use HTML::TreeBuilder::XPath;
  my $tree= HTML::TreeBuilder::XPath->new;
  $tree->parse_file( "csdn.html");
## 按link_view
 ###获取每个类别的url
@Links = $tree->find_by_tag_name('a');
        foreach (@Links) {
                $href = $_->attr('href');
 ###获取每个类别的url
                 if ($href =~/category/){print "\$href is $href\n";
                 push (@href,$href);
                    };
                  
                
                };
#@href 是所有类别url的汇总
print "\@href is @href\n";

#@type 是类别名称汇总
 my @type=$tree->findvalues( '/html/body//ul[@class="panel_body"]/li/a');
print "\@type is @type\n";
my $length=@href;
@tmp="";
for ($i=0;$i<$length;$i++){print "$href[$i]===$type[$i]\n";
                           push (@tmp,$type[$i])};
##此时@tmp表示Oracle dump解析 类别开始到监控平台项目结束
shift @tmp;
@type=@tmp;
print "\@type is @type\n";
#循环类别开始
	for ($i=0;$i<=@type - 1; $i++){
	print "\$type is $type\n";
                     #next  unless ($type[$i]) ;
                   if (! -d "$type[$i]"){
                    mkdir $type[$i];
                                };
                      chdir "$base_dir/$type[$i]";
                      system(pwd);
                      sleep (5);					 
                 ##进入每个分类版块url
                 
                    my  $pageString;
                   my $response = $ua->get("http://blog.csdn.net$href[$i]");
                    ##每个版块首页url
					print "\$href[$i] is $href[$i]\n";
				    ##fh1.html每个版块首页url
                    open fh1,">fh1.html" || die "open csdn file failed:$!";
                    print fh1  $response->decoded_content;
                    close fh1;
                     my $tree= HTML::TreeBuilder::XPath->new;
                     $tree->parse_file( "fh1.html");
                   ##获取每个版块的页码数 这个方法有问题,这里是数组$_ is  150条数据 共8页
                   my  @pageString = $tree->findvalues('/html/body//div[@id="papelist"]/span');
                if ($pageString[0]){ if ($pageString[0] =~ /.*\s+.*?(\d+).*/){$pageString=$1}; };
				print "\@pageString is @pageString\n;";
				   ##获取$pageString
				   sleep (5);
                   unless ($pageString){$pageString=1};
                    print "\$pageString is $pageString\n";
                    sleep(5);
                     ##进入每页,处理url
                     for ($j=1;$j<=$pageString + 0; $j++){
					 ##每个类别对应的url
                      my $url="http://blog.csdn.net$href[$i]/$j";
                      print "\$url is $url\n";
                      my $response = $ua->get("$url");
					  ##fh2 每页url
                      open fh2,">fh2.html" || die "open csdn file failed:$!";
                       print fh2  $response->decoded_content;
                      close fh2;
                      #获取每页都多少条标题
                     my @pageTitles="";
                      my $tree= HTML::TreeBuilder::XPath->new;
                     $tree->parse_file( "fh2.html");
                     #获取标题,这里会拿到除了该类别下文章外,
                     my @pageTitles = $tree->findvalues('/html/body//span[@class="link_title"]');
                      print "\$pageTitles[0] is  $pageTitles[0]\n";
					  print "\@pageTitles is @pageTitles\n";
					  sleep (10);
					  
                     ##获取标题连接url
                       my $tree= HTML::TreeBuilder::XPath->new;
                      $tree->parse_file( "fh2.html");
					  @titleLinks="";
                      @titleLinks=$tree->find_by_tag_name('a');
                      @urlall=""; 
                      @urltmp="";
                      #@urlall除了包含每个类别的文章,还包含阅读排行里的文章
                      foreach (@titleLinks) {
                                               @titleHref = $_->attr('href');
                                               foreach (@titleHref) {
											   ###获取版块中每个页面的url
                                               if ($_ =~/zhaoyangjian724\/article\/details\/(\d+)$/){
                                                 unless ($_ ~~ @urlall) { print "\$_=========$_\n";push (@urlall ,$_);}}
                                                     };
                                           };
										   ##第一个元素为空 需要去掉
										   shift @urlall;
                                          print "\@urlall is @urlall\n";
										  sleep (10);
                                          for ($k=0;$k<=@pageTitles - 1;$k++){
                                          print "\$urlall[$k] is $urlall[$k]\n";
										  
                                          push (@urltmp,$urlall[$k]);
                                                                           };     
                                            @urlall=@urltmp;
											shift @urlall;
											
                                          print "\$---urlall[0] is  $urlall[0]\n";
										  sleep (10);
					for ($m=0;$m<=@urlall - 1; $m++){
					$pageTitles[$m] =~ s/\s+//g;
					print "===========================\n";
					print "$pageTitles[$m]======$urlall[$m]\n";
				    print "===========================\n";
		         			 open fh3,">$pageTitles[$m].html" || die "open csdn file failed:$!";
						  my $response = $ua->get("http://blog.csdn.net$urlall[$m]");
                                                      
                                                  print "--------------------------------\n";
                                                  print "$urlall[$m]"."\n";
                                                  print fh3  $response->decoded_content;
                                                  close fh3;
												

                                                 
										# unlink("$pageTitles[$m].html.tmp");
                           #循环页码结束
                                                    }; 
													
													
							#循环每个分类的url结束
                                     
									 
									 
						#循环单个类别结束
						
                          }
						  
						 chdir "$base_dir";  
                  
				      }
				   }
else{print   $response->decoded_content;}


 

转载于:https://www.cnblogs.com/zhaoyangjian724/p/6200381.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN Perl编程风格指南是一个为Perl开发者提供的指导性文档,旨在帮助编写高质量和易于维护的Perl代码。以下是我对Perl编程风格指南的回答: Perl编程风格指南是一个重要的参考资源,它涵盖了许多方面的编码规范和最佳实践。这个指南有助于编写清晰、一致、易于理解和维护的Perl代码。 在这个编程风格指南中,首先会介绍一些基本的命名规则,包括变量、函数和模块的命名方式。这些规则帮助开发者编写清晰、易读的代码,同时也提供了一致的命名风格。 指南还提供了一些代码布局和缩进的建议,以确保代码的可读性。通过统一的缩进和布局规则,代码将更易于阅读和理解,也便于后续的维护工作。 此外,Perl编程风格指南还提供了一些规范的建议,以便统一Perl代码的写法。例如,使用严格模式,避免全局变量的使用,以及提供注释和文档,使代码更易于理解,并促进开发团队之间的合作。 该指南还包含一些性能优化的建议,如避免频繁的正则表达式操作以及使用合适的数据结构。这些优化技巧可以提高代码的执行效率,减少资源消耗。 总的来说,CSDN Perl编程风格指南是一个非常有价值的资源,它帮助Perl开发者遵循一致的编码规范和最佳实践,从而编写高质量和易于维护的Perl代码。通过遵循这些指南,开发者可以更好地与团队合作,提高代码的可读性和可维护性,并最大程度地发掘Perl的性能优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值