Java爬蟲(chóng)(Jsoup與WebDriver)的使用
一、Jsoup爬蟲(chóng)
jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。
以博客園首頁(yè)為例
1、idea新建maven工程
pom.xml導(dǎo)入jsoup依賴
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.12.1</version> </dependency>
jsoup代碼
package com.blb;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class jsoup {
public static void main(String[] args) {
//博客園首頁(yè)url
final String url= "https://www.cnblogs.com";
try {
//先獲得的是整個(gè)頁(yè)面的html標(biāo)簽頁(yè)面
Document doc= Jsoup.connect(url).get();
System.out.println(doc);
//可以通過(guò)元素的標(biāo)簽獲取html中的特定元素
Elements title = doc.select("title");
String t = title.text();
System.out.println(t);
//可以通過(guò)元素的id獲取html中的特定元素
Element site_nav_top = doc.getElementById("site_nav_top");
String s = site_nav_top.text();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}


該方式有個(gè)很大的局限性,就是通過(guò)jsoup爬蟲(chóng)只適合爬靜態(tài)網(wǎng)頁(yè),所以只能爬當(dāng)前頁(yè)面的信息。
二、Webdriver技術(shù)
Selenium是一個(gè)瀏覽器自動(dòng)化操作框架。selenium主要由三種工具組成。
1.第一個(gè)工具——SeleniumIDE,是Firefox的擴(kuò)展插件,支持用戶錄制和回訪測(cè)試。錄制/回訪模式存在局限性,對(duì)許多用戶來(lái)說(shuō)并不適合。
2.因此第二個(gè)工具——Selenium WebDriver提供了各種語(yǔ)言環(huán)境的API來(lái)支持更多控制權(quán)和編寫(xiě)符合標(biāo)準(zhǔn)軟件開(kāi)發(fā)實(shí)踐的應(yīng)用程序。
3.最后一個(gè)工具——SeleniumGrid幫助工程師使用Selenium API控制分布在一系列機(jī)器上的瀏覽器實(shí)例,支持并發(fā)運(yùn)行更多測(cè)試。
在項(xiàng)目?jī)?nèi)部,它們分別被稱為“IDE”、“WebDriver”和“Grid”。
什么是 Webdriver ?
官網(wǎng)介紹:
WebDriver is a clean, fast framework for automated testing of webapps.(WebDriver是一個(gè)干凈、快速的web應(yīng)用自動(dòng)測(cè)試框架。)
WebDriver針對(duì)各個(gè)瀏覽器而開(kāi)發(fā),取代了嵌入到被測(cè)Web應(yīng)用中的JavaScript。與瀏覽器的緊密集成支持創(chuàng)建更高級(jí)的測(cè)試,避免了JavaScript安全模型導(dǎo)致的限制。除了來(lái)自瀏覽器廠商的支持,WebDriver還利用操作系統(tǒng)級(jí)的調(diào)用模擬用戶輸入。WebDriver支持Firefox(FirefoxDriver)、IE (InternetExplorerDriver)、Opera (OperaDriver)和Chrome (ChromeDriver)。 它還支持Android (AndroidDriver)和iPhone (IPhoneDriver)的移動(dòng)應(yīng)用測(cè)試。它還包括一個(gè)基于HtmlUnit的無(wú)界面實(shí)現(xiàn),稱為HtmlUnitDriver。WebDriver API可以通過(guò)Python、Ruby、Java和C#訪問(wèn),支持開(kāi)發(fā)人員使用他們偏愛(ài)的編程語(yǔ)言來(lái)創(chuàng)建測(cè)試。
WebDriver如何工作
WebDriver是W3C的一個(gè)標(biāo)準(zhǔn),由Selenium主持。
具體的協(xié)議標(biāo)準(zhǔn)可以從http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference 查看。
從這個(gè)協(xié)議中我們可以看到,WebDriver之所以能夠?qū)崿F(xiàn)與瀏覽器進(jìn)行交互,是因?yàn)闉g覽器實(shí)現(xiàn)了這些協(xié)議。這個(gè)協(xié)議是使用JOSN通過(guò)HTTP進(jìn)行傳輸。
它的實(shí)現(xiàn)使用了經(jīng)典的Client-Server模式??蛻舳税l(fā)送一個(gè)requset,服務(wù)器端返回一個(gè)response。
我們明確幾個(gè)概念。
Client
調(diào)用 WebDriverAPI的機(jī)器。
Server
運(yùn)行瀏覽器的機(jī)器。Firefox瀏覽器直接實(shí)現(xiàn)了WebDriver的通訊協(xié)議,而Chrome和IE則是通過(guò)ChromeDriver和InternetExplorerDriver實(shí)現(xiàn)的。
Session
服務(wù)器端需要維護(hù)瀏覽器的Session,從客戶端發(fā)過(guò)來(lái)的請(qǐng)求頭中包含了Session信息,服務(wù)器端將會(huì)執(zhí)行對(duì)應(yīng)的瀏覽器頁(yè)面。
WebElement
這是WebDriverAPI中的對(duì)象,代表頁(yè)面上的一個(gè)DOM元素。
實(shí)現(xiàn):
1.下載瀏覽器驅(qū)動(dòng),用的是Chrome瀏覽器,下載地址http://chromedriver.storage.googleapis.com/index.html,按對(duì)應(yīng)瀏覽器版本號(hào)下載


2、idea新建maven工程
pom.xml導(dǎo)入入selinium依賴
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
代碼實(shí)現(xiàn):
package com.blb;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class chrome {
public static void main(String[] args) {
//下載的chromedriver位置
System.setProperty("webdriver.chrome.driver","D:\\idea_workspace\\Jsoup\\src\\main\\chromedriver.exe");
//實(shí)例化ChromeDriver對(duì)象
WebDriver driver = new ChromeDriver();
String url="https://search.51job.com/list/000000,000000,0000,00,9,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";
//打開(kāi)指定網(wǎng)站
driver.get(url);
//解析頁(yè)面
String pageSource =driver.getPageSource();
Document jsoup = Jsoup.parse(pageSource);
//定義選擇器規(guī)則
String rule="#resultList > div:nth-child(4) > p > span > a";
//通過(guò)選擇器拿到元素
Elements select = jsoup.select(rule);
String s=select.text();
System.out.println(s);
//模擬瀏覽器點(diǎn)擊
driver.findElement(By.cssSelector(rule)).click();
}
}
爬取電影資源:
package com.blb;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class getMovie {
private static final String url="http://www.zuidazy5.com";
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver","D:\\idea_workspace\\Jsoup\\src\\main\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get(url);
String pageSource = driver.getPageSource();
Document jsoup = Jsoup.parse(pageSource);
String rule1="body > div.xing_vb > ul> li > span.xing_vb4 > a";
Elements select = jsoup.select(rule1);
//遍歷當(dāng)前頁(yè)的所有電影詳情入口
for (Element e:select)
{
//獲取電影詳情頁(yè)鏈接
String href = e.attr("href");
//進(jìn)入每個(gè)電影詳情頁(yè)面
driver.get(url+href);
String pageSource2= driver.getPageSource();
Document jsoup2 = Jsoup.parse(pageSource2);
//定義獲取電影信息元素的規(guī)則
String mname="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > h2";
String mpic="body > div.warp > div:nth-child(1) > div > div > div.vodImg > img";
String mdirector="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(2) > span";
String mactor="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(3) > span";
String marea="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(5) > span";
String mlanguage="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(6) > span";
String mshowtime="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(7) > span";
String mscore="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > label";
String mtimelength="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(8) > span";
String mlastmodifytime="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li:nth-child(9) > span";
String minfo="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodinfobox > ul > li.cont > div > span.more";
String mplayaddress1="#play_1 > ul > li";
String mplayaddress2="#play_2 > ul > li";
String msv="body > div.warp > div:nth-child(1) > div > div > div.vodInfo > div.vodh > span";
//獲取元素信息
String sv=jsoup2.select(msv).text();
String name = jsoup2.select(mname).text();
String pic = jsoup2.select(mpic).attr("src");
String director=jsoup2.select(mdirector).text();
String actor=jsoup2.select(mactor).text();
String area=jsoup2.select(marea).text();
String language=jsoup2.select(mlanguage).text();
String showtime=jsoup2.select(mshowtime).text();
String score=jsoup2.select(mscore).text();
String timelength=jsoup2.select(mtimelength).text();
String lastmodifytime=jsoup2.select(mlastmodifytime).text();
String info=jsoup2.select(minfo).text();
String playaddress1 = jsoup2.select(mplayaddress1).text();
String playaddress2=jsoup2.select(mplayaddress2).text();
//打印電影名
System.out.println(name);
}
}
}
為了不顯示瀏覽器爬取過(guò)程,可以將chromedriver.exe 換成無(wú)頭瀏覽器 phantomjs.exe
下載地址:https://phantomjs.org/download.html
到此這篇關(guān)于Java爬蟲(chóng)(Jsoup與WebDriver)的使用的文章就介紹到這了,更多相關(guān)Java Jsoup與WebDriver爬蟲(chóng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Ip2region獲取IP地址和定位的詳細(xì)過(guò)程
ip2region v2.0 - 是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語(yǔ)言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn) ,這篇文章主要介紹了SpringBoot整合Ip2region獲取IP地址和定位,需要的朋友可以參考下2023-06-06
java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例
Java雪花算法是一種用于生成唯一ID的算法,它可以在分布式系統(tǒng)中生成全局唯一的ID,這篇文章主要給大家介紹了關(guān)于java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID的相關(guān)資料,需要的朋友可以參考下2024-07-07
MyBatis XML去除多余AND|OR前綴或逗號(hào)等后綴的操作
這篇文章主要介紹了MyBatis XML去除多余AND|OR前綴或逗號(hào)等后綴的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java使用DateFormatter格式化日期時(shí)間的方法示例
這篇文章主要介紹了Java使用DateFormatter格式化日期時(shí)間的方法,結(jié)合具體實(shí)例分析了java使用DateFormatter格式化日期時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
Java實(shí)現(xiàn)DES加密與解密,md5加密以及Java實(shí)現(xiàn)MD5加密解密類
這篇文章主要介紹了Java實(shí)現(xiàn)DES加密與解密,md5加密以及Java實(shí)現(xiàn)MD5加密解密類 ,需要的朋友可以參考下2015-11-11
Java性能優(yōu)化之關(guān)于大對(duì)象復(fù)用的目標(biāo)和注意點(diǎn)
這篇文章主要介紹了Java性能優(yōu)化之關(guān)于大對(duì)象復(fù)用的目標(biāo)和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
Java 按行讀取文件按行寫(xiě)入文件并以空格分割字符串的方法
今天小編就為大家分享一篇Java 按行讀取文件按行寫(xiě)入文件并以空格分割字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Spring IoC容器常見(jiàn)獲取Bean的方式匯總示例解析
這篇文章主要為大家介紹了Spring IoC容器常見(jiàn)獲取Bean的方式匯總示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
淺談Java開(kāi)發(fā)中的安全編碼問(wèn)題
這篇文章主要介紹了淺談Java開(kāi)發(fā)中的安全編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10

