網絡爬蟲---利用Jsoup爬取京東商品信息(第一版)

前言

  今天週六,公司不加班,早起之後沒事做就想玩一下。之前寫的爬蟲的項目丟了,也找不到了,今天又查詢了一些資料又重新寫了一個,記錄一下實現過程吧.


正文

Jsoup中文API博客地址

  JsoupAPI完整使用手冊


Jsoup介紹

  jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。

  但是jsoup有個缺點就是隻能獲取靜態網頁資源,由於狗東關於商品的信息,除了商品標題,其他關於評價人數人數以及價格什麼的都是通過ajax異步請求獲取數據之後來重新賦值,而且你第一次獲取的靜態資源網頁,也只有20條左右的數據,它通過你鼠標滾輪滑動去異步加載數據。這就需要我們通過jsoup去模擬發送ajax請求然後解析json數據。emmm,這個文章就不說這個內容了,我採用的方法是,手動將網頁數據加載完成,然後ctrl+s。

  1.導入Jsoup依賴

		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.10.3</version>
		</dependency>

  2.分析狗東數據

  我們在狗東搜索,電腦查看商品信息可以發現,他的每一個商品對應的class名都是gl-item,但是我們可以發現,gl-item中依然有多餘的內容,我們只需要根據gl-i-wrap就可以獲取一個商品的所有標籤了。實際上我也是這麼做的,
在這裏插入圖片描述

  3.書寫代碼

public static void main(String[] args) throws IOException {
		//本地文件的路徑
		File html =new File("C:/Users/asus/Desktop/1.html");
		//獲取網頁文本
		Document document = Jsoup.parse(html, "UTF-8");
		//指定存儲文件的路徑
		File path = new File("G:/study/jdimg");
		if (!path.exists()) {
			path.mkdirs();
		}
		//根據類名選擇商品
		Elements items = document.getElementsByClass("gl-i-wrap");
		for (Element element : items) {
			//獲取圖片標籤信息
			Element p_img = element.getElementsByClass("p-img").first();
			//獲取圖片中的a標籤
			Element p_img_a = p_img.getElementsByTag("a").first();
			//獲取a標籤中的title值,對應的商品標題
			String itemTitle = p_img_a.attr("title");
			//獲取a標籤中的url值,對應的商品連接
			String itemUrl = p_img_a.attr("href");
			//獲取價格信息   --獲取價格標籤,然後找到價格中的i標籤,獲取文本信息
			String p_price = element.getElementsByClass("p-price").first().getElementsByTag("i").first().text();
			//獲取評價信息
			String p_commit = element.getElementsByClass("p-commit").first().getElementsByTag("strong").first().text();
			//獲取賣家信息
			String p_shop = element.getElementsByClass("p-shop").first().getElementsByTag("a").first().text();
			//下載圖片
			//剛纔我們拿到的是商品的詳情界面,我們連接這個頁面,分析頁面可以知道商品的圖片信息就在id=spec-img的標籤中
			//拿到這個dom元素後,獲取圖片的地址
			Document itemInfo = Jsoup.connect(itemUrl).get();
			Element itemImg = itemInfo.getElementById("spec-img");
			URL url = new URL("http:"+itemImg.attr("data-origin"));
			String filename = ""+System.currentTimeMillis();
			// 獲得連接
			URLConnection connection = url.openConnection();
			// 設置10秒的相應時間
			connection.setConnectTimeout(10 * 1000);
			// 獲得輸入流
			InputStream in = connection.getInputStream();
			// 獲得輸出流
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(path+"/"+filename+".png"));
			// 構建緩衝區
			byte[] buf = new byte[1024];
			int size;
			// 寫入到文件
			while (-1 != (size = in.read(buf))) {
				out.write(buf, 0, size);
			}
			out.close();
			in.close();
			System.out.println("圖片地址:"+itemUrl+"\n商品標題:"+itemTitle+
					"\n商品價格:"+p_price+"\n評價人數:"+p_commit+"\n賣家信息:"+p_shop+"\n文件名稱:"+filename);
			System.out.println("---------------------------");
		
		
	}

  4.效果展示

  數據信息:
在這裏插入圖片描述
  圖片信息:
在這裏插入圖片描述


總結

  總體來說jsoup使用方法還是比較人性化的,只需要你有前端的基礎就可以爬取到想要的信息了,當然了,存本地這種方式確實比較蠢,有沒有什麼好的辦法呢?當然有,我們可以分析頁面的請求,模擬發起。這篇文章不再討論。那麼可能會有人問,你這圖片爬取了有什麼用嗎?在這裏我可以告訴大家,並沒什麼用,只不過是告訴你們如何爬取圖片,因爲你們用的時候,肯定會有這個需求。不多解釋了。
  鹹魚IT技術交流羣:89248062,在這裏有一羣和你一樣有愛、有追求、會生活的朋友! 大家在一起互相支持,共同陪伴,讓自己每天都活在豐盛和喜樂中!同時還有龐大的小夥伴團體,在你遇到困擾時給予你及時的幫助,讓你從自己的坑洞中快速爬出來,元氣滿滿地重新投入到生活中!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章