如何使用Jsoup爬取网页内容
前言:
这是一篇迟到很久的文章了,人真的是越来越懒,前一阵用jsoup实现了一个功能,个人觉得和selenium的webdriver原理类似,所以今天正好有时间,就又来更新分享了。
实现场景:
爬取博客园https://www.cnblogs.com/longronglang,文章列表中标题、链接、发布时间及阅读量
思路:
1、引入jar包
2、通过httpclient,设置参数,代理,建立连接,获取HTML文档(响应信息)
3、将获取的响应信息,转换成HTML文档为Document对象
4、使用jQuery定位方式,这块就和web自动化一样了定位获取文本及相关属性
相关详细使用参考官网:https://jsoup.org/
实现:
1、引入依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
2、通过httpclient,设置参数,代理,建立连接,获取HTML文档(响应信息)
String requestUrl = "https://www.cnblogs.com/longronglang/";
HttpClient client = new HttpClient();
HttpClientParams clientParams = client.getParams();
clientParams.setContentCharset("UTF-8");
GetMethod method = new GetMethod(requestUrl);
String response =method.getResponseBodyAsString();
3、将获取的响应信息,转换成HTML文档为Document对象
Document document = Jsoup.parse(response);
4、使用jQuery定位方式,这块就和web自动化一样了定位获取文本及相关属性
这里可以仔细看下,也可以说是核心思路了,如下图:
从图中可以看到,文章标题在在a标签中,也就是通过class属性为postTitle2进行绑定,那么我们的dom对象就定位到这里即可,那么我想获取文章标题这个dom对象,可以写成如下代码:
Elements postItems = document.getElementsByClass("postTitle2");
同理,获取发布时间及阅读量,也可以写成如下代码:
Elements readcontexts = document.getElementsByClass("postDesc");
最后我们来段整合的代码如下:
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.junit.Test; import java.io.IOException; public class JsoupTest { @Test
public void test() {
String requestUrl = "https://www.cnblogs.com/longronglang/";
HttpClient client = new HttpClient();
HttpClientParams clientParams = client.getParams();
clientParams.setContentCharset("UTF-8");
GetMethod method = new GetMethod(requestUrl);
String response = null;
int code = 0;
try {
code = client.executeMethod(method);
response = method.getResponseBodyAsString();
if (code == HttpStatus.SC_OK) {
Document document = Jsoup.parse(response);
Elements postItems = document.getElementsByClass("postTitle2");
Elements readcontexts = document.getElementsByClass("postDesc");
for (int i = 0; i < postItems.size(); i++) {
System.out.println("文章标题:" + postItems.get(i).text());
System.out.println("文章地址:" + postItems.get(i).attr("href"));
System.out.println("发布信息:" + readcontexts.get(i).text());
}
} else {
System.out.println("返回状态不是200,可能需要登录或者授权,亦或者重定向了!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
到此,一个爬虫搞完,这里只事抛砖引用,有兴趣的同学,请自行扩展。
如果感情一开始就是不对等的,那么索性就早点结束掉它,利人利己。
如何使用Jsoup爬取网页内容的更多相关文章
- 【Jsoup爬取网页内容】
思路:根据给定URL分析其源码,得到所需的网页内容的位置,制定规则采集或下载之 采集的图片和文字示例: tags: tag:brazil tag:dog tag:pet tag:pointyfaced ...
- java爬取网页内容 简单例子(2)——附jsoup的select用法详解
[背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...
- java爬虫爬取网页内容前,对网页内容的编码格式进行判断的方式
近日在做爬虫功能,爬取网页内容,然后对内容进行语义分析,最后对网页打标签,从而判断访问该网页的用户的属性. 在爬取内容时,遇到乱码问题.故需对网页内容编码格式做判断,方式大体分为三种:一.从heade ...
- Jsoup爬取带登录验证码的网站
今天学完爬虫之后想的爬一下我们学校的教务系统,可是发现登录的时候有验证码.因此研究了Jsoup爬取带验证码的网站: 大体的思路是:(需要注意的是__VIEWSTATE一直变化,所以我们每个页面都需要重 ...
- jsoup爬取某网站安全数据
jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...
- java爬虫入门--用jsoup爬取汽车之家的新闻
概述 使用jsoup来进行网页数据爬取.jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuer ...
- Selenium+PhantomJs 爬取网页内容
利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...
- 使用Jsoup 爬取网易首页所有的图片
package com.enation.newtest; import java.io.File; import java.io.FileNotFoundException; import java. ...
- python的requests模块爬取网页内容
注意:处理需要用户名密码认证的网站,需要auth字段. # -*- coding:utf-8 -*- import requests headers = { "User-Agent" ...
随机推荐
- coding++:java-自定义签名+拦截器
本次案例工具为:SpringBoot <version>1.5.19.RELEASE</version> Code: 1.annotations package com.m ...
- ElasticSearch 倒排索引
倒排索引 倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况. 由于每个字或词对应的文档 ...
- RbbitMQ详解
高性能消息队列RabbitMQ 1.为什么要使用mq 主要解决应用解耦,流量削峰,异步消息,实现高性能,可升缩,最终一致性的架构. 2.activeMq的通讯模式 基于队列(点对点)与发布订阅(有多个 ...
- 逃生 HDU 4857(反向建图 + 拓扑排序)
逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...
- Scala学习系列(一)——Scala为什么是大数据第一高薪语言
为什么是Scala 虽然在大数据领域Java的使用更普及,Python也有后来居上的势头,但Scala一直有着不可动摇的地位.我们熟悉的Spark,Kafka,Flink都是由Scala完成了其核心代 ...
- WinForm中DataGridView复制选中单元格内容解决方案
WinForm中DataGridView鼠标选中单元格内容复制方案 1.CTR+C快捷键复制 前提:该控件ClipboardCopyMode属性设置值非Disable: 2.鼠标框选,自定义代码实现复 ...
- 适用于 Mpvue 的微信小程序富文本解析自定义组件
废话不多说,直接上方法: 首先 npm 安装 mpvue-wxparse npm i mpvue-wxparse 接下来:使用 <template> <div> <wxP ...
- docker开机自动启动
方法一: chkconfig docker on 方法二: 1.1是用systemctl: systemctl enable docker 1.2将Docker的docker.service服务移动到 ...
- Array(数组)对象-->数组值的修改
1.修改数组值: 数组对象名[下标] = 新值: 举例:原数组如下: var arr = [1,2,3,4,5] 需求:将arr数组第二个元素的值改为10,代码如下: arr[1] = 10; con ...
- 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统
用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...