windows版爬取csdn
use LWP::UserAgent;
use POSIX;
use HTML::TreeBuilder::XPath;
use Encode;
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");
my $response = $ua->get('http://blog.csdn.net/zhaoyangjian724');
my $base_dir="F:\\pa"; if ($response->is_success) {
print DATAFH $response->content
}; use HTML::TreeBuilder::XPath;
my $tree= HTML::TreeBuilder::XPath->new;
$tree->parse_file( "csdn.html");
## <a href="/zhaoyangjian724/article/category/1756569" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_wenzhangfenlei']); ">Oracle dump解析
##获取博客分类的URL,根据a标签查找
@Links = $tree->find_by_tag_name('a');
foreach (@Links) {
$href = $_->attr('href');
###获取博客每个类别的url
####@href 表示所有分类的url
if ($href =~/category/){print "\$href is $href\n";
push (@href,$href);
};
};
#@href 是所有类别url的汇总
print "\@href is @href\n";
#@type 是类别名称汇总,根据ul标签查找/li/a对应的值
my @type=$tree->findvalues( '/html/body//ul[@class="panel_body"]/li/a');
#my @type=encode("gbk", decode("utf8","@type"));
foreach (@type){
my $a=encode("gbk", decode("utf8","$_")) ;
push (@a, $a);
};
my @type=@a;
print "\@type is @type\n";
my $length=@href;
my @tmp=();
##@type 表示所有分类的名称
for ($i=0;$i<$length;$i++){ print "$href[$i]===$type[$i]\n";
push (@tmp,$type[$i])};
#循环类别开始
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]"; ##进入每个分类版块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->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->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"]');
my @a=();
foreach (@pageTitles){
my $a=encode("gbk", decode("utf8","$_")) ;
push (@a, $a);
};
my @pageTitles=@a;
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 ,encode("gbk", decode("utf8","$_")));}}
};
};
##第一个元素为空 需要去掉
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->content;
close fh3; # unlink("$pageTitles[$m].html.tmp");
#循环页码结束
}; #循环每个分类的url结束 #循环单个类别结束 } chdir "$base_dir"; }
windows版爬取csdn的更多相关文章
- [Python学习] 简单爬取CSDN下载资源信息
这是一篇Python爬取CSDN下载资源信息的样例,主要是通过urllib2获取CSDN某个人全部资源的资源URL.资源名称.下载次数.分数等信息.写这篇文章的原因是我想获取自己的资源全部的评论信息. ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- Java爬虫实践--爬取CSDN网站图片为例
实现的效果,自动在工程下创建Pictures文件夹,根据网站URL爬取图片,层层获取.在Pictures下以网站的层级URL命名文件夹,用来装该层URL下的图片.同时将文件名,路径,URL插入数据库, ...
- Python 2.7_爬取CSDN单页面博客文章及url(二)_xpath提取_20170118
上次用的是正则匹配文章title 和文章url,因为最近在看Scrapy框架爬虫 需要了解xpath语法 学习了下拿这个例子练手 1.爬取的单页面还是这个rooturl:http://blog.csd ...
- Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114
年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...
- 信息领域热词分析系统--java爬取CSDN中文章标题即链接
package zuoye1; import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLExce ...
- 开发记录_自学Python写爬虫程序爬取csdn个人博客信息
每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...
- 看我怎么扒掉CSDN首页的底裤(python selenium+phantomjs爬取CSDN首页内容)
这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面. 使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe. ...
- Python 爬取CSDN博客频道
初次接触python,写的很简单,开发工具PyCharm,python 3.4很方便 python 部分模块安装时需要其他的附属模块之类的,可以先 pip install wheel 然后可以直接下载 ...
随机推荐
- JavaScript 应用开发 #3:应用的主视图
目前为止,我们已经在应用里面,创建了表示数据的模型,表示数据列表的集合,组织模型显示的视图与模板.下面, 我们要想办法,去把模型的列表显示在应用的界面上.这样我们就可以再去为应用创建一个主要的视图,用 ...
- CentOS7使用Redis
使用Python操作Redis 安装pip # yum install python-pip 升级pip # pip install --upgrade pip 安装redis-py库 # pip i ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(三)
声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...
- <div>相关
定义 <div>是一个块级元素[会自动换行] 用法 <div>可用于划分独立的一个块状区域,其内部内容显示在<div>的content部分内 结构 [盗用张图] 从 ...
- (ASP页面查询等待提示效果)GridViewなどで検索中に「処理中メッセージ」を表示する方法(※他の長い時間処理も参照できる)
原博客 http://ino1970.blog119.fc2.com/blog-entry-163.html GridViewなどで検索中に「処理中メッセージ」を表示する方法 「GridViewなどで ...
- 学习java随笔第十篇:java线程
线程生命周期 线程的生命周期:新建状态.准备状态.运行状态.等待/阻塞状态.死亡状态 示意图: 定义.创建及运行线程 线程: package threadrun; //定义一个实现Runnable接口 ...
- [序列化] SerializeHelper--序列化操作帮助类 (转载)
点击下载 SerializeHelper.zip 这个类是关于加密,解密的操作,文件的一些高级操作1.XML序列化2.Json序列化3.SoapFormatter序列化4.BinaryFormatte ...
- [HttpException (0x80004005): Failed to Execute URL.]之画蛇添足之痛
最近很悲惨,发布的一个mvc站点,所有的静态内容,如js.css.图片都不能正常加载,服务器给出的响应是一个如下的异常黄页: Server Error in '/ua' Application.Fai ...
- ios开发中MVC模式的理解
MVC是80年代出现的一种软件设计模式,是模型(model),视图(view)和控制(Controller)的缩写. 其中Model的主要功能包括业务逻辑的处理以及数据的访问,这是应用程序的主体部分. ...
- java获取远程网络图片文件流、压缩保存到本地
1.获取远程网路的图片 /** * 根据地址获得数据的字节流 * * @param strUrl * 网络连接地址 * @return */ public static byte[] getImage ...