Java网络爬虫

这是本文目录

这里写目录标题

  • Java网络爬虫
    • 1. HttpClient
      • 1.1 Get请求
      • 1.2 POST请求
      • 1.3 连接池
      • 1.4 参数设置
    • 2. Jsoup

本文将循序渐进介绍3大爬虫必备技术

  1. HttpClietn(负责请求页面并获得页面)
  2. Jsout(负责解析页面,提取元素)
  3. WebMagic(Java的一个爬虫框架,利用WebMagic可以整合1、2中的繁琐操作)
    WebMagic框架我们留到下一期讲解。

1. HttpClient

使用网络爬虫其实就是要用Java程序去访问Html页面,并对Html页面进行解析,而Java中HttpClient技术可以很好的访问Html页面,实现抓取网页数据的功能。话不多说,我们立即进入HttpClient的学习吧

1.1 Get请求

tips:以下只介绍使用中涉及的对象、方法,至于异常处理请大家实际操作中自己选择处理方式。

// 使用HttpClient之前必须先创建一个对象
CloseableHttpClient httpClient = HttpClients.createDefault();// 创建Get请求
HttpGet httpGet = new HttpGet("https://www.baidu.com/");// 使用HttpClient发起请求
CloseableHttpResponse response = httpClient.execute(httpGet);//获取响应 -> 判断响应状态码是否为200
if (response.getStatusLine().getStatusCode() == 200) {//如果为200表示请求成功,获取返回数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");System.out.println(content);}

以下代码为可用程序:

  public static void main(String[] args) throws IOException {//创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();//创建HttpGet请求HttpGet httpGet = new HttpGet("https://www.baidu.com/");CloseableHttpResponse response = null;try {//使用HttpClient发起请求response = httpClient.execute(httpGet);//判断响应状态码是否为200if (response.getStatusLine().getStatusCode() == 200) {//如果为200表示请求成功,获取返回数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");//打印数据长度System.out.println(content);}} catch (Exception e) {e.printStackTrace();} finally {//释放连接if (response == null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}}

请求百度页面时,有时候会出现请求失败的问题,目前博主还没有有效解决方案,不过只要多请求几次即可,大家知道原因的欢迎补充

带参数的Get请求

以百度为例,我们要检索三星S20手机,首先分析百度的URL

https://www.baidu.com/s?wd=三星S20

接下来我们来编写我们的代码,主要方法与上述一致,这里直接给出可用代码

public static void main(String[] args) throws IOException {//创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();//创建HttpGet请求,带参数的地址https://www.baidu.com/s?wd=HttpClientString uri = "https://www.baidu.com/s?wd=三星S20";HttpGet httpGet = new HttpGet(uri);CloseableHttpResponse response = null;try {//使用HttpClient发起请求response = httpClient.execute(httpGet);//判断响应状态码是否为200if (response.getStatusLine().getStatusCode() == 200) {//如果为200表示请求成功,获取返回数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");//打印数据长度System.out.println(content);}} catch (Exception e) {e.printStackTrace();} finally {//释放连接if (response == null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}
}

1.2 POST请求

POST的无参请求与GET请求的使用方式一样,只不过这次创建的时HTTPPOST对象

public static void main(String[] args) throws IOException {//创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();//创建HttpGet请求HttpPost httpPost = new HttpPost("http://www.itcast.cn/");CloseableHttpResponse response = null;try {//使用HttpClient发起请求response = httpClient.execute(httpPost);//判断响应状态码是否为200if (response.getStatusLine().getStatusCode() == 200) {//如果为200表示请求成功,获取返回数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");//打印数据长度System.out.println(content);}} catch (Exception e) {e.printStackTrace();} finally {//释放连接if (response == null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}
}

带参数的POST请求

在POST请求中,如果需要带参数的话,必须使用一些对象来模拟表单请求

以下为使用的对象

     //声明存放参数的List集合List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("keys", "java"));//创建表单数据EntityUrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8");//设置表单Entity到httpPost请求对象中httpPost.setEntity(formEntity);

可用代码如下:

public static void main(String[] args) throws IOException {//创建HttpClient对象CloseableHttpClient httpClient = HttpClients.createDefault();//创建HttpGet请求HttpPost httpPost = new HttpPost("http://www.itcast.cn/");//声明存放参数的List集合List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("keys", "java"));//创建表单数据EntityUrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8");//设置表单Entity到httpPost请求对象中httpPost.setEntity(formEntity);CloseableHttpResponse response = null;try {//使用HttpClient发起请求response = httpClient.execute(httpPost);//判断响应状态码是否为200if (response.getStatusLine().getStatusCode() == 200) {//如果为200表示请求成功,获取返回数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");//打印数据长度System.out.println(content);}} catch (Exception e) {e.printStackTrace();} finally {//释放连接if (response == null) {try {response.close();} catch (IOException e) {e.printStackTrace();}httpClient.close();}}
}

1.3 连接池

通过上述的学习我们发现,每次爬取信息都要创建以此连接,使用完后又得关闭连接。因此我们使用连接池技术,避免频繁的创建销毁,提高爬取效率。话不多说,进入代码的学习。

  • 创建连接池
 PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
  • 从连接池中获取连接
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();

1.4 参数设置

//创建HttpClient对象
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(1000)//设置创建连接的最长时间.setConnectionRequestTimeout(500)//设置获取连接的最长时间.setSocketTimeout(10 * 1000)//设置数据传输的最长时间.build();

2. Jsoup

通过HttpClient,我们可以轻松的抓取网页了,那么得到网页后,我们该如何解析呢,这个时候Jsoup就登场了。

 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup的主要功能如下:
1.从一个URL,文件或字符串中解析HTML;
2.使用DOM或CSS选择器来查找、取出数据;
3.可操作HTML元素、属性、文本;

使用Maven工程导入Jsoup依赖:

<!--Jsoup-->
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.3</version>
</dependency>
<!--测试-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version>
</dependency>
<!--工具-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

具体的学习我就不放在这里介绍了,由于博主已经掌握了Jsoup方面的知识,且Jsoup官方API已经有很不错的教程,大家可以到官方中文网站学习,这是学习地址:https://www.open-open.com/jsoup/
如果有需要的话,后面有空我会将这里的教程补充一下。

接下来直接进入本文的关键部分,WebMagic爬虫框架

Java网络爬虫全面教程相关推荐

  1. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

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

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

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

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

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

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

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

    上一篇:Java网络爬虫实操(4) 大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里解析出我们想要的数据. 但是,随着前端编程技术的发展,至少十多年前开始ajax.jso ...

  6. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...

    廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...

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

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

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

    上一篇:Java网络爬虫实操(7) 大家好,本篇文章介绍一下NetDiscovery爬虫框架里的downloader对象 1) 前言 面向对象设计仍然是目前编程的核心思想,从下面截图可以了解爬虫框架的 ...

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

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

  10. python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...

    感谢大家长期对Python爱好者社区的支持,后期Python爱好者社区推出Python网络爬虫系列教程.欢迎大家关注.以下系列教程大纲,欢迎大家补充.视频长期连载更新中 --------------- ...

最新文章

  1. Oracle 触发器使用实例
  2. 程序员应知——学习、思考与分享
  3. 解决 GStreamer 遇到了常规流错误问题
  4. java链表交集并集,一个链表求集合并集交集的异常
  5. 通俗理解Paxos算法
  6. vue 中$index $key 已移除
  7. linux tomcat 改端口号,Ubuntu中Tomcat更改80端口
  8. (31)SystemVerilog语言编写D触发器
  9. Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
  10. java程序能转变为javafx_躁!DJ 风格 Java 桌面音乐播放器
  11. Python之面向对象的程序设计
  12. mysql 清理表碎片需要停止数据库吗_Mysql的表的碎片清理
  13. 阿里巴巴 程劭非(寒冬)- 《浅谈前端交互的基础设施的建设》
  14. linux raid5 nas,free nas 创建软raid5 来做iscsi服务 1
  15. win10出现的异常解决
  16. 南京大学俞扬:环境模型学习——让强化学习走出游戏
  17. 【小白话通信】离散分布的生成
  18. 太极拳透劲的原理推测
  19. 杨涛鸣 杨焘鸣:世界各个角落都存在人脉关系
  20. 录音文件怎么转文字 手机便签里的录音文字转换方法

热门文章

  1. 借助winrats软件实现BEKK模型
  2. Python——对象
  3. 用Python自动化爬取CNKI知网数据(批量下载PDF论文)
  4. 【课程·研】高性能计算机网络 | 学堂在线习题解答:期末考试
  5. 数控系统市场下行压力逐渐增大
  6. Log4cpp 库安装及使用
  7. Leo2DNT(雷傲论坛转DiscuzNT)1.0转换程序发布
  8. 易之风门诊收费系统 v1.0 官方
  9. Windows 内核会换为 Linux 吗?
  10. 附合导线计算软件_再也不盲目跑杆了,一次性搞懂水准测量+导线测量!