数据采集jsoup
-jsoup介绍:
1. jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。
2. jsoup 的主要功能如下:
- 从一个 URL或字符串中解析 HTML;
- 使用 DOM或 CSS 选择器来查找、取出数据;
- 可操作 HTML 元素、属性、文本;
3. jsoup 是基于 MIT协议发布的,可放心使用于商业项目。
-
jsoup环境配置:
- idea jsoup环境配置:
-
导jar包:
-
下载jar包:官网
-
导入jar包:
-
-
创建Maven项目使用dependency
-
在pom.xml文件中 section中插入以下代码:
<dependency> <!-- jsoup HTML parser library @ https://jsoup.org/ --> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.13.1</version> </dependency>
-
-
- idea jsoup环境配置:
-
Jsoup的重要类:
-
Jsoup解析网页
-
连接给定URL载入html文件
-
方法1:使用Jsoup.connect(String url )方法从URL加载HTML。
-
方法说明:与给定url建立新的连接,用于获取和解析HTML页面。
-
案例分析:
Document doc = Jsoup.connect("http://www.hnkjxy.net.cn/").get(); System.out.println(doc.text());//输出网页 System.out.println(doc.title());//输出标题
Document doc = Jsoup.connect("https://www.educoder.net/") .data("query","java")//请求参数 .userAgent("I'm jsoup")//设置User-Agent .cookie("auth","token")//设置cookie .timeout(3000)//设置连接超时时间 .post()//使用POST方法访问URL .get()//使用GET方法访问URL
- 方法2:获取URL解析成HTML,大多数情况下我们使用connect(String)代替。
- 方法说明:
-
-
本地文件内容解析成html文档
-
使用Jsoup.parse()方法从文件加载到HTML
-
方法介绍:
注 :in:文件位置、charsetName:编码格式、baseUri基于的URL地址,以解决相对链接问题。 -
案例分析:
//1.爬取网页并保存 Document doc = Jsoup.connect("http://www.hnkjxy.net.cn/").get(); FileWriter fw = new FileWriter("官网.html"); fw.write(doc.toString()); fw.close(); //2.解析本地文件并保存输出 Document doc2 = Jsoup.parse(new File("D:\\bigDataDevelop\\index.html"),"utf-8","http://www.hnkjxy.net.cn/"); System.out.println(doc2.text()); System.out.println(doc2.title());
-
-
给定字符串解析成html文档
-
使用Jsoup.parse()方法从字符串加载HTML。
-
方法介绍:
这方法能够将输入的HTML解析为一个新的文档 (Document),参数 baseUri 是用来将相对 URL 转成绝对URL,并指定从哪个网站获取文档。 -
案例分析:
Document doc = Jsoup.parse("<html><head><title>First parse</title>" + "</head>body><p>Parsed HTML into a doc.</p></body>" + "</html>\r\n"); System.out.println(doc.toString()); System.out.println(doc.title());
-
-
小结:jsoup 是一款Java 的HTML解析器。可以从URL、本地文件和字符串中解析HTML。
-
-
DOM方法查找元素
-
查找元素
-
基本方法介绍:
-
案例分析:
// 有本地文件example.com.html,解析文件,查找html元素。 // 提取id=one的元素? // 提取class=lianjie的元素? // 提取标签为a的元素? // 提取标签为div的元素? // 提取属性为href的元素 try { Document doc = Jsoup.parse(new File("example.com.html"),"utf-8"); Element id_one = doc.getElementById("one"); Elements class_lianjie = doc.getElementsByClass("lianjie"); Elements tag_a = doc.getElementsByTag("a"); Elements tag_div = doc.getElementsByTag("div"); Elements attr_href = doc.getElementsByAttribute("href"); System.out.println("id_one:"+id_one+"\ntag_a:"+tag_a+"\nclass_lianjie:"+class_lianjie+"\ntag_div:"+tag_div+"\n"+"attr_href:"+attr_href); }catch (Exception e){ System.out.println("报错!"); }
-
同级元素方法介绍:
-
案例分析:
// 获取同级元素。 // 获取第一个className等于“lianjie”的元素的同级元素? // 获取第二个className等于“lianjie”的元素的前一个同级元素? try { Document doc = Jsoup.parse(new File("example.com.html"),"utf-8"); Elements siblingElements = doc.getElementsByClass("lianjie").get(0).siblingElements(); System.out.println("siblingElements:"+siblingElements); Element previousElementSibling = doc.getElementsByClass("lianjie").get(1).previousElementSibling(); System.out.println("previousElementSibling:"+previousElementSibling); }catch (Exception e){ System.out.println("报错!"); }
-
Graph方法介绍:
-
案例分析:
// 按图查找元素 // 获取id为“two” 的div标签的子标签。 try { Document doc = Jsoup.parse(new File("example.com.html"),"utf-8"); Elements id_two = doc.getElementById("two").getElementsByTag("div"); Elements div = id_two.get(0).children(); System.out.println(div); }catch (Exception e){ System.out.println("报错!"); }
-
-
查找元素数据
- 方法介绍:
- 方法介绍:
- 方法介绍:
-
操作HTML和文本:
-
-
Slector选择器方法查找元素
jsoup elements对象支持类似于CSS (或jquery的选择器语法,来实现非常强大和灵活的查找功能。可以使用Element.select(String selector)和 Elements.select(String selector)方法实现
-
选择器基础1
tagname: 通过标签查找元素,比如:a
ns|tag: 通过标签在命名空间r查找元素,比如:可以用 fb|name 语法来查找 fb:name 元素
#id: 通过ID查找元素,比如:#logo
.class: 通过class名称查找元素,比如:.masthead
[attribute]: 利用属性查找元素,比如:[href] -
选择器组合使用
el#id: 元素+ID,比如: div#logo
el.class: 元素+class,比如: div.masthead
el[attr]: 元素+class,比如: a[href]
任意组合,比如:a[href].highlight
ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在"body"元素下的所有 p元素
parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo -
伪选择器selectors
:lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
:gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
:eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
:has(seletor): 查找匹配选择器包含元素的元素,比如:div:has§表示哪些div包含了p元素
:not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=“logo” 元素的所有 div 列表
:contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
:containsOwn(text): 查找直接包含给定文本的元素
:matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
:matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
注意:上述伪选择器索引是从0开始的.
-