TinySpider实战之-Visual Paradigm教学相关文档下载

Visual Paradigm是一个非常棒的UML绘图工具,需要对它了解的,可以直接看官网,在此不做更多介绍,最近要使用它来做一些设计,它有非常完备的在线教学,写得非常不错。这个时候问题来了,这些教学非常多,而且如果所有人都访问外网的话及学习效率都比较低。通过观察,发现里面的所有文章都有PDF可以下载,而且里面的示例也可以下载,呵呵,这就好办了,做个程序把它抓下来不就解决了?于是把此问题交给HulkZ同学去干了,HulkZ同学花了半天时间交工,我看了下,发现虽然局部有优化的地方,但是总体还是可以的,于是就写这篇文章做个说明。

注:HulkZ同学还没有大学毕业,正在大学4年级学习。

第一步:教学首页的处理

?


1

2

3

4

5

6

7

8

9

10

11

12

13

public class VisualParadigmMain {

    public static void main(String[] args) throws Exception {

        Spider spider = new SpiderImpl("UTF-8");

        Watcher watcher = new WatcherImpl();

        watcher.addProcessor(new VisualParadigmMainProcessor());

        QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();

        nodeFilter.setNodeName("li");

        nodeFilter.setIncludeAttribute("class", "tutorialLeftMenuItem");

        watcher.setNodeFilter(nodeFilter);

        spider.addWatcher(watcher);

        spider.processUrl("http://www.visual-paradigm.com/tutorials/");

    }

}

大意是创建一个抓取UTF-8的爬虫,然后创建一个观察者,设定对带有class为tutorialLeftMenuItem的li标签用VisualParadigmMainProcessor类去处理,然后去处理URLhttp://www.visual-paradigm.com/tutorials/。

到这里处理还是比较清晰的,接下来看看VisualParadigmMainProcessor是怎么样的。

?


1

2

3

4

5

6

7

8

9

10

public class VisualParadigmMainProcessor implements Processor {

    public void process(String url, HtmlNode node, Map<String, Object> parameters) throws Exception {

        HtmlNode a = node.getSubNode("a");

        File file = new File("E:\\临时\\spider\\" + a.getPureText().trim());

        if (!file.exists()) {

            file.mkdirs();

        }

        VisualParadigmList.process(a.getAttribute("href"));

    }

}

这里传入的node实际上,就是上面说的带有class为tutorialLeftMenuItem的li标签,这里的意思是找到它下面的所有<a>标签,然后创建目录,然后再用VisualParadigmList类来对这些分类连接进行处理。

第二步:教学分类中的教学内容列表处理

教学分类中主要就是一篇一篇的教学文章了,接下来当然是对这些文章进行处理了。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class VisualParadigmList {

    public static void process(String url) throws Exception {

        Spider spider = new SpiderImpl("UTF-8");

        Watcher watcher = new WatcherImpl();

        watcher.addProcessor(new VisualParadigmListProcessor());

        QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();

        nodeFilter.setNodeName("div");

        nodeFilter.setIncludeAttribute("class", "tutorial-link-container");

        watcher.setNodeFilter(nodeFilter);

        spider.addWatcher(watcher);

        spider.processUrl("http://www.visual-paradigm.com" + url);

        System.out.println(System.currentTimeMillis()+"-"+url);

    }

}

这里又创建一个爬虫,然后对需要处理的 页面查找class为"tutorial-link-container"的div标签,找到之后用VisualParadigmListProcessor进行处理。

VisualParadigmListProcessor类的内容如下:

?


1

2

3

4

5

6

public class VisualParadigmListProcessor implements Processor {

    public void process(String url, HtmlNode node, Map<String, Object> parameters) throws Exception {

        HtmlNode a = node.getSubNode("a");

        VisualParadigmPage.process(a.getPureText(), a.getAttribute("href"));

    }

}

意思就是再对它下面的a标签中的URL用VisualParadigmPage类进行处理。

第三步:具体的页面处理

上面就是具体的教学页面了,在其右上角,就有PDF的链接,下面要做的工作就是把这些PDF抓取下来,首先看VisualParadigmPage类:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

public class VisualParadigmPage {

    public static void process(String title,String url) throws Exception {

        Spider spider = new SpiderImpl("UTF-8");

        Watcher watcher = new WatcherImpl();

        watcher.addProcessor(new VisualParadigmPageProcessor(title));

        QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();

        nodeFilter.setNodeName("html");

        watcher.setNodeFilter(nodeFilter);

        spider.addWatcher(watcher);

        spider.processUrl("http://www.visual-paradigm.com" + url);

        System.out.println(System.currentTimeMillis()+"-"+url);

    }

}

其意思是创建一个爬虫,并对里面的html标签用VisualParadigmPageProcessor类进行处理,相对于上面的一些类这个类的内容就稍微复杂些了:

?


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

public class VisualParadigmPageProcessor implements Processor {

    static HttpClient httpClient = new HttpClient();

    private final String title;

 

    public VisualParadigmPageProcessor(String title) {

        this.title = title;

    }

 

    public void process(String url, HtmlNode node, Map<String, Object> parameters) throws Exception {

        NameFilter<HtmlNode> titleUrlFilter = new NameFilter(node);

        titleUrlFilter.setNodeName("title");

        HtmlNode titleNode = titleUrlFilter.findNode();

 

        NameFilter<HtmlNode> pdfUrlFilter = new NameFilter(node);

        pdfUrlFilter.setNodeName("a");

        pdfUrlFilter.setIncludeAttribute("class", "pdf notranslate");

        HtmlNode pdfNode = pdfUrlFilter.findNode();

        NameFilter<HtmlNode> ol = new NameFilter(node);

        pdfUrlFilter.setNodeName("ol");

        pdfUrlFilter.setIncludeAttribute("class", "contentPoint");

        HtmlNode olNode = pdfUrlFilter.findNode();

        if (pdfNode != null) {

            String pdfUrl = "http://www.visual-paradigm.com" + pdfNode.getAttribute("href");

            saveUrl(titleNode.getPureText() + ".pdf", pdfUrl);

        }

        if (olNode != null && olNode.getSubNodes("a") != null) {

            for (HtmlNode aNode : olNode.getSubNodes("a")) {

                String vppUrl = "http://www.visual-paradigm.com" + aNode.getAttribute("href");

                saveUrl(aNode.getPureText(), vppUrl);

            }

        }

    }

 

    private void saveUrl(String name, String urlAddress) throws IOException {

        String fileName = "E:\\临时\\spider\\" + title + "\\" + name;

        GetMethod getMethod = new GetMethod(urlAddress);

        int iGetResultCode = httpClient.executeMethod(getMethod);

        if (iGetResultCode == HttpStatus.SC_OK) {

            InputStream inputStream = getMethod.getResponseBodyAsStream();

            OutputStream outputStream = new FileOutputStream(fileName);

            byte[] buffer = new byte[4096];

            int n = -1;

            while ((n = inputStream.read(buffer)) != -1) {

                if (n > 0) {

                    outputStream.write(buffer, 0, n);

                }

            }

            inputStream.close();

            outputStream.close();

        }

        getMethod.releaseConnection();

    }

}

但是其逻辑还是清晰的:

到文章中查找到标题,再查找到PDF的链接,再查找到其它附件的链接,如果有的话,就把它们存储下来,整个代码编写任务结束。

运行结果

?


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

D:\BaiduYunDownload\VPTutorials 的目录

 

2014/11/02  20:06    <DIR>          .

2014/11/02  20:06    <DIR>          ..

2014/11/02  20:05    <DIR>          Business Modeling

2014/11/02  20:05    <DIR>          Business Process Modeling

2014/11/02  20:05    <DIR>          Business Rule

2014/11/02  20:05    <DIR>          Code Engineering

2014/11/02  20:05    <DIR>          Customization

2014/11/02  20:05    <DIR>          Data Modeling

2014/11/02  20:05    <DIR>          Database Tools

2014/11/02  20:05    <DIR>          Design Animation

2014/11/02  20:05    <DIR>          Diagramming

2014/11/02  20:05    <DIR>          Enterprise Architecture

2014/11/02  20:05    <DIR>          Glossary

2014/11/02  20:05    <DIR>          Grid

2014/11/02  20:05    <DIR>          IDE Integration

2014/11/02  20:05    <DIR>          Impact Analysis

2014/11/02  20:05    <DIR>          Interoperability

2014/11/02  20:05    <DIR>          Modeling Toolset

2014/11/02  20:05    <DIR>          Object Relational Mapping

2014/11/02  20:05    <DIR>          Plug-in Development

2014/11/02  20:05    <DIR>          Process Simulation

2014/11/02  20:05    <DIR>          Project Referencing

2014/11/02  20:06    <DIR>          Reporting

2014/11/02  20:06    <DIR>          Requirements Capturing

2014/11/02  20:06    <DIR>          SoaML Modeling

2014/11/02  20:06    <DIR>          Team Collaboration

2014/11/02  20:06    <DIR>          UML Modeling

2014/11/02  20:06    <DIR>          Use Case Modeling



上面是他提交给我的成果物,总共108M,任务完成得非常漂亮。

补充

这部分代码,HulkZ同学已经Push给我,放在TinySpider工程当中。

另外做这个过程中,还发现TinySpider不能处理gzip方式处理过的Html文档,因此还增加了对gzip方式的html内容进行处理的支持。

更多内容,请查看Tiny框架官网:http://www.tinygroup.org,也可以查看本人的博客,相信不会空手而归。

也可以添加本人QQ进行直接沟通,还可以加入Tiny群与TinyFans互动。

时间: 2024-08-01 11:33:15

TinySpider实战之-Visual Paradigm教学相关文档下载的相关文章

iOS Foundation 框架 224 篇相关文档分类整理

iOS Foundation 框架 224 篇相关文档分类整理 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 截至 2014-05-02 ,苹果官网 Foundation 框架相关文档共计 2

DedeCMS文档页专用likearticle|相关文档

likearticle|相关文档 标签名称:likearticle功能说明:自动关连文档标签适用范围:内容页使用基本语法:{dede:likearticle row='' col='' titlelen='' infolen=''}<a href='[field:arcurl/]'>[field:title/]</a>{/dede:likearticle}参数说明:col='' 分多少列显示(默认为单列)row='10' 返回文档列表总数titlelen = '30' 标题长度 等

谁有sap的相关文档

问题描述 谁有sap的相关文档 解决方案 我有我发给你,告诉我邮箱

剖析文档下载类网站优化细节

文档下载类站点也属于提供文件下载的网站,此类站点在做优化的时候,需要注意哪些地方的细节问题呢?最近笔者看到了一个这样的站点,下面结合这个案例来分析下此类站点如何去做优化,其实许多地方都与其他网站类似,没有什么值得分析的.例如:网站导航.页面代码.关键词等,当然也有一些地方与其他类型的站点不同.好了先看下这个站点基本SEO数据:收录2180.反链1380.域名时间1年21天.百度权重1.谷歌PR1.从百度权重1就可以大致清楚这个站点流量不怎么样,笔者看了下就一个关键词有点排名,可见这个站点的优化没

springmvc download-怎么将项目中的数据文档下载下来呢

问题描述 怎么将项目中的数据文档下载下来呢 我已经生成了一些文档在项目当中,要怎么把他的数据下载到本地呢?我下载的时候为啥老是空的呢.请指教一下没有金币请谅解 解决方案 你下载的文件路径不对造成的吧 解决方案二: 应该是你的服务器的问题.http://sishuok.com/forum/posts/list/5351.htmlhttp://a52071453.iteye.com/blog/1559005

ASP文档下载,打开文档内容是下载界面的界面图

问题描述 这是我从网上找的文档下载函数部分的代码,运用到自己的程序里,下载步骤是正确的,但是打开文档内容却是文档下载界面的界面,相当于是图片,为什么啊?求大神指导.stringname=text;//名称stringfilename=cmd.ExecuteScalar().ToString();//地址Filedownload(filename,name);//调用下载函数publicvoidFiledownload(stringfilename,stringname){stringsaveFi

asp.net Word文档下载代码

asp教程.net word文档下载代码   //第一种方法: string path = server.mappath("文件名.doc"); fileinfo file = new fileinfo(path); filestream myfilestream = new filestream(path, filemode.open, fileaccess.read); byte[] filedata = new byte[file.length]; myfilestream.re

Win8.1中 视频/图片/文档/下载/音乐/桌面文件夹删除教程

文档/下载/音乐/桌面文件夹删除教程-桌面文档在哪个文件夹"> 如上图所示,Windows8.1"这台电脑"中多了视频/图片/文档/下载/音乐/桌面6个文件夹,看着别扭,删除方法: 打开注册表,依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace,删除下边6个子项,刷新下"这台电脑"就没有了. 注册表备份(NameS

通用权限相关文档的下载【2009.9.7更新】

  最新的下载地址:http://www.naturefw.com/nature/down.aspx      下面的地址都作废.           您可以在这里下载通用权限相关的文档.源代码.Demo等,当然现在只有一个数据的说明文档.以后会逐步增加.  不好意思,忘记说用户名.密码了. 管理员的用户名:admin,密码:123.其他用户的密码也都是123. 文档名称 上传日期 说明 详细介绍 下载 权限的演示 2009.9.9 6:28 权限到节点.按钮,权限到字段,权限到记录 数据库设计