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

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

Jsoup 方式提取信息

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

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

org.jsoup

jsoup

1.12.1

好了,接下来我们一起分析页面吧,想必你还没浏览过吧,点击这里浏览虎扑新闻。在列表页中,我们利用 F12 审查元素查看页面结构,经过我们分析发现列表新闻在

标签下,每一条新闻都是一个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 标签

// 霍华德:夏休期内曾节食30天,这考验了我的身心

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 包

org.apache.httpcomponents

httpclient

4.5.10

org.apache.httpcomponents

httpcore

4.4.10

org.apache.httpcomponents

httpmime

4.5.10

关于虎扑列表新闻页面,我们在使用 Jsoup 方式的时候进行了简单的分析,这里我们就不在重复分析了。对于使用正则表达式方式提取,我们需要找到能够代表列表新闻的结构体,比如:

直上云霄!魔术官方社媒晒富尔茨扣篮炫酷特效图

这段结构体,每个列表新闻只有链接和标题不一样,其他的都一样,而且

是列表新闻特有的。最好不要直接正则匹配 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

*

与球迷亲切互动!凯尔特人官方晒球队开放训练日照片

*/

Pattern pattern = Pattern

.compile("

\\s*

\\s* (.*?)\\s*

\\s*

" );

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爬虫学习_java网络爬虫基础学习(一)

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

  2. java udp 协议_网络协议 - UDP 协议详解

    ¶ 网络协议 - UDP 协议详解 基于TCP和UDP的协议非常广泛,所以也有必要对UDP协议进行详解.@pdai ¶ UDP概述 UDP(User Datagram Protocol)即用户数据报协 ...

  3. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  4. java 类参数_Java的数据类型和参数传递(详解)

    Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...

  5. java lombok 视频_Java开发神器Lombok使用详解

    最近正在写SpringBoot系列文章和录制视频教程,每次都要重复写一些Getter/Setter.构造器方法.字符串输出的ToString方法和Equals/HashCode方法等.甚是浪费时间,也 ...

  6. java静态多态_Java静态方法不具有多态性详解

    动态绑定机制使得基类的引用能够指向正确的子类对象,从而使得面向基类编程成为可能. 然而动态绑定在以下两种情况会失效. 1.基类方法是private或final修饰的 这个很好理解,因为private说 ...

  7. java linkedlist实例_Java Linkedlist原理及实例详解

    这篇文章主要介绍了Java Linkedlist原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定义:linkedlist属于链表结构 ...

  8. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  9. java observer模式_Java观察者模式(Observer)详解及应用

    Java观察者模式(Observer)详解及应用 (2011-12-15 14:03:30) 标签: 杂谈 Java观察者模式(Observer)详解及应用 由于网站带有弱sns功能,因此需要设计关注 ...

最新文章

  1. vivado的ip核使用-pll
  2. Leangoo敏捷工具如何升级至企业版
  3. sql优化的方法及思路_微生物发酵 技术优化思路 与方法
  4. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
  5. php7 提示500错误解决,升级php7出现500错误怎么办
  6. appium定位元素java篇【转】
  7. oracle表分析都分析什么,oracle表分析
  8. ASP.Net中调用CSS
  9. 我要学python之装饰器
  10. 查看从库mysql同步错误日志_常见MySQL同步错误恢复方法
  11. linux 目录权限上下文,文件和目录的安全上下文
  12. 子模的性质(submodular)
  13. Windows10怎么设置双屏?双屏显示设置有哪些?
  14. Win10下Wireless-AC 3165无法开启热点
  15. 计算机毕业设计Java抑郁症患者博客交流平台(系统+源码+mysql数据库+Lw文档)
  16. mongo addShard with error “errmsg“ : “in seed list shard1 xxx does not belong to replica set“
  17. multisim与门测试
  18. [JavaScript]多个表单中文件上传网址的获得的代码示例
  19. VTK笔记-几何变换-绕任意轴旋转
  20. 静态页面对于搜索引擎的影响

热门文章

  1. H3C堆叠交换机故障替换及演练笔记(华三堆叠交换机故障替换或演练)
  2. 算法分析中常用的几种渐进符号
  3. 参考PR创建PO净价被信息记录覆盖问题
  4. C语言实现高斯消去法和列主元高斯消去法
  5. 贺斌教授团队:多少冥想训练才能提高脑机接口的性能?
  6. js中的NaN并不等于NaN
  7. Editplus修改调节字体大小的快捷键
  8. hbase bulkload 出现 Retry attempted x times without completing, bailing out解决
  9. Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
  10. 8月14日云栖精选夜读 | 报告老板!这个阿里程序员每天上班就看别人接吻