Java用Jsoup解析爬取某房網的翻頁的前五頁圖片--解決src取不到圖片導致進入onerror標籤的問題--使用data-original標籤-圖文加代碼註釋

昨天寫了一篇基本爬蟲,簡單說一下翻頁爬取,其實有些網站的翻頁很簡單,看地址欄變化可以了,有些頁碼都是在URL地址中體現出來的。文末附上源碼,源碼有詳細註釋。

簡單說下今晚的實踐以及遇到的問題:

今天爬取某房網的網址,先參觀一下,地鐵居然打成拼音,小同學不認真啊。

這裏選定了兩個條件篩選房源(只是不想後面下載太多圖片),總數爲141套,總共5頁。可以看到圖片放在img標籤裏面,看上去應該問題不大。

然後,我們通過分別點擊1/2/3..頁,看地址欄的變化,會發現很簡單的規律:

頁碼的變化對應地址欄中URL的最後一位數字,那寫個循環,地址欄的尾數從1變化到5就可以了。嗯,我也是這麼做的。分頁挺簡單的吧,怎麼爬取就不說了,結合上一篇文章和文末的源碼看,源碼都有註釋,下面說說遇到的問題:

F12看下標籤,按理說取img標籤裏的src屬性就可以得到結果了。然而卻是這樣:

很顯然不對啊,結果看上去像是錯誤的情況下的填充圖片,事實上也是,跟img標籤裏的onerror屬性的地址顯示的是同一張圖片。問題在哪兒呢,查閱了資料,得到原因:用了src欺騙手段,實際上網頁展示的並不是src的地址,雖然src地址的圖片是正確的,src欺騙倒是沒聽過,不過 data-original 是懶加載的必要屬性,可以瞭解一下。所查閱的資料內容:

資料裏的是"data-objurl",而我們實踐的網站顯示的url地址的屬性爲"data-original";

這樣就拿到5頁內容正常的圖片了:

最後,附上源碼:

maven還是隻需要引入:

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

代碼爲一個class類:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


public class SpiderFromXXXFangWithPage {
    public static void main(String[] args) throws IOException {
        String path = "e:/某房/";//存放文件夾的目錄
        File file = new File(path);
        if (!file.exists()) {//如果文件夾不存在
            boolean mkOk = file.mkdir();//創建文件夾
            System.out.println("創建文件夾" + (mkOk ? "成功" : "失敗"));
        }
        //存放所有網頁的url地址
        List<String> allPics = new ArrayList<String>();
        //目標爬取的頁數爲5頁
        for (int i = 0; i < 5; i++) {
            //地址記得修改
            String sourceUrl = "https://hangzhou.xxxxx.com/sale/b4-p14-f" + (i+1);//字符串拼接動態地址,最後一位代表頁碼
            List<String> pics = getOnePageUrls(sourceUrl);//獲取一頁圖片url地址
            allPics.addAll(pics);
        }
        downloadPicture(allPics, path);//調用下面下載網站的方法
    }
    //獲取一頁圖片url地址
    private static List<String> getOnePageUrls(String sourceUrl) throws IOException {
        Document doc = Jsoup.connect(sourceUrl).get();//獲取整個DOM節點
        Elements links = doc.select("div#cycleListings.house-detail a[href] img[data-original]");//獲取所有div#cycleListings.house-detail下面的img[src]標籤
        List<String> pics = new ArrayList<String>();//集合存放所有圖片鏈接
        for (Element element : links) {
            String src = element.attr("data-original");//獲取這個屬性的內容,也就是url了
            pics.add(src);
        }
        return pics;
    }

    //鏈接url下載圖片
    private static void downloadPicture(List<String> urlList, String path) {
        int i = 0;//圖片命名用
        for (String oneUrl : urlList) {
            URL url;
            try {
                url = new URL(oneUrl);
                DataInputStream dataInputStream = new DataInputStream(url.openStream());
                FileOutputStream fileOutputStream = new FileOutputStream(new File(path + (i+1) + ".jpg"));
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int length;
                while ((length = dataInputStream.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }
                fileOutputStream.write(output.toByteArray());
                dataInputStream.close();
                fileOutputStream.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }
    }
}

本文原創,如需轉載,請註明出處,謝謝

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