本文目錄一覽:
- 1、java的Jsoup登錄有驗證碼網頁獲取登錄後的cookie
- 2、Jsoup或者HttpClient抓取web頁面時,data,userAgent,cookie(),timeout(),post();為什麼要設置這些?
- 3、jsoup教程
- 4、jsoup抓取dopostback的網頁錯誤 是不是BODY出什麼問題
- 5、Jsoup 請求鏈接含中文亂碼
- 6、Jsoup 抓取網頁,字符是亂碼,怎麼轉換?跪求拜託了各位 謝謝
java的Jsoup登錄有驗證碼網頁獲取登錄後的cookie
首先是jar倉庫:
dependency
groupIdorg.seleniumhq.selenium/groupId
artifactIdselenium-java/artifactId
version[3.0.1,)/version//獲取最新的版本庫
/dependency
dependency
groupIdorg.jsoup/groupId
artifactIdjsoup/artifactId
version1.8.2/version
typejar/type
/dependency
代碼:
public static void getIndex2() {
//之前運行程序發現生成了N多個chrome driver進程,搞不懂為什麼會有那麼多進程產生,網上查了下,說起這個service有用,拿來試下,效果未知
ChromeDriverService service = new
ChromeDriverService.Builder().usingDriverExecutable(new
File(“./driver/chromedriver.exe”)).usingAnyFreePort().build();
try {
service.start();
} catch (IOException ex) {
Logger.getLogger(kechengbiaoIndex.class.getName()).log(Level.SEVERE, null, ex);
}
//end
//正式開始
//先定義瀏覽器驅動,我用chrome瀏覽器,網上下載一個chromedriver.exe,啟動時需要加載
System.getProperties().setProperty(“webdriver.chrome.driver”, “./driver/chromedriver.exe”);
Jsoup或者HttpClient抓取web頁面時,data,userAgent,cookie(),timeout(),post();為什麼要設置這些?
userAgent讓服務器感覺訪問者更像一個真實的瀏覽器在訪問,cookie是看服務器需不需要,timeout還需要解釋嗎,你不設置有一個默認的超時時間
jsoup教程
jsoup是一款Java的HTML解析器,主要用來對HTML解析。 官網 中文文檔
在爬蟲的時候,當我們用HttpClient之類的框架,獲取到網頁源碼之後,需要從網頁源碼中取出我們想要的內容,
就可以使用jsoup這類HTML解析器了。可以非常輕鬆的實現。
雖然jsoup也支持從某個地址直接去爬取網頁源碼,但是只支持HTTP,HTTPS協議,支持不夠豐富。
所以,主要還是用來對HTML進行解析。
◆其中,要被解析的HTML可以是一個HTML的字符串,可以是一個URL,可以是一個文件。
org.jsoup.Jsoup把輸入的HTML轉換成一個org.jsoup.nodes.Document對象,然後從Document對象中取出想要的元素。
org.jsoup.nodes.Document繼承了org.jsoup.nodes.Element,Element又繼承了org.jsoup.nodes.Node類。裡面提供了豐富的方法來獲取HTML的元素。
◇從URL獲取HTML來解析
其中Jsoup.connect(“xxx”)方法返回一個org.jsoup.Connection對象。
在Connection對象中,我們可以執行get或者post來執行請求。但是在執行請求之前,
我們可以使用Connection對象來設置一些請求信息。比如:頭信息,cookie,請求等待時間,代理等等來模擬瀏覽器的行為。
◆獲得Document對象後,接下來就是解析Document對象,並從中獲取我們想要的元素了。
Document中提供了豐富的方法來獲取指定元素。
◇使用DOM的方式來取得
getElementById(String id):通過id來獲取
getElementsByTag(String tagName):通過標籤名字來獲取
getElementsByClass(String className):通過類名來獲取
getElementsByAttribute(String key):通過屬性名字來獲取
getElementsByAttributeValue(String key, String value):通過指定的屬性名字,屬性值來獲取
getAllElements():獲取所有元素
◇通過類似於css或jQuery的選擇器來查找元素
使用的是Element類的下記方法:
public Elements select(String cssQuery)
通過傳入一個類似於CSS或jQuery的選擇器字符串,來查找指定元素。
例子:
選擇器的更多語法(可以在org.jsoup.select.Selector中查看到更多關於選擇器的語法):
tagname: 通過標籤查找元素,比如:a
ns|tag: 通過標籤在命名空間查找元素,比如:可以用 fb|name 語法來查找 fb:name 元素
#id: 通過ID查找元素,比如:#logo
.class: 通過class名稱查找元素,比如:.masthead
[attribute]: 利用屬性查找元素,比如:[href]
[^attr]: 利用屬性名前綴來查找元素,比如:可以用[^data-] 來查找帶有HTML5 Dataset屬性的元素
[attr=value]: 利用屬性值來查找元素,比如:[width=500]
[attr^=value], [attr$=value], [attr=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查找元素,比如:[href=/path/]
[attr~=regex]: 利用屬性值匹配正則表達式來查找元素,比如: img[src~=(?i).(png|jpe?g)]
*: 這個符號將匹配所有元素
Selector選擇器組合使用
el#id: 元素+ID,比如: div#logo
el.class: 元素+class,比如: div.masthead
el[attr]: 元素+class,比如: a[href]
任意組合,比如:a[href].highlight
ancestor child: 查找某個元素下子元素,比如:可以用.body p 查找在”body”元素下的所有 p元素
parent child: 查找某個父元素下的直接子元素,比如:可以用div.content p 查找 p 元素,也可以用body * 查找body標籤下所有直接子元素
siblingA + siblingB: 查找在A元素之前第一個同級元素B,比如:div.head + div
siblingA ~ siblingX: 查找A元素之前的同級X元素,比如:h1 ~ p
el, el, el:多個選擇器組合,查找匹配任一選擇器的唯一元素,例如:div.masthead, div.logo
偽選擇器selectors
:lt(n): 查找哪些元素的同級索引值(它的位置在DOM樹中是相對於它的父節點)小於n,比如:td:lt(3) 表示小於三列的元素
:gt(n):查找哪些元素的同級索引值大於n,比如: div p:gt(2)表示哪些div中有包含2個以上的p元素
:eq(n): 查找哪些元素的同級索引值與n相等,比如:form input:eq(1)表示包含一個input標籤的Form元素
:has(seletor): 查找匹配選擇器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
:not(selector): 查找與選擇器不匹配的元素,比如: div:not(.logo) 表示不包含 class=”logo” 元素的所有 div 列表
:contains(text): 查找包含給定文本的元素,搜索不區分大不寫,比如: p:contains(jsoup)
:containsOwn(text): 查找直接包含給定文本的元素
:matches(regex): 查找哪些元素的文本匹配指定的正則表達式,比如:div:matches((?i)login)
:matchesOwn(regex): 查找自身包含文本匹配指定正則表達式的元素
注意:上述偽選擇器索引是從0開始的,也就是說第一個元素索引值為0,第二個元素index為1等
◆通過上面的選擇器,我們可以取得一個Elements對象,它繼承了ArrayList對象,裡面放的全是Element對象。
接下來我們要做的就是從Element對象中,取出我們真正需要的內容。
通常有下面幾種方法:
◇Element.text()
這個方法用來取得一個元素中的文本。
◇Element.html()或Node.outerHtml()
這個方法用來取得一個元素中的html內容
◇Node.attr(String key)
獲得一個屬性的值,例如取得超鏈接a href=””中href的值
json字符串-數組類型與JSONArray之間的轉換
複雜json格式字符串與JSONObject之間的轉換
jsoup抓取dopostback的網頁錯誤 是不是BODY出什麼問題
在Java 程序在解析HTML 文檔時,大家應該曉得htmlparser 這個開源項目,我也是使用過,不過這個程序到了2006年就沒有更新了。由於我的基礎較差,對於擴展自定義的標籤還是不太懂,還是有超時問題困擾,去在約上找個專家諮詢了下,使用起來還是很容易上手的。下面寫些使用心得:
jsoup is a Java library for working with real-world HTML. It provides a very convenient API for extracting and manipulating data, using the best of DOM, CSS, and jQuery-like methods.
jsuop是一款java的html解析器,提供一套非常省力的API,通過dom模型css和類似於jquery的方式來獲取和操作數據。
功能:1.解析一個Html文檔,2.解析一個body片段
Java代碼
String html = “htmlheadtitleFirst parse/title/head”
+ “bodypParsed HTML into a doc./p/body/html”;
Document doc = Jsoup.parse(html);//分析文檔,使用doc.toString()可以轉為文本
Element body=doc.body();//獲取body片段,使用body.toString()可以轉為文本
獲取方式:1.從本地文件加載 2.根據url地址獲取
Java代碼
/**使用靜態 Jsoup.parse(File in, String charsetName, String baseUri) 方法
*其中baseUri參數用於解決文件中URLs是相對路徑的問題。
*如果不需要可以傳入一個空的字符串。
*/
File input = new File(“/tmp/input.html”);
Document doc = Jsoup.parse(input, “UTF-8”, “”);
Java代碼
/**
*根據url直接獲取內容,可以加入超時,get方法不行,就用post方法
*我在實際應用中,出現404,405,504等錯誤信息
*將get改為post就可以,或者反過來改
*如果等以後弄明白了,再來解釋清楚
*/
Document doc1 = Jsoup.connect(“”).get();
String title = doc1.title(); //獲取網頁的標題
String content=doc1.toString();//將網頁轉為文本
Document doc2 = Jsoup.connect(“”)
.data(“query”, “Java”)//請求參數
.userAgent(“Mozilla”)//設置urer-agent
.cookie(“auth”, “token”)//設置cookie
.timeout(50000)//設置連接超時
.post();//或者改為get
經過我的測試使用,jsoup分析網頁結構和內容的功能遠遠強大於HtmlParser,無論是獲取整個頁面的文本,還是分析特定內容的網頁結構,都是十分的方便。
附上鏈接:jsoup官網: ,中文jsoup:
下面寫些我的使用記錄,希望大家如果能從我的方法中得到啟發,鑒於本人從事開發工作不久,內容可能寫的不是很好。
jsoup數據獲取有兩大方法:1.通過分析dom模型的網頁標籤和元素,2.select元素選擇器,類似jquery方式(功能很強大,還支持正則表達式)。網頁tag標籤有body,div,table,tr,td,a,等等。元素的屬性有,href,title,width,height,color等等,元素屬性的值就是,例如:href=“”, 值就是 。width=“98%” 值就是98%
下面就以分析首頁的每日資訊為例,抓取每日資訊的標題和url地址,詳細寫出分析步驟:
1.用chrome瀏覽器的元素審查,分析頁面的結構,得到每日資訊是div class=main_left層裡面
2.寫程序分析,首先根據url獲取div文本,再來根據文本對內容進行分析
Java代碼
3. 根據整個每日資訊所在的div層,獲取那段內容(精確獲取)
Java代碼
4.根據獲取的目標層得到你所要的內容(title,url地址…等等)
Java代碼
5.加入main方法裡面執行測試
Java代碼
6.附上結束語:jsoup功能很好很強大,附上的只是簡單的使用方法,還有很多需要完善的內容,我其實使用也不到幾天的時間。還有就是select功能還是很好用的,具體參考官方文檔,寫的非常的通俗易懂
感興趣的也可以試試htmlcleaner+xpath的組合
/**
* @method 測試獲取內容程序
*/
public static void main(String[] args) throws IOException {
/**
* 執行分析程序
*/
String url=””;
String HtmlContent=getContentByJsoup(url);
String divContent=getDivContentByJsoup(HtmlContent);
getLinksByJsoup(divContent);
}
/**
* 使用jsoup分析divContent
* 1.獲取鏈接 2.獲取url地址(絕對路徑)
*/
public static void getLinksByJsoup(String divContent){
String abs=””;
Document doc=Jsoup.parse(divContent,abs);
Elements linkStrs=doc.getElementsByTag(“li”);
System.out.println(“鏈接===”+linkStrs.size());
for(Element linkStr:linkStrs){
String url=linkStr.getElementsByTag(“a”).attr(“abs:href”);
String title=linkStr.getElementsByTag(“a”).text();
System.out.println(“標題:”+title+” url:”+url);
}
}
/**
* 使用jsoup來對文檔分析
* 獲取目標內容所在的目標層
* 這個目標層可以是div,table,tr等等
*/
public static String getDivContentByJsoup(String content){
String divContent=””;
Document doc=Jsoup.parse(content);
Elements divs=doc.getElementsByClass(“main_left”);
divContent=divs.toString();
//System.out.println(“div===”+divContent);
return divContent;
}
/**
* 根據jsoup方法獲取htmlContent
* 加入簡單的時間記錄
* @throws IOException
*/
public static String getContentByJsoup(String url){
String content=””;
try {
System.out.println(“time=====start”);
Date startdate=new Date();
Document doc=Jsoup.connect(url)
.data(“jquery”, “java”)
.userAgent(“Mozilla”)
.cookie(“auth”, “token”)
.timeout(50000)
.get();
Date enddate=new Date();
Long time=enddate.getTime()-startdate.getTime();
System.out.println(“使用Jsoup耗時==”+time);
System.out.println(“time=====end”);
content=doc.toString();//獲取iteye網站的源碼html內容
System.out.println(doc.title());//獲取iteye網站的標題
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(content);
return content;
}
Jsoup 請求鏈接含中文亂碼
這不是亂碼吧 這是經過urlencode過後的編碼。你網上自己找個url編碼 輸個中文字符然後編碼下。
Jsoup 抓取網頁,字符是亂碼,怎麼轉換?跪求拜託了各位 謝謝
1.從url加載一個頁面:Document doc = Jsoup.connect(” ” ).get();2.從url加載頁面同時加載該頁面上的鏈接頁面:Document doc=Jsoup.connect(url).data(“query”, “Java”)// 請求參數.userAgent(“my jsoup”)// 設置 User-Agent.cookie(“auth”, “token”)// 設置 cookie.timeout(3000)// 設置連接超時時間.get();3.本地一個html文件:File input = new File(“/tmp/input.html”);Document doc = Jsoup.parse(input, “UTF-8″, ” ” ); 查看原帖
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159067.html