前言
今天週六,公司不加班,早起之後沒事做就想玩一下。之前寫的爬蟲的項目丟了,也找不到了,今天又查詢了一些資料又重新寫了一個,記錄一下實現過程吧.
正文
Jsoup中文API博客地址
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,在這裏有一羣和你一樣有愛、有追求、會生活的朋友! 大家在一起互相支持,共同陪伴,讓自己每天都活在豐盛和喜樂中!同時還有龐大的小夥伴團體,在你遇到困擾時給予你及時的幫助,讓你從自己的坑洞中快速爬出來,元氣滿滿地重新投入到生活中!