1. 程式人生 > >網絡爬蟲之JSOUP

網絡爬蟲之JSOUP

element urn con rac 名稱 value fix attribute amp

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元素

如何找到優酷網視頻的URL的連接地址?
視頻的下面 有“ 分享 ”或 “站外引用 ”或是 貼到博客或BBS ,如果有點下,然後復制FALSH地址,在空間裏寫日誌,點插入flash選項,加入flash的地址就可以了。

代碼示例:
功能:使用JSoup爬取連接地址

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;
	}

}

  

網絡爬蟲之JSOUP