感谢小臣投稿

本文将简述网络爬虫及其工作流程,结合个人实践,简单介绍如何使用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达人

ID:java_daren

如何编写一个简易网络爬虫相关推荐

  1. python爬虫捕鱼网站_一个简易的爬虫工具,使用Python语言编写,用于zhihu全自动捕鱼...

    简介 这是什么 这是一个简易的爬虫工具,使用Python语言编写,用于zhihu全自动捕鱼,理论上,你可以爬取你感兴趣的任何问题,而不仅仅是小姐姐. 如何使用 编程使用 请确保你的Python版本是3 ...

  2. java爬虫编写步骤_JAVA爬虫--编写第一个网络爬虫程序

    JAVA爬虫–编写第一个网络爬虫程序 前言上一章节介绍了XPATH基础语法,本章节将手把手带大家编写第一个爬虫程序,同时也希望能通过这个爬虫程序,帮助大家熟悉上一章节学习的XPATH基础语法并运用到实 ...

  3. python写一个文件下载器_Python3使用TCP编写一个简易的文件下载器

    原标题:Python3使用TCP编写一个简易的文件下载器 利用Python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造 ...

  4. python 正则的使用 —— 编写一个简易的计算器

    python 正则的使用 -- 编写一个简易的计算器 在 Alex 的博客上看到的对正则这一章节作业是编写一个计算器,要求能计算出下面的算式. 1 - 2 * ( (60-30 +(-40/5) * ...

  5. c语言实现 网络嗅探程序代码,一个简易网络嗅探器的实现源代码.doc

    一个简易网络嗅探器的实现源代码 摘要:本文介绍一个用C语言和网络数据包分析开发工具实现的简易网络Sniffer. 要害词:网络:数据包:Sniffer 引言 目前,已经有不少的Sniff工具软件,如W ...

  6. Android 中编写一个简易购物车,商品包括商品名称,单价,数量,可以对商品进行增删改查功能。(ArrayList,SQLite)

    Android 中编写一个简易购物车,商品包括商品名称,单价,数量,可以对商品进行增删改查功能.(ArrayList,SQLite) 布局(activity_main.xml): <?xml v ...

  7. 仿照Windows的计算器,编写一个简易的计算器程序,实现加、减、乘、除等运算。

    仿照Windows的计算器,编写一个简易的计算器程序,实现加.减.乘.除等运算. 偷懒了很多,将就着用吧: import java.awt.FlowLayout; import java.awt.ev ...

  8. 十位数连加 c语言,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 人气:435 ℃时间:2020-04-10 06:55:13 优质解答 ...

  9. python9行代码_如何用9行Python代码编写一个简易神经网络

    原标题:如何用9行Python代码编写一个简易神经网络 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 学习人工智能时,我给自己定了一个目标--用Pyth ...

最新文章

  1. android 代码设置居右_android如何让textview文字居右
  2. 安装计算机过程中的注意事项,西门子step7安装过程中的注意事项
  3. Spring异常解决 java.lang.NullPointerException,配置spring管理hibernate时出错
  4. thymeleaf报错:Could not load content for xxx /css/bootstrap.min.css.map:HTTP error: status
  5. 用栈实现括号匹配的检验
  6. python三大流程控制
  7. [POI2006]OKR-Periods of Words
  8. 大数据项目开发案例_大数据分析技术——项目案例1(猫眼电影数据分析上)...
  9. php写的squid验证辅助器
  10. 【华为云技术分享】敏捷开发落地不实际?原因可能在于你的 IDE 工具
  11. oracle保存时间到数据库
  12. excel2003出现“向程序发送命令时出现错误”解决方法
  13. 利用哈希表设计快速电话号码查询系统
  14. 解决--网页兼容模式下虚拟打印保存为pdf乱码
  15. 免费搭建无限容量个人网盘
  16. matlab 读取npy,在将mat中的mat数据转换为Python中使用的NPY数据时遇到的Pit问题,Matlab,转成,python,npy,坑...
  17. 谷歌浏览器报错-应用程序正常初始化(0xc0000005)
  18. c语言 遍历搜索文件夹(获取文件夹中所有内容)
  19. KT142A语音芯片IC的固件升级方法详细描述,PC升级和U盘升级
  20. Windows 8.1核心版通过注册表启用Guest账号的局域网共享

热门文章

  1. JS正则验证输入框姓名只能输入中文和英文
  2. 阿里云主机迁移 配置域名解析 顶级域名配置子域名
  3. cuteftp向服务器传输文件没有权限
  4. logback之二:输出日志到控制台
  5. OpenCV-颜色通道的分离、合并
  6. ZUI + SSM框架下数据表格的使用
  7. java 获取回车字符_java回车键的字符
  8. 计算机与昆虫关系的论文,趣味昆虫学论文 昆虫与人类的关系
  9. js阻止冒泡事件发生(react)
  10. Altium Designer 20 (6)——二极管以及光耦元件创建