jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,
就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。
虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。
1、代码部分
package com.jincou.pachong;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/*
* 这个案例你只需要看结果,具体的jsoup介绍下一篇博客会详细介绍
*/
public class Pachong {
public static void main(String args[]){
//这个就是博客中的java反射的url
final String url= "https://www.cnblogs.com/qdhxhz/p/9230805.html";
try {
//先获得的是整个页面的html标签页面
Document doc = Jsoup.connect(url).get();
//获取正文标题,因为整片文章只有标题是用h1标签
Elements btEl = doc.select("H1");
String bt=btEl.text();
System.out.println("========正文标题======:");
System.out.println(bt);
//获取二级标题
Elements ejbtEls = doc.select("H2");
//因为整片文章有多个二级标题所以进行拼接
StringBuilder ejbts=new StringBuilder();
for(Element el :ejbtEls) {
ejbts.append(el.text());
ejbts.append("\n");
}
String ejbt=ejbts.toString();
System.out.println("=======二级标题=========:");
System.out.println(ejbt);
//获取时间
Elements timeEl = doc.select("#post-date");
String time=timeEl.text();
System.out.println("========发布时间=========:");
System.out.println("发布时间:" + time);
//获取阅读数量
Elements readEl = doc.select("#post_view_count");
String read=readEl.text();
System.out.println("========阅读数量=========:");
System.out.println("阅读数量:" + read);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.middletrans;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.text.SimpleDateFormat;
public class Pachong implements Runnable {
public static void main(String[] args) {
Pachong pachong = new Pachong();
pachong.run();
}
public void run() {
String Rpt_date = null;
double price = 0;
// 网页地址
String url = "http://www.sse.net.cn/index/singleIndex?indexType=cbcfi";
// 本地html
File in = new File("F:/index.html");
try {
// Document doc = Jsoup.connect(url).get();
Document doc = Jsoup.parse(in, "UTF-8", "");
// 获取第一个表格
Element element = doc.select("table").first();
System.out.println(element);
Elements els = element.select("tr");
for (Element el : els) {
Elements ele = el.select("td");
for (Element elem : ele) {
System.out.println("elem.text().toString()" + elem.text().toString());
if (elem.text().toString().indexOf("本期") != -1) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Rpt_date = elem.text().toString().substring(3);
}
if (elem.text().toString().equals("秦皇岛-广州(6-7万DWT)")) {
price = Double.parseDouble(el.select("td").get(3).text().toString());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 以下是将爬取到的数据保存到MySQL数据库
// InputStream in = GetOCFIAll.class.getClassLoader().getResourceAsStream("config.property");
// String dbURL = "";
// String userName = "";
// String userPwd = "";
// Properties properties = new Properties();
// try {
// properties.load(in);
// dbURL = (String) properties.get("dburl");
// userName = (String) properties.get("dbuser");
// userPwd = (String) properties.get("dbpwd");
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// try {
// Connection dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
// Statement statement = dbConn.createStatement();
// String query = "SQL语句";
// statement.addBatch(query);
// statement.executeBatch();
// statement.close();
// dbConn.close();
// } catch (Exception e) {
// // TODO: handle exception
// e.printStackTrace();
// }
}
}
2.运行结果
注意:我们发现该篇文章的信息都已经爬到了,但是为什么阅读数量是...
案例讲解
首先我们要知道:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操
作数据。上面这两点很关键,具体细说。
1、如何爬到正文标签
我们看到正文标题的html标签是h1标签,所以我们只要获得H1标签元素,就可以爬到文本。那么同样的二级标签也是通过H2标签爬到就可以。
2、如何获得发布时间
因为时间的标签id是post-date,所以可以通过id获得该标签元素。
3、为什么阅读数量是...
我们看到页面阅读是有的,但爬虫爬到确实...?
这是为什么呢,这点很重要。那是因为该静态页面初始加载的时候是没有阅读数量的,阅读数量是后来接口重新调取的。什么意思呢?其实很好理解所以你写一篇文章的时候像标题,内容,时间
等等是不太会变动的,但是你的阅读数量每访问一次都会改变,所以不可能把阅读数量和文章放在一张表里,而是分开放然后id关联就可以。这样就避免每次update文章表。所以静态页面初始是没有
阅读数量的。
那如何验证是不是这样。请看。
我们发现初始的html页面的阅读量和评论都是没有的,而是默认...,所以上面爬到的就是...
那如何能爬到真实的阅读量呢,这个就需要知道它真实的接口是什么,然后通过其它工具来爬,我们看下获取阅读量的真实接口。
既然知道阅读量的真实接口,那么爬到它也就简单了。
注意:通过这里我们要明白,只有html元素有的情况下,才能通过jsoup来爬虫,如果是这接口获得的数据,那么通过jsoup是无法获取到的。
有关jsoup也是自己的理解,如有不正确请留言指点。
参考案例网址:
百度百科 https://baike.baidu.com/item/jsoup
jsoup教程 https://www.jianshu.com/p/fd5caaaa950d
jsoup案例 https://www.cnblogs.com/qdhxhz/p/9338834.html