这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识。第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑列表新闻的新闻标题和详情页为例,需要提取的内容如下图所示:

我们需要提取图中圈出来的文字及其对应的链接,在提取的过程中,我们会使用两种方式来提取,一种是 Jsoup 的方式,另一种是 httpclient + 正则表达式的方式,这也是 Java 网络爬虫常用的两种方式,你不了解这两种方式没关系,后面会有相应的使用手册。在正式编写提取程序之前,我先交代一下 Java 爬虫系列博文的环境,该系列博文所有的 demo 都是使用 SpringBoot 搭建的,不管你使用哪种环境,只需要正确的导入相应的包即可。

Jsoup 方式提取信息

我们先来使用 Jsoup 的方式提取新闻信息,如果你还不知道 Jsoup ,请参考 https://jsoup.org/

先建立一个 Springboot 项目,名字就随意啦,在 pom.xml 中引入 Jsoup 的依赖

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.12.1</version>
</dependency>

好了,接下来我们一起分析页面吧,想必你还没浏览过吧,点击这里浏览虎扑新闻。在列表页中,我们利用 F12 审查元素查看页面结构,经过我们分析发现列表新闻在 <div class="news-list">标签下,每一条新闻都是一个li标签,分析结果如下图所示:

由于我们前面已经知道了 css 选择器,我们结合浏览器的 Copy 功能,编写出我们 a标签的 css 选择器代码:div.news-list > ul > li > div.list-hd > h4 > a ,一切都准备好了,我们一起来编写 Jsoup 方式提取信息的代码:

/*** jsoup方式 获取虎扑新闻列表页* @param url 虎扑新闻列表页url*/
public void jsoupList(String url){try {Document document = Jsoup.connect(url).get();// 使用 css选择器 提取列表新闻 a 标签// <a href="https://voice.hupu.com/nba/2484553.html" target="_blank">霍华德:夏休期内曾节食30天,这考验了我的身心</a>Elements elements = document.select("div.news-list > ul > li > div.list-hd > h4 > a");for (Element element:elements){//                System.out.println(element);// 获取详情页链接String d_url = element.attr("href");// 获取标题String title = element.ownText();System.out.println("详情页链接:"+d_url+" ,详情页标题:"+title);}} catch (IOException e) {e.printStackTrace();}
}

使用 Jsoup 方式提取还是非常简单的,就5、6行代码就完成了,关于更多 Jsoup 如何提取节点信息的方法可以参考 jsoup 的官网教程。我们编写 main 方法,来执行 jsoupList 方法,看看 jsoupList 方法是否正确。

public static void main(String[] args) {String url = "https://voice.hupu.com/nba";CrawlerBase crawlerBase = new CrawlerBase();crawlerBase.jsoupList(url);
}

执行 main 方法,得到如下结果:


从结果中可以看出,我们已经正确的提取到了我们想要的信息,如果你想采集详情页的信息,只需要编写一个采集详情页的方法,在方法中提取详情页相应的节点信息,然后将列表页提取的链接传入提取详情页方法即可。

httpclient + 正则表达式

上面我们使用了 Jsoup 方式正确提取了虎扑列表新闻,接下来我们使用 httpclient + 正则表达式的方式来提取,看看使用这种方式又会涉及到哪些问题?httpclient + 正则表达式的方式涉及的知识点还是蛮多的,它涉及到了正则表达式、Java 正则表达式、httpclient。如果你还不知道这些知识,可以点击下方链接简单了解一下:

正则表达式:正则表达式

Java 正则表达式:Java 正则表达式

httpclient:httpclient

我们在 pom.xml 文件中,引入 httpclient 相关 Jar 包

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.10</version>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.10</version>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.10</version>
</dependency>

关于虎扑列表新闻页面,我们在使用 Jsoup 方式的时候进行了简单的分析,这里我们就不在重复分析了。对于使用正则表达式方式提取,我们需要找到能够代表列表新闻的结构体,比如:<div class="list-hd"> <h4> <a href="https://voice.hupu.com/nba/2485508.html" target="_blank">直上云霄!魔术官方社媒晒富尔茨扣篮炫酷特效图</a></h4></div>这段结构体,每个列表新闻只有链接和标题不一样,其他的都一样,而且 <div class="list-hd">是列表新闻特有的。最好不要直接正则匹配 a标签,因为 a标签在其他地方也有,这样我们就还需要做其他的处理,增加我们的难度。现在我们了解了正则结构体的选择,我们一起来看看 httpclient + 正则表达式方式提取的代码:

/*** httpclient + 正则表达式 获取虎扑新闻列表页* @param url 虎扑新闻列表页url*/
public void httpClientList(String url){try {CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);CloseableHttpResponse response = httpclient.execute(httpGet);if (response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();String body = EntityUtils.toString(entity,"utf-8");if (body!=null) {/** 替换掉换行符、制表符、回车符,去掉这些符号,正则表示写起来更简单一些* 只有空格符号和其他正常字体*/Pattern p = Pattern.compile("\t|\r|\n");Matcher m = p.matcher(body);body = m.replaceAll("");/** 提取列表页的正则表达式* 去除换行符之后的 li* <div class="list-hd">                                    <h4>                                        <a href="https://voice.hupu.com/nba/2485167.html"  target="_blank">与球迷亲切互动!凯尔特人官方晒球队开放训练日照片</a>                                    </h4>                                </div>*/Pattern pattern = Pattern.compile("<div class=\"list-hd\">\\s* <h4>\\s* <a href=\"(.*?)\"\\s* target=\"_blank\">(.*?)</a>\\s* </h4>\\s* </div>" );Matcher matcher = pattern.matcher(body);// 匹配出所有符合正则表达式的数据while (matcher.find()){//                        String info = matcher.group(0);
//                        System.out.println(info);// 提取出链接和标题System.out.println("详情页链接:"+matcher.group(1)+" ,详情页标题:"+matcher.group(2));}}else {System.out.println("处理失败!!!获取正文内容为空");}} else {System.out.println("处理失败!!!返回状态码:" + response.getStatusLine().getStatusCode());}}catch (Exception e){e.printStackTrace();}}

从代码的行数可以看出,比 Jsoup 方式要多不少,代码虽然多,但是整体来说比较简单,在上面方法中我做了一段特殊处理,我先替换了 httpclient 获取的字符串 body 中的换行符、制表符、回车符,因为这样处理,在编写正则表达式的时候能够减少一些额外的干扰。接下来我们修改 main 方法,运行 httpClientList 方法。

public static void main(String[] args) {String url = "https://voice.hupu.com/nba";CrawlerBase crawlerBase = new CrawlerBase();
//        crawlerBase.jsoupList(url);crawlerBase.httpClientList(url);
}

运行结果如下图所示:

使用 httpclient + 正则表达式的方式同样正确的获取到了列表新闻的标题和详情页链接。到此 Java 爬虫系列博文第一篇就写完了,这一篇主要是 Java 网络爬虫的入门,我们使用了 jsoup 和 httpclient + 正则的方式提取了虎扑列表新闻的新闻标题和详情页链接。当然这里还有很多没有完成,比如采集详情页信息存入数据库等。

希望以上内容对你有所帮助,下一篇是模拟登陆相关的,如果你对 Java 网络爬虫感兴趣,不妨关注一波,一起学习,一起进步。

源代码:点击这里

文章不足之处,望大家多多指点,共同学习,共同进步

最后

打个小广告,欢迎扫码关注微信公众号:「平头哥的技术博文」,一起进步吧。

Java 网络爬虫,就是这么的简单相关推荐

  1. java网络爬虫0基础_简单的java爬虫程序(入门)

    首先做好准备工作: 了解正则表达式中基本的Select的用法: 此处引用楼主查到的资料 http://www.tuicool.com/articles/ZnyMvu 第一个爬虫:无验证码的简单爬虫 楼 ...

  2. 揭秘Java网络爬虫程序原理

    随着互联网+时代的来临,越来越多的互联网企业层出不穷,涉及游戏.视频.新闻.社交.电商.房产.旅游等众多行业.如今互联网成为大量信息的载体,如何有效地从中提取有价值的信息并利用这些信息成为一个巨大的挑 ...

  3. Java网络爬虫实操(3)

    上一篇:Java网络爬虫实操(2) 本篇文章主要介绍NetDiscovery框架中pipeline模式的一些实际使用方法. 1) 什么是pipeline pipeline是一种常见的算法模式,针对不断 ...

  4. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  5. Java网络爬虫该如何学习

    文章目录 引言 怎么入门网络爬虫 课程特色 学完本课程能收获什么 引言 互联网以及移动技术的飞速发展,使得全球数据量呈现前所未有的爆炸式增长态势.例如,用户在互联网上的搜索数据.交易数据.评论数据.社 ...

  6. Java网络爬虫基础概述

    Java网络爬虫基础 Http基础 网络资源一般是Web服务器上的一些各种格式的文件,通过Http协议传输互联网上的数据. 在Java中,通常通过URL标出网络资源的位置和Web服务器建立链接,获取网 ...

  7. Java网络爬虫学习记录(请求基础篇)

    目录 个人实验遇见错误集: 一.javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX ...

  8. python网络爬虫、Java 网络爬虫,哪个更好?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  9. 学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  10. Java网络爬虫入门:第01课:网络爬虫原理

    引言 随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要.目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术.简单的理解,比如您对百度贴吧的一个帖子内容特别感兴 ...

最新文章

  1. python五子棋人人对战_五子棋-人人对战
  2. 微软官方python教程下载-微软官方上线 Python 教程
  3. python全局变量定义_Python 3 实现定义跨模块的全局变量和使用
  4. linux 暂停一段时间,sleep命令_Linux sleep命令:让程序暂停或休眠一段时间
  5. 无人机是计算机什么方面的应用,无人机测绘可以应用到哪些方面呢?
  6. 中两个查询结果相减_MySQL 在查询结果中插入伪行
  7. 11gR2 grid安装最后报错[INS-20802] Oracle Cluster Verification Utility failed
  8. MySQL MGR与Galera性能测试
  9. 第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)
  10. linux内核I2C体系结构(注意结构体原型)
  11. linux 停止路由转发策略_Linux静态路由
  12. Hessian Matrix(海森矩阵)
  13. matlab图片数据库读取,MATLAB无法读取图像数据库问题
  14. Excel如何统计多种分隔符号的单元格姓名个数
  15. B站李沐讲论文笔记Transformer
  16. MySQL - MySQL 8.0(二)基本操作:对象
  17. 【win10专业版】win10系统下Office2013无法激活的解决方法
  18. linux twm 窗口调节,CENTOS5.1怎样在命令行模式下改变X窗口启动的方式(TWM)
  19. matlab 警告:警告: 更新 Legend 时出错。Not enough input arguments.
  20. 对合成大西瓜修改图片的实践

热门文章

  1. 万稞pw80线切割编程软件_Sodick 沙迪克慢走丝线切割机床,工件摆斜不校边加工步骤...
  2. mysql2005错误码_SQL Server2005 常见错误及解决方案
  3. 计算机桌面文件如何发送给qq好友,桌面文件如何发到qq
  4. 遗传算法原理及其matlab程序实现
  5. JS Map与JSON转换
  6. 小甲鱼python自学笔记
  7. 《暗黑3》是如何设计随机地下城的?
  8. Apache OpenOffice-java调用时的问题总结
  9. 喜马拉雅音频下载+x2m文件转换
  10. 在线教育知识付费源码,视频教程学习系统源码,网课小程序源码