使用TinySpider实战抓取自己博客中的内容

简介:

因为做官网,没有内容,因此就想办法从OSChina中写的博客里弄点内容,这就要用到爬虫了。

然后就花了几分钟搞了一下,步骤如下:

第一步,写个方法抓目录:

?
1
2
3
4
5
6
7
8
9
10
11
public static void processCategory(String categoryId) {
         Watcher watcher = new WatcherImpl();
         Spider spider = new SpiderImpl();
         watcher.addProcessor( new OsChinaCategoryProcessor());
         QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
         nodeFilter.setNodeName( "li" );
         nodeFilter.setIncludeAttribute( "class" , "Blog" );
         watcher.setNodeFilter(nodeFilter);
         spider.addWatcher(watcher);
         spider.processUrl( "http://my.oschina.net/tinyframework/blog?catalog=" +categoryId);
     }
第二步,写个方法抓文章:
?
1
2
3
4
5
6
7
8
9
10
11
public static void processTopic(String pageId) {
         Watcher watcher = new WatcherImpl();
         Spider spider = new SpiderImpl();
         watcher.addProcessor( new OsChinaTopicProcessor());
         QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
         nodeFilter.setNodeName( "div" );
         nodeFilter.setIncludeAttribute( "class" , "BlogContent" );
         watcher.setNodeFilter(nodeFilter);
         spider.addWatcher(watcher);
         spider.processUrl( "http://my.oschina.net/tinyframework/blog/" +pageId);
     }
第三步,写一下目录处理器
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OsChinaCategoryProcessor implements Processor {
     public void process(String url, HtmlNode node) {
         HtmlNode a = node.getSubNodeRecursively( "h2" ).getSubNode( "a" );
         String href = a.getAttribute( "href" );
         String topicId = href.substring(href.lastIndexOf( '/' ) + 1 );
         System.out.printf( "<a href=\"%s.page\">%s</a>\n" , topicId, a.getPureText());
         try {
             Thread.sleep( 200 ); //这里怕oschina拒绝访问,休息一下
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         OSchinaSpider.processTopic(topicId);
     }
}

第四步,写一下文章处理器:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class OsChinaTopicProcessor implements Processor {
     String outoutPath= "E:\\oschina\\" ;
     public void process(String url, HtmlNode node) {
         String fileName=outoutPath+url.substring(url.lastIndexOf( '/' )+ 1 )+ ".page" ;
         try {
             IOUtils.writeToOutputStream( new FileOutputStream(fileName),node.toString(), "UTF-8" );
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
}
第五步,写一下main方法:
?
1
2
3
public static void main(String[] args) {
         processCategory( "377413" );
}
第六步,看结果:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
< a href = "214018.page" >300粉丝集结号吹响了,可以开源重量级的流程引擎或UI引擎 </ a >
< a href = "268983.page" >Tiny实例:TINY框架官网制作过程详解 </ a >
< a href = "267764.page" >从应用示例来认识Tiny框架 </ a >
< a href = "266707.page" >TinyRMI---RMI的封装、扩展及踩到的坑的解决 </ a >
< a href = "233111.page" >悠然乱弹:五一部署了sonar有hudson,发布了1.1.0正式版到Maven中央仓库 </ a >
< a href = "228712.page" >悠然乱弹:我的架构观 </ a >
< a href = "226850.page" >TinyDBF-用200行的DBF解析器来展示良好架构设计 </ a >
< a href = "225959.page" >新增TinyMessage,并实现邮件接收处理 </ a >
< a href = "223310.page" >如何让程序员更容易的开发Web界面?重构SmartAdmin展示TinyUI框架 </ a >
< a href = "221930.page" >Velocity宏定义的坑与解决办法 </ a >
< a href = "220619.page" >不一样的味道--Html及Xml解析、格式化、遍历 </ a >
< a href = "214309.page" >TinyINI开源了~~ </ a >
< a href = "213622.page" >Tiny分布式计算框架开源了 </ a >
< a href = "212682.page" >悠然乱弹:切身体会来说明人性化设计的重要性 </ a >
< a href = "212639.page" >Tiny Formater </ a >
< a href = "206718.page" >TINY框架FAQ汇集 </ a >
< a href = "205733.page" >Tiny框架启动过程日志 </ a >
< a href = "205279.page" >Tiny之Web工程构建 </ a >
< a href = "204994.page" >开源框架Tiny之内容组成 </ a >
< a href = "203075.page" >Tiny后续版本需求整理 </ a >
< a href = "202825.page" >TinyUI组件开发示例 </ a >
< a href = "201307.page" >TinyDbRouter开源喽~~~ </ a >
< a href = "201071.page" >Tiny中文分词 </ a >
< a href = "200604.page" >在Linux下搭建Tiny开发环境 </ a >
< a href = "200408.page" >一个Maven工程中,不同的模块需要不同的JDK进行编译的解决方案 </ a >
< a href = "199515.page" >业务流程引擎 </ a >
< a href = "196486.page" >Tiny并行计算框架之复杂示例 </ a >
< a href = "196373.page" >Tiny并行计算框架之实现机理 </ a >
< a href = "196070.page" >Tiny并行计算框架之使用介绍 </ a >
< a href = "194610.page" >TinySpider开源喽~~~ </ a >
< a href = "194578.page" >TinyHtmlParser开源喽~~~ </ a >
< a href = "194574.page" >TinyXmlParser开源喽~~~ </ a >
< a href = "194551.page" >TinyDBRouter </ a >
< a href = "194413.page" >开源前要做好哪些准备工作? </ a >
< a href = "192778.page" >分布式锁的简单实现 </ a >
< a href = "189259.page" >TinyIOC </ a >
< a href = "188780.page" >TinyDBCluster Vs routing4db </ a >
< a href = "186637.page" >文档生成框架 </ a >
< a href = "186583.page" >数据库分区分片框架 </ a >
< a href = "185134.page" >分区分表支持 </ a >
< a href = "178153.page" >Resetting the root password for MySQL </ a >
< a href = "177224.page" >Tiny框架之内容组成 </ a >
< a href = "176153.page" >JSP放入Jar包支持 </ a >
< a href = "172180.page" >流程式编程 </ a >
< a href = "170799.page" >强悍的上下文Context </ a >
< a href = "170763.page" >类Spring IoC容器 </ a >
< a href = "170741.page" >虚拟文件系统VFS </ a >
< a href = "170401.page" >BigPipe为什么可以节省时间? </ a >
< a href = "170326.page" >XmlParser和HtmlParser </ a >
< a href = "170154.page" >线程组 </ a >
< a href = "170117.page" >流程自动化布局 </ a >
< a href = "169813.page" >涉密数据的处理 </ a >
< a href = "169553.page" >Word文档生成 </ a >
< a href = "169509.page" >如何快速开发网站? </ a >
< a href = "169399.page" >如何让Web.xml变得简洁? </ a >
< a href = "169339.page" >Hello,World 百态 </ a >
< a href = "169278.page" >关于中文处理方面的研究 </ a >
< a href = "169260.page" >构建网络爬虫?so easy </ a >
< a href = "169206.page" >UI开发的终极解决方案 </ a >
< a href = "168896.page" >基于业务单元的开发与部署模式 </ a >
< a href = "168477.page" >一种基于主客体模型的权限管理框架 </ a >
< a href = "167430.page" >MDA数据校验规则定义 </ a >
< a href = "166930.page" >Tiny之7*24集群服务方案 </ a >
< a href = "166893.page" >Tiny设计原则 </ a >
< a href = "166846.page" >构建Tiny生态圈 </ a >
< a href = "166845.page" >Tiny框架设计理念 </ a >
< a href = "166843.page" >基于实体模型开发主题管理简析 </ a >
< a href = "166842.page" >MDA模型定义及扩展 </ a >
< a href = "165566.page" >JS、CSS合并带来的效率提升 </ a >
< a href = "165402.page" >主题切换及其管理 </ a >
生成的目录列表:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
E:\oschina 的目录
 
[.]           [..]          165402 .page   165566 .page   166842 .page
166843 .page   166845 .page   166846 .page   166893 .page   166930 .page
167430 .page   168477 .page   168896 .page   169206 .page   169260 .page
169278 .page   169339 .page   169399 .page   169509 .page   169553 .page
169813 .page   170117 .page   170154 .page   170326 .page   170401 .page
170741 .page   170763 .page   170799 .page   172180 .page   176153 .page
177224 .page   178153 .page   185134 .page   186583 .page   186637 .page
188780 .page   189259 .page   192778 .page   194413 .page   194551 .page
194574 .page   194578 .page   194610 .page   196070 .page   196373 .page
196486 .page   199515 .page   200408 .page   200604 .page   201071 .page
201307 .page   202825 .page   204994 .page   205279 .page   205733 .page
206718 .page   212639 .page   212682 .page   213622 .page   214018 .page
214309 .page   220619 .page   221930 .page   223310 .page   225959 .page
226850 .page   228712 .page   233111 .page   266707 .page   267764 .page
268983 .page

第7步,把文件放入tinysite中去。

爽,收工

相关文章
Hexo博客展示文章字数及阅读时间
Hexo博客展示文章字数及阅读时间
591 0
|
数据采集 前端开发
Python爬虫入门教程 54-100 博客园等博客网站自动评论器
爬虫背景 爬虫最核心的问题就是解决重复操作,当一件事情可以重复的进行的时候,就可以用爬虫来解决这个问题,今天要实现的一个基本需求是完成“博客园“ 博客的自动评论,其实原理是非常简单的,提炼一下需求 基本需求 登录博客园<不实现,登录单独编写博客> 调用评论接口 返回请求结果 确定流程之后,基本...
1733 0
|
数据采集
简单爬虫-抓取博客园文章列表
如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了。爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方。     大部分使用httpRequst就能完成,不管是否添加了口令、随即码、请求参数、提交方式get或者post、地址来源、多次响应等等。
941 0
|
数据采集 Python 数据库管理
Python爬虫入门教程 26-100 知乎文章图片爬取器之二
1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中去。
2615 0
|
数据采集 API Python
Python爬虫入门教程 25-100 知乎文章图片爬取器之一
1. 知乎文章图片爬取器之一写在前面 今天开始尝试爬取一下知乎,看一下这个网站都有什么好玩的内容可以爬取到,可能断断续续会写几篇文章,今天首先爬取最简单的,单一文章的所有回答,爬取这个没有什么难度。
1503 0
|
数据采集 Python
Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取
1.煎蛋网XXOO-写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都有,当然网站本身在爬虫爱好者的不断进攻下,也在不断的完善,反爬措施也很多,今天我用selenium在揍他一波。
2685 0
|
Web App开发 数据采集 大数据
Python爬虫入门教程 7-100 蜂鸟网图片爬取之二
1. 蜂鸟网图片-简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度。 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文档必备 :https://aiohttp.readthedocs.io/en/stable/ 接下来就可以开始写代码了。
1494 0
|
数据采集 JavaScript 前端开发
Python爬虫入门教程 8-100 蜂鸟网图片爬取之三
1. 蜂鸟网图片-啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp 希望你喜欢爬取页面https://tu.fengniao.com/15/ 本篇教程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎选的。
1439 0
|
Web App开发 数据采集 Python
Python爬虫入门教程 4-100 美空网未登录图片爬取
简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可以了,或者带带我也行。 爬虫分析 首先,我们已经爬取到了N多的用户个人主页,我通过链接拼接获取到了 http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html 在这个页面中,咱们要找几个核心的关键点,发现平面拍摄点击进入的是图片列表页面。
1689 0