天天看點

網絡爬蟲之JSOUP

JSOUP中文文檔:http://www.open-open.com/jsoup/

推薦部落格:http://www.cnblogs.com/jycboy/p/jsoupdoc.html

從一個URL加載一個Document

Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();
      

使用DOM方法來周遊一個文檔

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
    String linkHref = link.attr("href");
    String linkText = link.text();
}       

查找元素

getElementById(String id)
getElementsByTag(String tag)
getElementsByClass(String className)
getElementsByAttribute(String key) (and related methods      

元素資料

attr(String key)擷取屬性attr(String key, String value)設定屬性
attributes()擷取所有屬性
id(), className() and classNames()
text()擷取文本内容text(String value) 設定文本内容
html()擷取元素内HTMLhtml(String value)設定元素内的HTML内容      
Elements links = doc.select("a[href]"); //帶有href屬性的a元素
Elements pngs = doc.select("img[src$=.png]");//擴充名為.png的圖檔
Element masthead = doc.select("div.masthead").first(); //class等于masthead的div标簽
Elements resultLinks = doc.select("h3.r > a"); //在h3元素之後的a元素      
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class OnlineProductDownload {

	public void demo1() {
		// 從優酷下載下傳包含視訊結果的html
		Document doc = getHtmlByName("冷然之天秤");
		try {
			//選擇第一個結果
			Element element = doc.select("div.s_inform").first();
			// 擷取播放源,不是優酷本站的傳回(優酷可能會跳轉到其他網站,如:愛奇藝)
			Element playSource = element.select("div.pos_area span").first();
			if (playSource.text() != "優酷") {
				return;
			}

			//每個li一集(海賊王:第一集、第二集)
			Elements li_Elements = element.select("ul.clearfix li");
			for (Element li : li_Elements) {
				// 擷取第幾集
				Element span = li.getElementsByTag("span").first();
				String text = span.text();
				// 擷取每集詳情的url(并不是視訊的真實url)
				Element a = li.getElementsByTag("a").first();
				String href = a.attr("href");

				// 根據href擷取詳情網頁文本
				doc = getHtmlTextByUrl(href);
				//查找實際結果标簽
				Element sourceLi = doc.select("ul.fn-share-code li").first();
				// 根據doc擷取播放插件. 如:
				// <iframe src='http://player.youku.com/embed/XMzUwNjM1OTA0MA=='></iframe>
				Element input = sourceLi.getElementsByTag("input").first();
				String value = input.attr("value");
				System.out.println(text + value);
			}
			// http://v.youku.com/v_show/id_XMzUwNjM1OTA0MA==.html
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 功能:使用優酷的搜庫來搜尋視訊,并根據名稱擷取網頁文本 如:海賊王
	public Document getHtmlByName(String name) {
		if (name.isEmpty() || name.length() <= 0) {
			return null;
		}
		// 拼接URL 優酷搜尋形式:http://www.soku.com/search_video/q_海賊王
		String url = "http://www.soku.com/search_video/q_";
		try {
			//url編碼:%E6%B5%B7%E8%B4%BC%E7%8E%8B=海賊王
			String encodeStr = URLEncoder.encode(name, "utf-8");
			url = url + encodeStr;
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		// 通過url擷取html
		try {
			Document doc = Jsoup.connect(url).get();
			return doc;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 根據url從網絡擷取網頁文本
	public Document getHtmlTextByUrl(String url) {
		Document doc = null;
		try {
			//拼接成完整的路徑
			String str = "http:";
			str = str + url;
			doc = Jsoup.connect(str).get();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return doc;
	}

}