前言

防砸声明:此文仅仅能保证入门,不保证商业生产。

最终实现效果:

爬虫简介:

引用钱洋博士课程的部分内容(有删改):

网络爬虫技术,有效的获取网络数据资源的重要方式。简单的理解,比如您对百度贴吧的一个帖子内容特别感兴趣,而帖子的回复却有1000多页,这时采用逐条复制的方法便不可行。而采用网络爬虫便可以很轻松地采集到该帖子下的所有内容。

网络爬虫的作用,我总结为以下几点:

  • 舆情分析:企业或政府利用爬取的数据,采用数据挖掘的相关方法,发掘用户讨论的内容、实行事件监测、舆情引导等。
  • 企业的用户分析:企业利用网络爬虫,采集用户对其企业或商品的看法、观点以及态度,进而分析用户的需求、自身产品的优劣势、顾客抱怨等。
  • 科研工作者的必备技术:现有很多研究都以网络大数据为基础,而采集网络大数据的必备技术便是网络爬虫。利用网络爬虫技术采集的数据可用于研究产品个性化推荐、文本挖掘、用户行为模式挖掘等。

按照陈树义前辈在《聊聊整体性学习方法》一文中提到的思想,本文思路如下:

  1. 获取:目前都有哪些爬虫技术?
  2. 理解:这些爬虫技术的特色是什么?
  3. 扩展:快速上手一下cdp4j爬虫技术。
  4. 纠错:解析网页过程中踩过的坑与填坑之路。
  5. 应用:实战爬取网易新闻评论内容。

正文

一、目前都有哪些爬虫技术,及其特色都是什么?

​ 先说一句我不是专业搞爬虫的,从2019-07-06到2019-07-11累计学习6天。这篇文章是对我这6天学习的总结。以我浅显的了解,在此我列出我曾经尝试过后来又放弃了的框架,最后压轴(zhoù)再写我正在使用的框架。目前有以下流行的爬虫框架技术:

  1. Apache Nutch(高大上)

    Nutch这个框架运行需要Hadoop,Hadoop需要开集群,对于想要快速入门爬虫的我是望而却步了…

    一些资源地址列在这里,说不定以后会学习呢。

    Apache顶级项目列表

    Nutch官网

    Nutch官方教程


  1. Crawler4j(感觉很强)

    从它的包名上可以看出这个框架来自加州大学欧文分校。我下载下来Demo运行了一下,感觉很强!但他的官方文档介绍很简洁,Demo只是运行了一下没看懂怎么用。之所以感觉很强,是看见了好的厉害的API,当然也有一些加州大学的名气影响。

    Crawler4j官方GitHub


  1. WebMagic(国产)

    根据网上介绍,这个框架产自曾就职于大众点评的黄亿华大佬,但是,无论GitHub还是码云上这个仓库已经两年没有更新了,其中有一个致命的“Bug”,不能爬https的链接。作者在GitHub的issue中明确说明会在下一个版本(0.7.4)中修复此“Bug”,但是,两年过去了,依然没有发布下一个版本,截止2019年7月11号,GitHub上依然是0.7.3版本,可能作者遇到了某种不可抗拒力量,导致无法维护下去。下图来自GitHub issues

WebMagic官网

GitHub地址

码云


  1. Spiderman2(国产)

    这个听名字就挺霸气的,和蜘蛛侠电影齐名。我也是下载下来Demo运行了一下,但是运行啥啥报错…

    而且官方库也没有提供文档。

    但是,之所以列出来这个库,是因为作者在码云的issue中现场教学感动了我。

Spiderman2码云地址


  1. WebController(国产·合肥工业大学)

    当我根据这个库的包名搜索出合肥工业大学时,心中只有两个字:牛X!

    维护这个库的兄弟还煞费苦心的把README.md全英文书写。不过同样是因为文档过于简陋。Demo运行了几个,不知道运行出来个啥。

    之所以贴出来这个,确实是因为他在GitHub上2000+star震惊到我了,同样身为大学生的我,求学三年,毫无产出,甚是惭愧。定当以前辈励志,再加努力。

    WebController官方GitHub


  1. HtmlUnit(经典)

    这个框架堪称经典,也是我们暑期实训老师讲解的框架。有近乎完整的文档介绍。

    但是,HtmlUnit使用起来相当麻烦,或许用多了就不觉得麻烦了。还有一点忍受不了,就是太慢了,慢到令人发指的地步!再尝试了几个Demo之后,我就放弃了。

    HtmlUnit官网


  1. Jsoup(经典·适合静态网友)

    这个框架堪称经典,也是我们暑期实训老师讲解的框架。有近乎完整的文档介绍。

    但是Jsoup只能get到静态网页内容。但是,当今世界,静态网页已经寥寥可数了,大都是与后台交互的动态网页,很多数据都是经过后台获取,渲染之后才能呈现在网页上。据我6天浅显的学习,发现单纯的Jsoup无法爬取动态网页内容。
    大家可以试一下,打开一篇网易新闻,然后右键查看源代码,你会发现,你所看到的页面和源代码内容并不是一一对应的。

    不过,这个框架有个有个优点,具有很强大的解析网页的功能。

    Jsoup中文教程


  1. selenium(Google多名大佬参与开发)

    感觉很厉害,实际真的很厉害,看官网以及其他人的介绍,说是真正模拟浏览器。GitHub1.4w+star,你没看错,上万了。但是我硬是没配好环境。入门Demo就是没法运行成功,所以就放弃了。

    ​ selenium 官方GitHub


  1. cdp4j(今天的主角)

    使用前提:

    安装Chrome浏览器,即可。

    简单介绍:

    HtmlUnit的优点在于,可以方便的爬取静态网友;缺点在于,只能爬取静态网页。

    selenium的优点在于,可以爬取渲染后的网页;缺点在于,需要配环境变量等等。

    将二者整合,取长补短,就有了cdp4j。

    之所以选用它,是因为真的方便好用,而且官方文档详细,Demo程序基本都能跑起来,类名起的见名知意。想当年学软件工程的时候,一直在纳闷,为什么要写文档啊,我程序能实现功能不就得了?现如今,看着如此详实的文档,留下了激动而又悔恨的泪水…

    cdp4j有很多功能:

    a. 获得渲染后的网页源码

    b. 模拟浏览器点击事件

    c. 下载网页上可以下载的文件

    d. 对网页进行截屏或转PDF打印

    e. 拿到网页响应内容

    f. 等等

    更多详细信息可以自行去如下三个地址中探索发现:

    [cdp4j官网地址]

    [Github仓库]

    [Demo列表]

小结

我在正文列出了9个爬虫框架。有强如Apache、Google大佬开发维护,也有诸如我国合肥工业大学学生的作品。其实各有各自的特色,弱水三千,我想全喝,但没有那个能力。所以目前只饮一瓢,就是cdp4j了。

二、快速上手一下cdp4j爬虫技术

首先,再强调一点:使用前提是安装了Chrome浏览器

当然,不能凭空使用,还需要Maven依赖

<dependency><groupId>io.webfolder</groupId><artifactId>cdp4j</artifactId><version>3.0.12</version>
</dependency>
<!-- 2.2.1 版本的cdp4j不用导入winp;3.0+ 版本的cdp4j需要导入此包 -->
<!-- https://mvnrepository.com/artifact/org.jvnet.winp/winp -->
<dependency><groupId>org.jvnet.winp</groupId><artifactId>winp</artifactId><version>1.28</version>
</dependency>

先看一下官网给出的HelloWorld

看出来我贴的是一张图片了吗?所以先别着急敲,因为这个程序还需要稍作修改,如下:

import io.webfolder.cdp.Launcher;
import io.webfolder.cdp.session.Session;
import io.webfolder.cdp.session.SessionFactory;import static java.util.Arrays.asList;public class HelloWorld {public static void main(String[] args) {Launcher launcher = new Launcher();try (SessionFactory factory = launcher.launch(asList("--disable-gpu","--headless"))) {String context = factory.createBrowserContext();try (Session session = factory.create(context)) {// 设置要爬的网站链接,必须要有http://或https://session.navigate("https://www.baidu.com");// 默认timeout是10*1000 ms,也可以像下面这样手动设置session.waitDocumentReady(15 * 1000);// 通过session得到渲染后的html内容String html = session.getContent();System.out.println(html);}// session创建结束// 处理浏览器上下文,源码:contexts.remove(browserContextId)// 意思应该是将后台浏览器进程关闭// 我曾经尝试将此举注释,只保留下面的launcher.getProcessManager().kill();// 依然可以关闭后台进程,但是官方给的代码有这句,那就带着吧,或许有其他作用。factory.disposeBrowserContext(context);}// factory创建结束// 真正的关闭后台进程launcher.getProcessManager().kill();}// main方法结束}

上面的代码你可以手动敲一遍,当然一般都是复制粘贴的。

与截图不同的是:

  1. 这里的factory和session是在两个不同的try-with-resource语句中创建的,
  2. 创建factory时多了一句 asList("–disable-gpu","–headless") 这个作用就是不启用GPU加速,不弹出浏览器
  3. 在最后对BrowserContex以及launcher进行了关闭操作以达到回收内存的目的。

大家如果不理解这段代码的作用,可以自行运行一下两种代码,然后打开任务管理器,查看IDEA进行下的子进程。

运行结束后再看一下任务管理器,如果执行了关闭操作,那么IDEA下的子进程会被关闭,否则,有两种情况:

  1. 创建factory时候,没有加上 asList("–disable-gpu","–headless") 这样会弹出一个Chrome浏览器,需要手动进行关闭

  2. 创建factory时候,加上了 asList("–disable-gpu","–headless") 这样IDEA进程的子进程,也就是上图的Google Chrome会驻留在后台,占据内存资源。

小结

​ 说白了,cdp4j就是一个模拟浏览器,区别于HtmlUnit,这里是真的用到了浏览器,如果代码写的不对,还会弹出浏览器,吓你一跳 : )

​ 目前只是简简单单的获取到了渲染后的html,真正的爬虫可不仅仅就这。

三、解析网页过程中踩过的坑与填坑之路

  1. 啥是xPath?

    详细介绍可以参考W3cSchool XPath 简介 或者 Runoob XPath 简介

    我在这里简单总结一下:xPath是用来遍历DOM树的

    你要是敢问我啥是DOM树,我可就举起来拖鞋抽你了 : ) 哈哈,开玩笑,同样也是看一下W3CSchool HTML DOM 简介 或者 Runoob HTML DOM 简介

  2. 如何快速获取一个节点的xPath?

    我们暑期实训老师是按下F12,然后找到对应节点,再从上到下一个一个的数出来的xPath。

    第一次见这样操作的时候,由于新鲜感过于强烈,所以也就没有感到有多麻烦。不过,数的次数多了,总觉得这样不行。应该有更快更好的方法获取xPath。

    还记得SpiderMan2吗?自风老师在码云的issue里面亲身教学:Chrome获取XPath的方法

    整了半天,原来人家Chrome浏览器早就替我们实现好了,就知道我们要用到xPath干坏事。

  3. xPath具体怎么用?

    自风老师教的copy xPath直接用的话,只能是一个节点。

    实际上,有时候我们需要一次性拿到很多节点,比如说xPath路径都是div/p,这时候我们可以写成“//div/p”,又有时候,我们需要拿到指定class的div下的p,那么语法就是“//div[@class=‘classname’]/p”

    更详细的用法可以参考 Runoob XPath 语法

  4. 怎样快速解析一个html,拿到想要的内容?

    虽说cdp4j自带xPath解析功能,但要说解析html,还要属Jsoup最专业:Jsoup中文教程

    Jsoup支持xPath和CSS选择器,学前端的同学看到CSS选择器应该会很激动吧,我头一次看到内心是:竟然还有这种操作!

小结

​ xPath、Jsoup这些新名词,很多人(比如我)大学上了3年,还是头一次听说,所以需要一些时间去接近,熟悉最终才能掌握。

四、实战爬取网易新闻评论内容

【项目源码】 进去找 News163CommentCrawlerDemo 或者 News163CommentCrawlerDemo.zip

实现思路就是模拟真实浏览器拿到评论并展示的过程,注意是浏览器拿到评论的过程而不是人类拿到评论的过程,区别就在于,人类是通过html页面渲染,而浏览器是通过 解析json 动态加载的:

  1. 打开国内新闻链接:https://news.163.com/domestic/
  2. 从上面链接获取获取渲染后的html内容,拿到新闻列表的链接
  3. 根据新闻列表中的每一篇文章的链接获取渲染后的html内容,拿到新闻详细内容
  4. 根据新闻详细内容拿到评论地址
  5. 打开评论地址并拿到响应内容(官方Demo地址),正则匹配后拿到评论JSON API地址链接
  6. 请求评论JSON API链接,获取渲染后的html
  7. 解析渲染后的评论JSON HTML并拿到评论相关的内容

具体步骤:

  1. 打开IDEA new 一个新坑

  1. 完整pom.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.edu.heuet</groupId><artifactId>News163CommentCrawlerDemo</artifactId><version>1.0-SNAPSHOT</version><!-- 指定 JDK1.8进行编译 --><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build><properties><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source></properties><dependencies><!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version></dependency><!--<dependency>--><!--<groupId>io.webfolder</groupId>--><!--<artifactId>cdp4j</artifactId>--><!--<version>2.2.1</version>--><!--</dependency>--><!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version></dependency><dependency><groupId>io.webfolder</groupId><artifactId>cdp4j</artifactId><version>3.0.12</version></dependency><!-- 2.2.1 版本的cdp4j不用导入此包;3.0+ 版本的cdp4j需要导入此包 --><!-- https://mvnrepository.com/artifact/org.jvnet.winp/winp --><dependency><groupId>org.jvnet.winp</groupId><artifactId>winp</artifactId><version>1.28</version></dependency><!-- https://mvnrepository.com/artifact/org.json/json --><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20170516</version></dependency></dependencies>
</project>
  1. 项目目录结构

  2. Main.java内容概览

  1. 最终实现效果

【项目源码】 进去找 News163CommentCrawlerDemo 或者 News163CommentCrawlerDemo.zip (约 90kb)

注意:Maven需要指定Java1.8 否则try-with-resource中不能使用外部数据。

总结

虽说实现了爬取网易新闻评论的功能,但还有一些技术要点没有解决:

  1. 只能爬取第一页的内容,尚未实现分页爬取
  2. 爬取的内容有重复,尚未实现内存去重
  3. 爬取的内容没有持久化保存,尚未实现内容存入MongoDB(下篇会介绍如何入库)

时间匆匆,一晃6天就过去了。

【Java】爬虫,看完还爬不下来打我电话相关推荐

  1. 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘

    本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...

  2. java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)

    转载自 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一) 最近在找java的小项目自己写着玩,但是找不到合适的,于是写开始学一点爬虫,自己也是感觉爬虫比较有趣.这里自己找了一个 ...

  3. 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?

    综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称"精通iOS开发"吗? https://github.com/s ...

  4. Java爬虫学习一一Jsoup爬取彼岸桌面分类下的图片

    最近在找工作,在这个过程中我感到很迷茫,投了很多简历,被查看的却很少,其中也有到现场去面试,结果也很不理想(╥╯^╰╥). 哈哈,跑题了,我在看之前所做的项目时,在我的收藏夹中看到了以前收藏的有关爬虫 ...

  5. JVM-内存与垃圾回收篇!女朋友看了都想当架构师的超详细保姆级笔记!呕心沥血之作!看完还不会你砍我!

    1. JVM与Java体系结构 1.1 Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种 ...

  6. Android进阶必备:滑动冲突解决与事件分发机制(附视频讲解)这篇看完还不懂请寄刀片

    1.前言 Android学习一段时间,需求做多了必然会遇到滑动冲突问题,比如在一个ScrollView中要嵌套一个地图View,这时候触摸移动地图或者放大缩小地图就会变得不太准确甚至没有反应,这就是遇 ...

  7. 你不知道的js中关于this绑定机制的解析[看完还不懂算我输]

    前言 最近正在看<你不知道的JavaScript>,里面关于this绑定机制的部分讲的特别好,很清晰,这部分对我们js的使用也是相当关键的,并且这也是一个面试的高频考点,所以整理一篇文章分 ...

  8. java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码

    原创 野狗菌 希望你能喜欢 今天 关于本文: 本文介绍一个简单Java爬虫,获取网页源码,爬取电话号码. 本篇教程用我的博客一个测试网页演示. --野狗菌[希望你能喜欢] 测试页面: https:// ...

  9. 【网络编程】一、如何记住OSI七层协议模型,看完还记不住的来打我。

    学过计算机网络这门课的童鞋,一定都知道OSI七层协议模型. 那么现在闭上眼,能按顺序说出来的童鞋麻烦右上角点个赞,让博主看看有多少? 哇,0个赞,不是吧. 没关系,下面跟着博主的思路,看完本篇之后,我 ...

  10. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    为什么80%的码农都做不了架构师?>>>    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影**<海王>**详细信息[电影名称.电影迅雷下载地址列表] ...

最新文章

  1. xshell 图形化连接ubuntu
  2. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结
  3. java 消息推送_hanbo-push分布式消息推送、IM服务
  4. 关于Servlet和异步Servlet
  5. css响应式网格布局生成器_如何使用网格布局模块使用纯CSS创建响应表
  6. opencv 手册_有兴趣吗?程序员分手手册,教你如何恢复单身
  7. 计算机一级考试复习资料,全国计算机一级考试复习资料
  8. 还在担心快应用没流量?全场景新玩法来袭!
  9. 挑战微信、试探苹果?支付宝小程序可添加到 iOS 手机桌面
  10. 科技爱好者周刊(第 179 期):AR 技术的打开方式
  11. 自定mvc之新增,下架以及上架
  12. 马克维茨组合matlab,马克维茨投资组合模型的matlab计算.pdf
  13. 微信开发者工具上传照片后下载图片一直报40007:invalid media_id hint: [UUtO4a0341d142] rid: 5fd84e4d-5a3
  14. 华为鸿蒙新机是哪款,华为新机来了!预装鸿蒙 OS,搭载麒麟 9000!
  15. 2022-2028全球多通道光纤旋转接头(FORJ)行业调研及趋势分析报告
  16. 海康内置4G卡的摄像头设备无法注册EasyCVR平台是什么原因?
  17. 【NAS】群晖使用自带DDNS实现外网访问
  18. 电脑双屏开机后副屏黑屏,电脑开机显示器黑屏,教您电脑开机后屏幕黑屏怎么解决...
  19. 刺激战场电脑版android,绝地求生刺激战场怎么用电脑玩 绝地求生刺激战场pc版安装攻略...
  20. foobar2000隐藏桌面悬浮窗头像_如何解锁华为手机隐藏的超能力?

热门文章

  1. 无线信道特性分析及建模仿真
  2. 软件项目管理考试指南—By XJTUSE【YJQ】
  3. 51单片机:8051指令简介
  4. Hub设备、网桥、二层交换机设备概述
  5. EF多表关联数据更新
  6. 杭州电子科技大学ACM-1001
  7. MATLAB绘图—三维网格绘图(mesh)
  8. 【通識:人生哲學與幸福】老子人生觀巡禮
  9. HI3516A/Hi3516D H265流结构分析
  10. html中图片旋转木马,教你怎么用CSS3做一个图片的旋转木马效果