一、了解Jsoup
Jsoup是一款Java的HTML解析器,主要用来对HTML解析。
二、JSoup的Mavven依赖
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.1</version>
</dependency>
三、Jsoup框架中的常用方法
①connet (String url): 创建一个新的Connection连接对象。
② get(): 取得要解析的一个HTML文件,如果从该URL获取HTML时发生错误,则会抛出IOException异常。
③ parse(String html,String vaseUri): 将输入的HTML解析为一个新的文档(Document),参数baseUri用来相对一个URL转成绝对URL.并指定从哪个网站获取文档.只要解析的不是空字符串,就能返回一个结构合理的文档,其中包含(至少)一个head和一个body的元素。
④parseBodyFragment(): 创建一个空壳的文档,并插入解析过得HTML到Body元素中,如果使用正常的Jsoup.parse(String html)方法,通常也可以得到相同的结果。
⑤Document.body(): 能够取得文档body元素的所有子元素,具体功能与doc.getElementsByTag("body")相同。
⑥Node.atter(String key): 获取一个属性的值。
⑦ Element.text(): 获取一个元素中的文本。
⑧ Element.html()或Node.outerHtml(): 获取元素或属性中的HTML内容。
四、JSoup 解析 HTML 字符串
说明:通过调用fetchHtmlSync("需要爬取的网址")得到HTML字符串str,再调用Jsoup.parse(str)将输入的HTML解析为一个新的文档(Document)。
/**
* okhttp客户端
* OkHttpClient是一个高效的HTTP客户端,其特性包含:
* 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接池减少请求延时
* 透明的GZIP压缩减少响应数据的大小
* 缓存响应内容,避免一些完全重复的请求*/
private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient
.Builder()
//设置连接超时时间为30秒
.connectTimeout(30, TimeUnit.SECONDS)
//自定义线程池任务调度策略 dispatcher(线程调度策略)
.dispatcher(new Dispatcher(new ThreadPoolExecutor(1, 1, 2, TimeUnit.MINUTES, new LinkedBlockingQueue<>(6000), r -> new Thread("spider task"))))
//设置代理 没有使用代理ip进行抓取
.connectionPool(new ConnectionPool(2, 1, TimeUnit.MINUTES))
.build();
/**
* 同步获取网页数据
*
* @param url 网站地址
* @return 网页内容
* @throws IOException
*/
public static String fetchHtmlSync(String url) throws IOException {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
Request request = new Request.Builder().url(url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
.addHeader("Referer", "http://……")
.build();
return Objects.requireNonNull(OK_HTTP_CLIENT.newCall(request).execute().body()).string();
//Request request = new Request.Builder().url(要获取的网页).build();
//String s =OK_HTTP_CLIENT.newCall(request).execute().body().string();//s即为网页源码的字符串
//Objects.requireNonNull() 用于在方法中进行参数验证。遇到要判断对象是否为空,空的时候报空指针异常
}
五、Jsoup获取信息
使用标准的DOM方法:
根据id查找元素: getElementById(String id)
根据标签查找元素: getElementsByTag(String tag)
根据class查找元素: getElementsByClass(String className)
根据属性查找元素: getElementsByAttribute(String key)
兄弟遍历方法: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
层级之间遍历: parent(), children(), child(int index)
这些方法会返回Element或者Elements节点对象,这些对象可以使用下面的方法获取一些属性:
attr(String key): 获取某个属性值
attributes(): 获取节点的所有属性
id(): 获取节点的id
className(): 获取当前节点的class名称
classNames(): 获取当前节点的所有class名称
text(): 获取当前节点的textNode内容
html(): 获取当前节点的 inner HTML
outerHtml(): 获取当前节点的 outer HTML
data(): 获取当前节点的内容,用于script或者style标签等
tag(): 获取标签
tagName(): 获取当前节点的标签名称
例子: 获取id="docContent"标签下所有a标签中href = ""的内容
Document document=Jsoup.parse("爬取网站");
Elements elements=document.getElementById("docContent").select("a");
for (Element element : elements) {
String myUrl=element.attr("href");
}