Java Jsoup爬虫入门
一、了解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): 創(chuàng)建一個新的Connection連接對象。
② get(): 取得要解析的一個HTML文件,如果從該URL獲取HTML時發(fā)生錯誤,則會拋出IOException異常。
③ parse(String html,String vaseUri): 將輸入的HTML解析為一個新的文檔(Document),參數(shù)baseUri用來相對一個URL轉(zhuǎn)成絕對URL.并指定從哪個網(wǎng)站獲取文檔.只要解析的不是空字符串,就能返回一個結(jié)構(gòu)合理的文檔,其中包含(至少)一個head和一個body的元素。
④parseBodyFragment(): 創(chuàng)建一個空殼的文檔,并插入解析過得HTML到Body元素中,如果使用正常的Jsoup.parse(String html)方法,通常也可以得到相同的結(jié)果。
⑤Document.body(): 能夠取得文檔body元素的所有子元素,具體功能與doc.getElementsByTag("body")相同。
⑥Node.atter(String key): 獲取一個屬性的值。
⑦ Element.text(): 獲取一個元素中的文本。
⑧ Element.html()或Node.outerHtml(): 獲取元素或?qū)傩灾械腍TML內(nèi)容。
四、JSoup 解析 HTML 字符串
說明:通過調(diào)用fetchHtmlSync("需要爬取的網(wǎng)址")得到HTML字符串str,再調(diào)用Jsoup.parse(str)將輸入的HTML解析為一個新的文檔(Document)。
/*** okhttp客戶端* OkHttpClient是一個高效的HTTP客戶端,其特性包含:* 支持HTTP/2,允許所有同一個主機地址的請求共享同一個socket連接池減少請求延時* 透明的GZIP壓縮減少響應數(shù)據(jù)的大小* 緩存響應內(nèi)容,避免一些完全重復的請求*/private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()//設(shè)置連接超時時間為30秒.connectTimeout(30, TimeUnit.SECONDS)//自定義線程池任務調(diào)度策略 dispatcher(線程調(diào)度策略).dispatcher(new Dispatcher(new ThreadPoolExecutor(1, 1, 2, TimeUnit.MINUTES, new LinkedBlockingQueue<>(6000), r -> new Thread("spider task"))))//設(shè)置代理 沒有使用代理ip進行抓取.connectionPool(new ConnectionPool(2, 1, TimeUnit.MINUTES)).build();/*** 同步獲取網(wǎng)頁數(shù)據(jù)** @param url 網(wǎng)站地址* @return 網(wǎng)頁內(nèi)容* @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(要獲取的網(wǎng)頁).build();//String s =OK_HTTP_CLIENT.newCall(request).execute().body().string();//s即為網(wǎng)頁源碼的字符串//Objects.requireNonNull() 用于在方法中進行參數(shù)驗證。遇到要判斷對象是否為空,空的時候報空指針異常}五、Jsoup獲取信息
使用標準的DOM方法:
根據(jù)id查找元素: getElementById(String id)
根據(jù)標簽查找元素: getElementsByTag(String tag)
根據(jù)class查找元素: getElementsByClass(String className)
根據(jù)屬性查找元素: getElementsByAttribute(String key)
兄弟遍歷方法: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()
層級之間遍歷: parent(), children(), child(int index)
這些方法會返回Element或者Elements節(jié)點對象,這些對象可以使用下面的方法獲取一些屬性:
attr(String key): 獲取某個屬性值
attributes(): 獲取節(jié)點的所有屬性
id(): 獲取節(jié)點的id
className(): 獲取當前節(jié)點的class名稱
classNames(): 獲取當前節(jié)點的所有class名稱
text(): 獲取當前節(jié)點的textNode內(nèi)容
html(): 獲取當前節(jié)點的 inner HTML
outerHtml(): 獲取當前節(jié)點的 outer HTML
data(): 獲取當前節(jié)點的內(nèi)容,用于script或者style標簽等
tag(): 獲取標簽
tagName(): 獲取當前節(jié)點的標簽名稱
例子: 獲取id="docContent"標簽下所有a標簽中href = ""的內(nèi)容
Document document=Jsoup.parse("爬取網(wǎng)站"); Elements elements=document.getElementById("docContent").select("a"); for (Element element : elements) {String myUrl=element.attr("href"); }總結(jié)
以上是生活随笔為你收集整理的Java Jsoup爬虫入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hyper-v Server 2012
- 下一篇: java 添加注解_你知道Java中的p