隨著互聯(lián)網(wǎng)+時(shí)代的來(lái)臨,越來(lái)越多的互聯(lián)網(wǎng)企業(yè)層出不窮,涉及游戲菱肖、視頻焰雕、新聞、社交炭序、電商、房產(chǎn)、旅游等眾多行業(yè)空繁。如今互聯(lián)網(wǎng)成為大量信息的載體,如何有效地從中提取有價(jià)值的信息并利用這些信息成為一個(gè)巨大的挑戰(zhàn)
爬蟲(chóng)朱庆,一個(gè)可怕的怪物盛泡,從百度、Google等搜索引擎公司誕生開(kāi)始便有了它的身影娱颊,如今移動(dòng)互聯(lián)網(wǎng)時(shí)代爬蟲(chóng)更是猖狂傲诵,每個(gè)網(wǎng)站似乎都被它光顧過(guò),只是你看不到箱硕,不過(guò)你放心它不干壞事拴竹,你能在網(wǎng)上迅速搜索到你到的信息應(yīng)該都是它的功勞,它每天會(huì)默默無(wú)聞的采集互聯(lián)網(wǎng)上的豐富信息供大家查詢(xún)共享剧罩。Java作為互聯(lián)網(wǎng)開(kāi)發(fā)的主流語(yǔ)言栓拜,廣泛應(yīng)用于互聯(lián)網(wǎng)領(lǐng)域,本課程使用java技術(shù)為大家講解如何編寫(xiě)爬蟲(chóng)程序爬取網(wǎng)絡(luò)上有價(jià)值的數(shù)據(jù)信息惠昔。
知識(shí)點(diǎn)
- 爬蟲(chóng)的架構(gòu)解析
- 爬蟲(chóng)基本原理分析
- 編寫(xiě)爬蟲(chóng)程序
- 爬蟲(chóng)在電商中的應(yīng)用
1. 爬蟲(chóng)簡(jiǎn)介
我們?cè)L問(wèn)某一個(gè)網(wǎng)頁(yè)的時(shí)候幕与,在地址欄輸入網(wǎng)址,按回車(chē)镇防,該網(wǎng)站的服務(wù)器就會(huì)返回一個(gè)HTML文件給我們啦鸣,瀏覽器解析返回的數(shù)據(jù),展示在UI上来氧。同樣爬蟲(chóng)程序也是模仿人的操作赏陵,給網(wǎng)站發(fā)送一個(gè)請(qǐng)求饼齿,網(wǎng)站會(huì)給爬蟲(chóng)程序返回一個(gè)HTML文件,爬蟲(chóng)程序再根據(jù)返回的數(shù)據(jù)進(jìn)行抓取分析
1.1 爬蟲(chóng)概論
網(wǎng)絡(luò)爬蟲(chóng)(Web crawler)也叫網(wǎng)絡(luò)蜘蛛(Web spide)自動(dòng)檢索工具(automatic indexer)蝙搔,是一種”自動(dòng)化瀏覽網(wǎng)絡(luò)“的程序缕溉,或者說(shuō)是一種網(wǎng)絡(luò)機(jī)器人。
爬蟲(chóng)被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類(lèi)似網(wǎng)站吃型,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式证鸥。它們可以自動(dòng)采集所有其能夠訪(fǎng)問(wèn)到的頁(yè)面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁(yè)面)勤晚,而使得用戶(hù)能更快的檢索到他們需要的信息枉层。
通俗的講,就是把你手動(dòng)打開(kāi)窗口赐写,輸入數(shù)據(jù)等等操作用程序代替鸟蜡。用程序替你獲取你想要的信息,這就是網(wǎng)絡(luò)爬蟲(chóng)
1.2 爬蟲(chóng)應(yīng)用
1.2.1 搜索引擎
爬蟲(chóng)程序可以為搜索引擎系統(tǒng)爬取網(wǎng)絡(luò)資源挺邀,用戶(hù)可以通過(guò)搜索引擎搜索網(wǎng)絡(luò)上一切所需要的資源揉忘。搜索引擎是一套非常龐大且精密的算法系統(tǒng),搜索的準(zhǔn)確性端铛,高效性等都對(duì)搜索系統(tǒng)有很高的要求泣矛。
1.2.2 數(shù)據(jù)挖掘
爬蟲(chóng)除了用來(lái)做搜索外,還可以做非常多的工作禾蚕,可以說(shuō)爬蟲(chóng)現(xiàn)在在互聯(lián)網(wǎng)項(xiàng)目中應(yīng)用的非常廣泛您朽。
互聯(lián)網(wǎng)項(xiàng)目通過(guò)爬取相關(guān)數(shù)據(jù)主要進(jìn)行數(shù)據(jù)分析,獲取價(jià)值數(shù)據(jù)换淆。那么爬蟲(chóng)具體可以做那么分析哗总,下面可以簡(jiǎn)單做一個(gè)簡(jiǎn)單了解:
- 股票分析---預(yù)測(cè)股市
- 社會(huì)學(xué)方面統(tǒng)計(jì)預(yù)測(cè)
- 情緒地圖
- 飲食分布圖
- 票房分析預(yù)測(cè)
- 機(jī)場(chǎng)實(shí)時(shí)流量
- 公交系統(tǒng)實(shí)時(shí)線(xiàn)路
- 火車(chē)票實(shí)時(shí)銷(xiāo)售統(tǒng)計(jì)
- App下載量分析
1.3 爬蟲(chóng)原理
1.3.1 爬蟲(chóng)目的
一般來(lái)講對(duì)我們而言需要抓取的是某個(gè)網(wǎng)站或者某個(gè)應(yīng)用的內(nèi)容,提取有用的價(jià)值倍试,進(jìn)行數(shù)據(jù)分析讯屈。
1.3.2 爬蟲(chóng)框架設(shè)計(jì)
為了開(kāi)發(fā)的方便,也可以使用爬蟲(chóng)框架來(lái)開(kāi)發(fā)項(xiàng)目中的爬蟲(chóng)易猫;一個(gè)通用的網(wǎng)絡(luò)爬蟲(chóng)的框架如圖所示:
網(wǎng)絡(luò)爬蟲(chóng)的基本工作流程如下:
- 首先選取一部分精心挑選的種子URL
- 將這些URL放入待抓取URL隊(duì)列
- 從待抓取URL隊(duì)列中取出待抓取在URL耻煤,解析DNS具壮,并且得到主機(jī)的ip准颓,并將URL對(duì)應(yīng)的網(wǎng)頁(yè)下載下來(lái),存儲(chǔ)進(jìn)已下載網(wǎng)頁(yè)庫(kù)中棺妓。此外攘已,將這些URL放進(jìn)已抓取URL隊(duì)列
- 分析已抓取URL隊(duì)列中的URL,分析其中的其他URL怜跑,并且將URL放入待抓取URL隊(duì)列样勃,從而進(jìn)入下一個(gè)循環(huán)
2. Java爬蟲(chóng)框架
2.1 Nutch
Nutch屬于分布式爬蟲(chóng)吠勘,爬蟲(chóng)使用分布式,主要是解決兩個(gè)問(wèn)題:1)海量URL管理峡眶;2)網(wǎng)速剧防。如果要做搜索引擎,Nutch1.x是一個(gè)非常好的選擇辫樱。Nutch1.x和solr或者es配合峭拘,就可以構(gòu)成一套非常強(qiáng)大的搜索引擎,否則盡量不要選擇Nutch作為爬蟲(chóng)狮暑。用Nutch進(jìn)行爬蟲(chóng)的二次開(kāi)發(fā)鸡挠,爬蟲(chóng)的編寫(xiě)和調(diào)試所需的時(shí)間,往往是單機(jī)爬蟲(chóng)所需的十倍時(shí)間不止搬男。
2.2 Heritrix
Heritrix 是個(gè)“Archival Crawler”——來(lái)獲取完整的拣展、精確的、站點(diǎn)內(nèi)容的深度復(fù)制缔逛。包括獲取圖像以及其他非文本內(nèi)容备埃。抓取并存儲(chǔ)相關(guān)的內(nèi)容。對(duì)內(nèi)容來(lái)者不拒译株,不對(duì)頁(yè)面進(jìn)行內(nèi)容上的修改瓜喇。重新爬行對(duì)相同的URL不針對(duì)先前的進(jìn)行替換。爬蟲(chóng)主要通過(guò)Web用戶(hù)界面啟動(dòng)歉糜、監(jiān)控和調(diào)整乘寒,允許彈性的定義要獲取的url。
2.3 crawler4j
crawler4j是Java實(shí)現(xiàn)的開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)匪补。提供了簡(jiǎn)單易用的接口伞辛,可以在幾分鐘內(nèi)創(chuàng)建一個(gè)多線(xiàn)程網(wǎng)絡(luò)爬蟲(chóng)。
2.4 WebCollector
WebCollector使用了Nutch的爬取邏輯(分層廣度遍歷)夯缺,Crawler4j的的用戶(hù)接口(覆蓋visit方法蚤氏,定義用戶(hù)操作),以及一套自己的插件機(jī)制,設(shè)計(jì)了一套爬蟲(chóng)內(nèi)核踊兜。
2.5 WebMagic
WebMagic項(xiàng)目代碼分為核心和擴(kuò)展兩部分竿滨。核心部分(webmagic-core)是一個(gè)精簡(jiǎn)的、模塊化的爬蟲(chóng)實(shí)現(xiàn)捏境,而擴(kuò)展部分則包括一些便利的于游、實(shí)用性的功能。WebMagic的架構(gòu)設(shè)計(jì)參照了Scrapy垫言,目標(biāo)是盡量的模塊化贰剥,并體現(xiàn)爬蟲(chóng)的功能特點(diǎn)。
3. HttpClient&Jsoup
爬蟲(chóng)實(shí)現(xiàn)的技術(shù)有很多筷频,對(duì)于java語(yǔ)言來(lái)說(shuō)蚌成,有很多的選擇前痘,可以是很多開(kāi)源的爬蟲(chóng)框架,也可以使用基本httpClient,Jsoup來(lái)爬取網(wǎng)頁(yè)
3.1 HttpClient簡(jiǎn)介
HttpClient 是 apache 組織下面的一個(gè)用于處理 HTTP 請(qǐng)求和響應(yīng)的開(kāi)源工具担忧。它不是一個(gè)瀏覽器芹缔,也不處理客戶(hù)端緩存等瀏覽器的功能。它只是一個(gè)類(lèi)庫(kù)瓶盛!它在 JDK 的基本類(lèi)庫(kù)基礎(chǔ)上做了更好的封裝乖菱。
HttpClient 項(xiàng)目依賴(lài)于 HttpCore(處理核心的 HTTP 協(xié)議)、commons-codec(處理與編碼有關(guān)的問(wèn)題的項(xiàng)目)和 commons-logging(處理與日志記錄有關(guān)問(wèn)題的項(xiàng)目)蓬网。如果你希望能夠通過(guò) HttpClient 向服務(wù)器上傳文件等與 multipart 編碼類(lèi)型有關(guān)的請(qǐng)求窒所,以及其它復(fù)雜的MIME 類(lèi)型,那么帆锋,你需要另外一個(gè)依賴(lài)包:HttpMime(它是專(zhuān)門(mén)處理與 MIME 類(lèi)型有關(guān)問(wèn)題的項(xiàng)目)吵取,在下載的 HttpClient 包中(下載地址)已經(jīng)包含了 HttpMime
項(xiàng)目中使用的 HttpClient 版本為:4.0.1GA,httpClient需要有以下依賴(lài)包:
- httpclient-4.0.1.jar
- httpcore-4.0.1.jar
- httpmime-4.0.1.jar
又依賴(lài)于 mime4j(apache-mime4j-0.6.jar)
- commons-codec-1.4.jar
- commons-logging-1.1.1.jar
- commons-io-1.4.jar – 為了更方便處理與 IO 有關(guān)的需求
3.2 HttpClient抓取網(wǎng)頁(yè)流程
使用HttpClient發(fā)送請(qǐng)求锯厢、接收響應(yīng)很簡(jiǎn)單皮官,一般需要如下幾步:
- 創(chuàng)建HttpClient對(duì)象。
- 創(chuàng)建請(qǐng)求方法的實(shí)例实辑,并指定請(qǐng)求URL捺氢。如果需要發(fā)送GET請(qǐng)求,創(chuàng)建HttpGet對(duì)象剪撬;如果需要發(fā)送POST請(qǐng)求摄乒,創(chuàng)建HttpPost對(duì)象。
- 如果需要發(fā)送請(qǐng)求參數(shù)残黑,可調(diào)用HttpGet馍佑、HttpPost共同的setParams(HetpParams params)方法來(lái)添加請(qǐng)求參數(shù);對(duì)于HttpPost對(duì)象而言梨水,也可調(diào)用setEntity(HttpEntity entity)方法來(lái)設(shè)置請(qǐng)求參數(shù)拭荤。
- 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求,該方法返回一個(gè)HttpResponse疫诽。
- 調(diào)用HttpResponse的getAllHeaders()舅世、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象奇徒,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容雏亚。程序可通過(guò)該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。
- 釋放連接逼龟。無(wú)論執(zhí)行方法是否成功评凝,都必須釋放連接追葡。
3.3 簡(jiǎn)單抓取代碼
用HttpClient發(fā)送請(qǐng)求腺律,請(qǐng)求頭不帶cookie奕短,用EntityUtils解析響應(yīng)結(jié)果
public class MyHttpClient {
/***
* 需求:使用httpClient爬取傳智播客官方網(wǎng)站數(shù)據(jù)
*
* @param args
* @throws Exception
* @throws ClientProtocolException
*/
public static void main(String[] args) throws Exception {
// 創(chuàng)建HttpClient對(duì)象
HttpClient hClient = new DefaultHttpClient();
// 設(shè)置響應(yīng)時(shí)間,設(shè)置傳智源碼時(shí)間匀钧,設(shè)置代理服務(wù)器(不使用本機(jī)的IP爬取翎碑,以防止被服務(wù)器識(shí)別從而IP加入黑名單)
hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));
// 爬蟲(chóng)URL大部分都是get請(qǐng)求,創(chuàng)建get請(qǐng)求對(duì)象
HttpGet hget = new HttpGet("http://www.itcast.cn/");
// 向傳智播客官方網(wǎng)站發(fā)送請(qǐng)求之斯,獲取網(wǎng)頁(yè)源碼
HttpResponse response = hClient.execute(hget);
// EntityUtils工具類(lèi)把網(wǎng)頁(yè)實(shí)體轉(zhuǎn)換成字符串
String content = EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println(content);
}
}
解析結(jié)果
用HttpClient發(fā)送請(qǐng)求日杈,請(qǐng)求頭帶cookie,用EntityUtils解析響應(yīng)結(jié)果
//使用httpClient發(fā)送請(qǐng)求佑刷,使用Jsoup分析網(wǎng)頁(yè)
public static void main(String[] args) throws Exception {
//創(chuàng)建httpClient客戶(hù)端
HttpClient hClient = new DefaultHttpClient();
//創(chuàng)建http發(fā)送請(qǐng)求對(duì)象莉擒,Httpget
HttpGet hget = new HttpGet("http://www.itcast.cn");
//設(shè)置請(qǐng)求頭
hget.setHeader("Cookie", "login_sid_t=f39c57f474a4fbffeeac8b0d727c7310; " +
"YF-Ugrow-G0=169004153682ef91866609488943c77f; " +
"YF-V5-G0=cd5d86283b86b0d506628aedd6f8896e; WBStorage=7754ff192036c629|undefined;" +
" _s_tentry=-; YF-Page-G0=074bd03ae4e08433ef66c71c2777fd84; " +
"Apache=1025338456965.9829.1478277156276; " +
"SINAGLOBAL=1025338456965.9829.1478277156276; " +
"ULV=1478277156293:1:1:1:1025338456965.9829.1478277156276:; " +
"SUB=_2AkMvQDcef8NhqwJRmP4Uzm7mbYxwzA_EieLBAH7sJRMxHRl" +
"-yj9jqmwNtRBn0SIxPIgzk6P4Umq_twX_A70bVg..; " +
"SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5J2ZDKK_Q-h8ni.aX3E1Ci");
hget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
//設(shè)置連接超時(shí),傳遞響應(yīng)超時(shí)
hClient.getParams()
.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("121.31.71.63", 80));
//發(fā)送請(qǐng)求
HttpResponse response = hClient.execute(hget);
//獲取網(wǎng)頁(yè)內(nèi)容
String content = EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println(content);
}
4. Jsoup簡(jiǎn)介
jsoup 是一款Java 的HTML解析器瘫絮,可直接解析某個(gè)URL地址涨冀、HTML文本內(nèi)容。它提供了一套非常省力的API麦萤,可通過(guò)DOM鹿鳖,CSS以及類(lèi)似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)
通常在寫(xiě)爬蟲(chóng)程序時(shí),httpClient結(jié)合Jsoup共同使用即可實(shí)現(xiàn)完美的爬蟲(chóng)系統(tǒng)壮莹。httpClient負(fù)責(zé)模擬瀏覽器發(fā)送請(qǐng)求翅帜,Jsoup負(fù)責(zé)解析httpClient請(qǐng)求返回的HTML頁(yè)面,解析獲取需要的數(shù)據(jù)
4.1 Jsoup獲取網(wǎng)頁(yè)流程
- 從一個(gè) URL命满,文件或字符串中解析 HTML
- 使用 DOM 或 CSS 選擇器來(lái)查找涝滴、取出數(shù)據(jù)
- 可操作 HTML 元素、屬性胶台、文本
4.2 Jsoup獲取網(wǎng)頁(yè)代碼
用Jsoup抓取傳智播客官網(wǎng)左側(cè)的數(shù)據(jù)狭莱,如圖所示
用谷歌瀏覽器開(kāi)發(fā)者工具(F12)打開(kāi)查看源碼如下圖,從中可以看到ul標(biāo)簽的class選擇器為nav_txt
public class HttpClientJsoup {
/***
* 需求:使用httpClient爬取傳智播客官方網(wǎng)站數(shù)據(jù)
*
* @param args
* @throws Exception
* @throws ClientProtocolException
*/
public static void main(String[] args) throws Exception {
// 創(chuàng)建HttpClient對(duì)象
HttpClient hClient = new DefaultHttpClient();
// 設(shè)置響應(yīng)時(shí)間概作,設(shè)置傳智源碼時(shí)間腋妙,設(shè)置代理服務(wù)器
/*hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
.setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));*/
// 爬蟲(chóng)URL大部分都是get請(qǐng)求,創(chuàng)建get請(qǐng)求對(duì)象
HttpGet hget = new HttpGet("http://www.itcast.cn/");
hget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
// 向傳智播客官方網(wǎng)站發(fā)送請(qǐng)求讯榕,獲取網(wǎng)頁(yè)源碼
HttpResponse response = hClient.execute(hget);
// EntityUtils工具類(lèi)把網(wǎng)頁(yè)實(shí)體轉(zhuǎn)換成字符串
String content = EntityUtils.toString(response.getEntity(), "utf-8");
// 使用Jsoup解析網(wǎng)頁(yè)內(nèi)容
Document document = Jsoup.parse(content);
// 獲取文檔標(biāo)題
String title = document.title();
System.out.println(title);
Elements elements = document.select("ul.nav_txt a");
System.out.println(elements);
for(Element element : elements){
System.out.println(element.text() + ":" + element.attr("href"));
}
}
}
解析結(jié)果
使用jsoup向服務(wù)器發(fā)送請(qǐng)求
public class MyJsoup {
/*
* 需求:使用Jsoup解析網(wǎng)頁(yè)源碼
*/
public static void main(String[] args) throws Exception {
// 使用jsoup向服務(wù)器發(fā)送請(qǐng)求
Document doc = Jsoup.connect("http://www.itcast.cn").get();
// Jsoup使用類(lèi)型css,Jquery選擇器方式獲取元素節(jié)點(diǎn)
// Elements elements = doc.getElementsByTag("a");
// System.out.println(elements.text());
Elements elements = doc.select("ul.nav_txt a");
// 循環(huán)元素
for (Element element : elements) {
System.out.println(element.text() + ":" + element.attr("href"));
}
}
}
解析結(jié)果
5. 綜合應(yīng)用
解析下圖中紅色框的內(nèi)容骤素,HttpClient發(fā)送請(qǐng)求,Jsoup解析結(jié)果
點(diǎn)擊開(kāi)發(fā)者工具的第一個(gè)圖標(biāo)愚屁,移動(dòng)鼠標(biāo)到網(wǎng)頁(yè)的目標(biāo)位置济竹,即可定位到該目標(biāo)的網(wǎng)頁(yè)源碼位置
package com.github.webcrawder;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class CrawderDemo {
public static void main(String[] args) throws ClientProtocolException, IOException {
// 創(chuàng)建httpClient客戶(hù)端
HttpClient hClient = new DefaultHttpClient();
// 創(chuàng)建http發(fā)送請(qǐng)求對(duì)象,Httpget
HttpGet hget = new HttpGet("http://www.itcast.cn");
// 發(fā)送請(qǐng)求
HttpResponse response = hClient.execute(hget);
// 獲取網(wǎng)頁(yè)內(nèi)容
String content = EntityUtils.toString(response.getEntity(), "utf-8");
// 使用Jsoup解析網(wǎng)頁(yè)內(nèi)容
Document document = Jsoup.parse(content);
// 使用元素選擇器選擇網(wǎng)頁(yè)的內(nèi)容
Elements elements = document.select("ul.nav_li a");
System.out.println(elements.text());
System.out.println(elements);
}
}
解析結(jié)果
//使用jsoup加載遠(yuǎn)程連接數(shù)據(jù)
@Test
public void myJsouptest() throws Exception {
String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like " +
"Gecko) Chrome/44.0.2403.157 Safari/537.36";
//準(zhǔn)備cookie信息
Map<String, String> maps = new HashMap<String, String>();
maps.put("TC-Ugrow-G0", "968b70b7bcdc28ac97c8130dd353b55e");
maps.put("SUB", "2AkMvfeeDf8NhqwJRmP0dzGvhZY5yywvEieLBAH7sJRMxHRl-yT9jqmAHtRAgR4BQZgBIE" +
"-Xz-jsqjVftcUdtrA..");
maps.put("SUBP", "0033WrSXqPxfM72-Ws9jqgMF55529P9D9WhBu3bohh6dYkXbY_GUs5d8");
//獲取網(wǎng)頁(yè)dom對(duì)象
Document doc = Jsoup.connect("http://www.itcast.cn/")
.userAgent(userAgent)
.cookies(maps).get();
//獲取文檔標(biāo)簽
String title = doc.title();
System.out.println(title);
//獲取網(wǎng)頁(yè)元素
Elements elements = doc.select("div.qrcode-text");
System.out.println(elements.text());
}