Java网络爬虫全面教程
Java网络爬虫
这是本文目录
这里写目录标题
- Java网络爬虫
- 1. HttpClient
- 1.1 Get请求
- 1.2 POST请求
- 1.3 连接池
- 1.4 参数设置
- 2. Jsoup
本文将循序渐进介绍3大爬虫必备技术
- HttpClietn(负责请求页面并获得页面)
- Jsout(负责解析页面,提取元素)
- 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网络爬虫全面教程相关推荐
- java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识
原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...
- 第三十六期:学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- python网络爬虫、Java 网络爬虫,哪个更好?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- 学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- Java网络爬虫实操(5)
上一篇:Java网络爬虫实操(4) 大家好,前几篇文章介绍的URL都是返回HTML内容的,然后再从HTML字符串里解析出我们想要的数据. 但是,随着前端编程技术的发展,至少十多年前开始ajax.jso ...
- python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...
廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...
- Java网络爬虫实操(3)
上一篇:Java网络爬虫实操(2) 本篇文章主要介绍NetDiscovery框架中pipeline模式的一些实际使用方法. 1) 什么是pipeline pipeline是一种常见的算法模式,针对不断 ...
- Java网络爬虫实操(8)
上一篇:Java网络爬虫实操(7) 大家好,本篇文章介绍一下NetDiscovery爬虫框架里的downloader对象 1) 前言 面向对象设计仍然是目前编程的核心思想,从下面截图可以了解爬虫框架的 ...
- Java网络爬虫该如何学习
文章目录 引言 怎么入门网络爬虫 课程特色 学完本课程能收获什么 引言 互联网以及移动技术的飞速发展,使得全球数据量呈现前所未有的爆炸式增长态势.例如,用户在互联网上的搜索数据.交易数据.评论数据.社 ...
- python网络爬虫系列教程_Python网络爬虫系列教程连载 ----长期更新中,敬请关注!...
感谢大家长期对Python爱好者社区的支持,后期Python爱好者社区推出Python网络爬虫系列教程.欢迎大家关注.以下系列教程大纲,欢迎大家补充.视频长期连载更新中 --------------- ...
最新文章
- Oracle 触发器使用实例
- 程序员应知——学习、思考与分享
- 解决 GStreamer 遇到了常规流错误问题
- java链表交集并集,一个链表求集合并集交集的异常
- 通俗理解Paxos算法
- vue 中$index $key 已移除
- linux tomcat 改端口号,Ubuntu中Tomcat更改80端口
- (31)SystemVerilog语言编写D触发器
- Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
- java程序能转变为javafx_躁!DJ 风格 Java 桌面音乐播放器
- Python之面向对象的程序设计
- mysql 清理表碎片需要停止数据库吗_Mysql的表的碎片清理
- 阿里巴巴 程劭非(寒冬)- 《浅谈前端交互的基础设施的建设》
- linux raid5 nas,free nas 创建软raid5 来做iscsi服务 1
- win10出现的异常解决
- 南京大学俞扬:环境模型学习——让强化学习走出游戏
- 【小白话通信】离散分布的生成
- 太极拳透劲的原理推测
- 杨涛鸣 杨焘鸣:世界各个角落都存在人脉关系
- 录音文件怎么转文字 手机便签里的录音文字转换方法