爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ;

本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫;

1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径,

然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  .

这就是网络爬虫主要干的工作.  下面是流程图:

通过上面的流程图 能大概了解到 网络爬虫 干了哪些活  ,根据这些 也就能设计出一个简单的网络爬虫出来.

一个简单的爬虫 必需的功能:  

1: 发送请求和获取响应的功能 ; 

2: 解析响应的功能 ;

3: 对 过滤出的数据 进行存储 的功能 ;

4: 对解析出来的URL路径 处理的功能 ;

下面是包结构:

 

 下面就上代码:

RequestAndResponseTool  类: 主要方法: 发送请求 返回响应 并把 响应 封装成 page 类 ;

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

page 类: 主要作用: 保存响应的相关内容 对外提供访问方法;

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

PageParserTool: 类  主要作用 提供了 根据选择器来选取元素 属性 等方法 ;

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

Link 包 ;

Links  类:  两个属性: 一个是存放 已经访问的url集合的set  ; 一个是存放待访问url集合的 queue    ;

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

package com.etoak.crawl.link;

 

import java.util.HashSet;

import java.util.LinkedList;

import java.util.Set;

 

/*

*  Link主要功能;

*  1: 存储已经访问过的URL路径 和 待访问的URL 路径;

*

*

* */

public class Links {

 

    //已访问的 url 集合  已经访问过的 主要考虑 不能再重复了 使用set来保证不重复;

    private static Set visitedUrlSet = new HashSet();

 

    //待访问的 url 集合  待访问的主要考虑 1:规定访问顺序;2:保证不提供重复的带访问地址;

    private static LinkedList unVisitedUrlQueue = new LinkedList();

 

    //获得已经访问的 URL 数目

    public static int getVisitedUrlNum() {

        return visitedUrlSet.size();

    }

 

    //添加到访问过的 URL

    public static void addVisitedUrlSet(String url) {

        visitedUrlSet.add(url);

    }

 

    //移除访问过的 URL

    public static void removeVisitedUrlSet(String url) {

        visitedUrlSet.remove(url);

    }

 

 

 

    //获得 待访问的 url 集合

    public static LinkedList getUnVisitedUrlQueue() {

        return unVisitedUrlQueue;

    }

 

    // 添加到待访问的集合中  保证每个 URL 只被访问一次

    public static void addUnvisitedUrlQueue(String url) {

        if (url != null && !url.trim().equals("")  && !visitedUrlSet.contains(url)  && !unVisitedUrlQueue.contains(url)){

            unVisitedUrlQueue.add(url);

        }

    }

 

    //删除 待访问的url

    public static Object removeHeadOfUnVisitedUrlQueue() {

        return unVisitedUrlQueue.removeFirst();

    }

 

    //判断未访问的 URL 队列中是否为空

    public static boolean unVisitedUrlQueueIsEmpty() {

        return unVisitedUrlQueue.isEmpty();

    }

 

}

LinkFilter  接口: 可以起过滤作用;
package com.etoak.crawl.link;

public interface LinkFilter {
    public boolean accept(String url);
}

util 工具类

CharsetDetector 类; 获取字符编码

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

FileTool  文件下载类:

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

RegexRule  正则表达式类;

按 Ctrl+C 复制代码

 

按 Ctrl+C 复制代码

主类: 

MyCrawler :

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

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

package com.etoak.crawl.main;

 

import com.etoak.crawl.link.LinkFilter;

import com.etoak.crawl.link.Links;

import com.etoak.crawl.page.Page;

import com.etoak.crawl.page.PageParserTool;

import com.etoak.crawl.page.RequestAndResponseTool;

import com.etoak.crawl.util.FileTool;

import org.jsoup.select.Elements;

 

import java.util.Set;

 

public class MyCrawler {

 

    /**

     * 使用种子初始化 URL 队列

     *

     * @param seeds 种子 URL

     * @return

     */

    private void initCrawlerWithSeeds(String[] seeds) {

        for (int i = 0; i < seeds.length; i++){

            Links.addUnvisitedUrlQueue(seeds[i]);

        }

    }

 

 

    /**

     * 抓取过程

     *

     * @param seeds

     * @return

     */

    public void crawling(String[] seeds) {

 

        //初始化 URL 队列

        initCrawlerWithSeeds(seeds);

 

        //定义过滤器,提取以 http://www.baidu.com 开头的链接

        LinkFilter filter = new LinkFilter() {

            public boolean accept(String url) {

                if (url.startsWith("http://www.baidu.com"))

                    return true;

                else

                    return false;

            }

        };

 

        //循环条件:待抓取的链接不空且抓取的网页不多于 1000

        while (!Links.unVisitedUrlQueueIsEmpty()  && Links.getVisitedUrlNum() <= 1000) {

 

            //先从待访问的序列中取出第一个;

            String visitUrl = (String) Links.removeHeadOfUnVisitedUrlQueue();

            if (visitUrl == null){

                continue;

            }

 

            //根据URL得到page;

            Page page = RequestAndResponseTool.sendRequstAndGetResponse(visitUrl);

 

            //对page进行处理: 访问DOM的某个标签

            Elements es = PageParserTool.select(page,"a");

            if(!es.isEmpty()){

                System.out.println("下面将打印所有a标签: ");

                System.out.println(es);

            }

 

            //将保存文件

            FileTool.saveToLocal(page);

 

            //将已经访问过的链接放入已访问的链接中;

            Links.addVisitedUrlSet(visitUrl);

 

            //得到超链接

            Set<String> links = PageParserTool.getLinks(page,"img");

            for (String link : links) {

                Links.addUnvisitedUrlQueue(link);

                System.out.println("新增爬取路径: " + link);

            }

        }

    }

 

 

    //main 方法入口

    public static void main(String[] args) {

        MyCrawler crawler = new MyCrawler();

        crawler.crawling(new String[]{"http://www.baidu.com"});

    }

}

  运行结果:

源码下载链接: https://pan.baidu.com/s/1ge7Nkzx   下载密码:  mz5b

文章主要参考: 1: 自己动手写网络爬虫;
2: https://github.com/CrawlScript/WebCollector  
WebCollector是一个无须配置、便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫。WebCollector-Hadoop是WebCollector的Hadoop版本,支持分布式爬取。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值