这是 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 网络爬虫,需要哪些基础知识?

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

  2. Java网络爬虫笔记

    Java网络爬虫笔记 HttpClient来代替浏览器发起请求. select找到的是元素,也就是elements,你想要获取具体某一个属性的值,还是要用attr("")方法.标签 ...

  3. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  4. java网络爬虫基础学习(三)

    尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...

  5. java网络爬虫基础学习(一)

    刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...

  6. 简单的Java网络爬虫(获取一个网页中的邮箱)

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...

  7. java网络爬虫----------简单抓取慕课网首页数据

    © 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...

  8. 开源的49款Java 网络爬虫软件

    参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...

  9. 【转】44款Java 网络爬虫开源软件

    原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页 ...

随机推荐

  1. NLP(十二)指代消解

    代词是用来代替重复出现的名词 例句: 1.Ravi is a boy. He often donates money to the poor. 先出现主语,后出现代词,所以流动的方向从左到右,这类句子 ...

  2. BZOJ-2535 航空管制 toposort

    题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理. 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件. 对于第一问,直接toposort 然后反着输出求出的 ...

  3. 树莓派4B安装64位Linux(不用显示器键盘鼠标)

    入手了树莓派4B,我对它的定位是作为一个Docker实验环境,平时用到的镜像多为Java服务端常用的技术.以及自己作的Java应用镜像,因此宿主机需要64位操作系统,而树莓派官方操作系统只有32位的, ...

  4. 使用Git初始化本地仓库并首次提交代码

    本文介绍使用Git初始化本地仓库,并首次提交代码到远程仓库GitLab上面. 首先,登录GitLab,创建一个新项目的私人仓库: 然后,在本地仓库(就是你写代码文件夹),右键,Git Bash Her ...

  5. Unity - 2D中的物理关节

    本文概述: 分析Unity中几个2D物理关节组件的基本功能.使用方法.运用场景等 开发环境:Unity2019.3.0a2 / VS2017 项目资源包: 2D Joints Starter 说明: ...

  6. java 中for循环中断的办法

    /* 中断for循环的办法: 1.break ***2.return是结束方法的,不是结束循环的. 3.标签的方法. 格式: 表签名:语句 运行结果:D:\test\day0413>java T ...

  7. 007 Python程序语法元素分析

    目录 一.概述 二.程序的格式框架 2.1 代码高亮 2.2 缩进 2.3 注释 2.4 缩进.注释 三.命名与保留字 3.1 变量 3.2 命名 3.3 保留字 3.4 变量.命名.保留字 四.数据 ...

  8. springboot打包jar包后运行

    我们知道,spring boot内嵌tomcat,打包成jar包以后,直接就可以运行. 我们也可以使用启动项里面的mian入口来运行程序. 运行jar包时,我们一般是java -jar xxx.jar ...

  9. Https、OpenSSL自建CA证书及签发证书、nginx单向认证、双向认证及使用Java访问

    0.环境 本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 必须安装nginx,必须安装openssl,(用apt-get upd ...

  10. Apache Commons Collections 反序列化详细分析学习总结

    0x01.环境准备: Apache Commons Collections 3.1版本,下载链接参考: https://www.secfree.com/a/231.html jd jui地址(将jar ...