如何编写一个简易网络爬虫

感谢小臣投稿

本文将简述网络爬虫及其工作流程,结合个人实践,简单介绍如何使用HttpClient、HtmlParser第三方jar工具包,编写一个简易的网络爬虫。

网络爬虫简述及流程架构

网络爬虫,又叫网页蜘蛛,是一种按照一定的规则逻辑,自动地抓取网络信息的程序或者脚本。

在当今网络时代,信息量爆炸性增长,不同领域、不同背景的用户对信息的获取有不同的需求。人们无法在这么海量信息中及时有效地获取到极具针对性的信息。搜索引擎一定程度上也无法根据语义查询,满足用户定制化需求。诸如此类各种原因,网络爬虫应运而生。

“寄宿”在网络服务器节点上的网络爬虫,一般工作流程如下,

流程上,爬虫程序从种子URL开始,根据设定的规则、策略(如广度优先搜索、最佳优先搜索、深度优先搜索)对目标站点网页进行爬取。

一般架设起来的爬虫系统,主要有如下几种结构,

(1)主从式

Master节点维护待抓取URL队列,它负责每次将URL分发到不同的Slave节点上,而各Slave节点则负责实际的网页下载工作。同时,主节点也负责调解各个Slave节点的负载情况。

(2)对等式

通过哈希计算,每一台抓取节点都可以从待抓取在URL队列中获取URL。

思路:对该URL或其主域名计算hash值(java中的hashCode方法,也是其中的一种实现),简单一点就是通过哈希函数mod m(其中m是服务器的数量,以上图为例,m为3),计算得到取模余数,这就是处理该URL的主机编号了。

(3)对等式改良版

将URL的主域名进行哈希运算,映射在一个范围之间的某个数。而将这个范围平均的分配给m台服务器。如果某一台服务器出现问题,那么本该由该服务器负责的网页则按照顺时针顺延,由下一台服务器进行抓取。

比如,一个域hash映射范围是8个数,那么4个节点平均每个节点承载2个数范围。url哈希运算得到值3,那么就分发到第二个节点上。如果该节点宕机了,那么第三个节点就会承接该请求。如果是末级节点宕了,那么应该有算法处理转发给首节点,形成节点的环形结构。

实例具体实现

通过部分伪代码(颜色对应实现代码),介绍案例,讲解细节实现,

案例1:抓取某体育直播网站上的球队队徽、队旗图标

//控制台输入指令,从配置文件匹配到种子URL
String reqUrl = PropertiesOperateUtils.getReqUrlByCommand(command);
//获取图片节点
NodeList imgNodeList = getImgTagsByUrl(reqUrl);
List<String> imgUrlTagList =parserNodeList2ImgsList(imgNodeList);
//将获取的图片url,遍历写入磁盘
FileOpearateUtils.writeImgIntoHardDisk(imgUrlTagList,null);
函数部分代码如下,

/**
   * 通过reqUrl获取图片标签节点List
   * @param reqUrl
   * @return
   */
static NodeList getImgTagsByUrl(String reqUrl) {
    Parser parser = ParseHtmlUtils.getParserByUrl(reqUrl);
    returne HtmlTag.getImgTags(parser);
}
/**
   * 根据图片节点解析出对应的图片URL
   * @param nodeList
   * @return
   */
private static List<String> parserNodeList2ImgsList(NodeList nodeList) {
    List<String> imgUrlList = new ArrayList<String>(); 
    if (nodeList != null) {
        for (int i = 0; i < nodeList.size(); i++) {
            ImageTag imageTag = (ImageTag)nodeList.elementAt(i);
            String imgUrl = imageTag.getImageURL();
            //集合中不存在的,才保存,避免相同、重复的图片url
            if (!imgUrlList.contains(imgUrl))
                 imgUrlList.add(imgUrl);
        }
    }
    return imgUrlList;
}
method:writeImgIntoHardDisk{
    //...省略部分,贴出核心逻辑
    ExecutorService executorService = Executors.newCachedThreadPool();
    for (String urlString : parserNodeList2ImgsList) {
        executorService.execute(new DownLoadImgThread(RandomStringUtils.randomAlphabetic(5), urlString));//通过写入流,将图片写入磁盘

    }
    executorService.shutdown();
}

战利品展示:

图示 爬取下载的部分球队队徽、队旗

本案例中,可以通过HttpClient对目标url发起客户端请求或HtmlParser转换解析器直接获取url网页文本,后者相对方便。

调用HtmlParser解析中的函数getImgTags完成对文本图片标签的过滤、提取(也可以通过HtmlParser工具jar包中的NodeFilter 过滤器,指定目标标签过滤筛选)。

案例2:抓取需要客户端登录状态的网站信息

本案例,是通过公司内部wiki网页进行爬取的。

//一句话不合,马上就上代码

HttpClient client = postLogin(loginUrl); //创建客户端连接对象,提交登录

String tarPage = getTargetPage(reqUrl, client);//同一个客户端对象 parsePage(tarPage);//解析获取到的目标文本

主要介绍几处不同点:

wiki网站记录公司内部日常交流资料,是需要OA账号完成登录下才能访问的。所以,在爬取这类需要登录的网页时,首先必须完成账号的登录步骤。

大概步骤如下:

1、借助开发工具,获取登录页面输入框标签的id;

2、通过 List<NameValuePair> parms 封装账号信息;

3、httpClient发起post请求,提交至目标验证url,账号信息正确通过验证;

4、使用同一个httpClient客户端对象必须是通过验证那个),再次对所要爬取的种子URL发起类似案例1的请求,解析出所要的文本标签内容即可;

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2016-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

php性能监测模块XHProf

一,什么是XHProf XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开销,可...

3826
来自专栏Python中文社区

用Python将word文件转换成html

序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上。客户大大说,要智能推送!要掌握节奏!要深度学习!要让用户...

7587
来自专栏java初学

页面置换算法

76611
来自专栏小程序之家

如何在小程序中实现人脸识别功能

本文将介绍在小程序端,使用腾讯云云智AI应用服务来进行人脸识别检测分析,实现人脸识别等功能。

14K16
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十四)

导读为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

1072
来自专栏余林丰

代理模式

代理模式,在UML类结构上很好理解, 不过在实际应用当中可能并不是很清楚代理模式应用在哪些场景里。这里给出《大话设计模式》中对代理模式应用场合的解释: 第一,远...

2296
来自专栏吉浦迅科技

DAY86:阅读Kernel Execution

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第85天,我们正在讲解Driver API,希望在接下来的15天里,您可...

941
来自专栏信安之路

ROP Emporium 挑战 WP

ROP Emporium 挑战是用来学习 ROP 技术的一系列挑战,本文就对于其中涉及的所有挑战记录一下 wirte up。

1090
来自专栏月色的自留地

AngularJS2+调用原有的js脚本(AngularJS脚本跟本地原有脚本之间的关系)

1826
来自专栏架构师小秘圈

你所不知道的库存超限做法

作者:程序诗人,来自:cnblogs.com/scy251147 零,题记 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达...

3386

扫码关注云+社区

领取腾讯云代金券