selenium爬蟲下載豆瓣相冊

想爬豆瓣相冊起因是因為甚颂,想將豆瓣照片轉(zhuǎn)移到其他地方蜜猾,但是豆瓣的照片下載下來都是webp格式,正常情況下沒法打開振诬,所以想到能不能通過selenium爬到數(shù)據(jù)呢蹭睡?
E:\IDEAProject\MyProject\SeleniumTest

本來想的是從模擬登陸開始,然后一步步進到相冊里赶么,獲取相冊圖片列表肩豁,但是比較麻煩。還有一個更方便的操作辫呻,通過F12開發(fā)者工具清钥,查看請求的url,帶上cookie去模擬請求

進到相冊首頁

GET請求帶cookie放闺,https://www.douban.com/people/62414040/photos

image.png

通過對Response的分析

image.png

看到相冊信息以及相冊地址都在下圖所示的信息塊中
通過對該信息塊進行信息提取祟昭,可以得到相冊名列表相冊地址url列表

image.png

進到相冊詳情頁

GET請求帶cookie,https://www.douban.com/photos/album/1871536872/
如果相冊里圖片數(shù)量超過了18張怖侦,就會有第二頁
GET請求帶cookie篡悟,https://www.douban.com/photos/album/1871536872/?m_start=18
同理,如果有第三頁第四頁匾寝,url是
https://www.douban.com/photos/album/1871536872/?m_start=36
https://www.douban.com/photos/album/1871536872/?m_start=54

image.png

通過對Response的分析
看到相冊信息以及相冊中每張圖片url都在下圖所示的信息塊中

image.png

有了圖片地址就好辦了搬葬,使用IO流下載圖片

代碼如下

獲取每個相冊中圖片的地址,返回集合

    /**
     * GET方式
     * 獲取每個相冊中圖片的地址艳悔,返回集合
     */
    public List<String> getImageUrlList(String passUrl, String folderName) throws BusinessException {

        //第五步:在獲取以上憑證后開始采集數(shù)據(jù)
        logger.info("獲取豆瓣相冊" + folderName + "圖片地址");

//        String passUrl = "https://www.douban.com/photos/album/1871536796/";
        String passCookie = "gmxq-IDUYXw; douban-fav-remind=1; __yadk_uid=bK748gKAh8REVU6PsYrAF24ZroyVxSYA; " +
                "__gads=ID=9cf216a578728a98:T=1587890575:S=ALNI_MbpwRrOxhrMiUZPlDmEcg-YeTzuhw; ll=\"118159\"; " +
                "__utmc=30149280; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.6241; " +
                "douban-profile-remind=1; ct=y; __utmz=30149280.1588515963.4.3.utmcsr=baidu|utmccn=(organic)" +
                "|utmcmd=organic|utmctr=%E8%B1%86%E7%93%A3%E7%9B%B8%E5%86%8C%E4%B8%8B%E8%BD%BD%E6%80%8E%E4%B9%88%E6%98" +
                "%AFwebp; dbcl2=\"62414040:cC/OMBA010s\"; ck=snAu; gr_user_id=7f5f3e5d-9cf9-4d38-9e3e-8ffebe3b22b1; " +
                "_pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1588520368%2C%22https%3A%2F%2Fwww.baidu" +
                ".com%2Fbaidu%3Fisource%3Dinfinity%26iname%3Dbaidu%26itype%3Dweb%26tn%3D02003390_42_hao_pg%26ie%3Dutf-8" +
                "%26wd%3D5kg%25E5%25A4%25A7%25E7%25B1%25B3%25E4%25B8%2580%25E4%25B8%25AA%25E4%25BA%25BA%25E5%2590%2583" +
                "%25E5%25A4%259A%25E4%25B9%2585%22%5D; _pk_ses.100001.8cb4=*; __utma=30149280.835562099.1587890488" +
                ".1588515963.1588520368.5; __utmt=1; _pk_id.100001.8cb4=d2bb86d9f8460bdf.1587890487.3.1588520483" +
                ".1588517154.; __utmb=30149280.12.10.1588520368";

        List<String> imageUrl = new ArrayList<>();

        //請求url帶上cookie
        Document document = RequestUtil.sendGetRequestWithNullReturnDoc(passUrl, passCookie);
        //圖片元素列表
        Elements photo_wrap = document.getElementsByClass("photo_wrap");
        //圖片元素列表for循環(huán)急凰,單個元素有哪些子元素,通過getElementsByTag方法得到子元素后就猜年,再調(diào)用attr方法獲取屬性值
        for (Element element : photo_wrap) {

            Elements allElements = element.getAllElements();
            Elements img = element.getElementsByTag("img");
            String src = img.attr("src");
            System.out.println(src);

            //將webp替換成jpg香府,一樣可以打開圖片
            src = src.replace("webp", "jpg");
            imageUrl.add(src);

        }

        return imageUrl;
    }

下載圖片方法



    /**
     * java 通過url下載圖片保存到本地
     *
     * @param urlString 圖片url地址
     * @param i         圖片保存名稱,雪花算法【需要引入mybatis-plus】
     * @throws Exception
     */
    public static void download(String urlString, String basePath, String folderName, Long i) throws Exception {

        // 構(gòu)造URL
        URL url = new URL(urlString);
        // 打開連接
        URLConnection con = url.openConnection();
        // 輸入流
        InputStream is = con.getInputStream();
        // 1K的數(shù)據(jù)緩沖
        byte[] bs = new byte[1024];
        // 讀取到的數(shù)據(jù)長度
        int len;

        //完整文件夾名
        File file0 = new File(basePath + "\\" + folderName);
        if (!file0.isDirectory() && !file0.exists()) {
            file0.mkdirs();
        }

        // 輸出的文件流
        String filename = file0 + "\\" + i + ".jpg";  //下載路徑及下載圖片名稱

        File file = new File(filename);
        FileOutputStream os = new FileOutputStream(file, true);
        // 開始讀取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        System.out.println(i);
        // 完畢码倦,關(guān)閉所有鏈接
        os.close();
        is.close();
    }

    }
}

獲取相冊的集合

    /**
     * 獲取相冊的集合
     */
    public List<List<String>> getAlbumList(String passUrl) throws BusinessException {
        logger.info("圖片首頁");
        String passCookie = "gmxq-IDUYXw; douban-fav-remind=1; __yadk_uid=bK748gKAh8REVU6PsYrAF24ZroyVxSYA; " +
                "__gads=ID=9cf216a578728a98:T=1587890575:S=ALNI_MbpwRrOxhrMiUZPlDmEcg-YeTzuhw; ll=\"118159\"; " +
                "__utmc=30149280; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.6241; " +
                "douban-profile-remind=1; ct=y; __utmz=30149280.1588515963.4.3.utmcsr=baidu|utmccn=(organic)" +
                "|utmcmd=organic|utmctr=%E8%B1%86%E7%93%A3%E7%9B%B8%E5%86%8C%E4%B8%8B%E8%BD%BD%E6%80%8E%E4%B9%88%E6%98" +
                "%AFwebp; dbcl2=\"62414040:cC/OMBA010s\"; ck=snAu; gr_user_id=7f5f3e5d-9cf9-4d38-9e3e-8ffebe3b22b1; " +
                "_pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1588520368%2C%22https%3A%2F%2Fwww.baidu" +
                ".com%2Fbaidu%3Fisource%3Dinfinity%26iname%3Dbaidu%26itype%3Dweb%26tn%3D02003390_42_hao_pg%26ie%3Dutf-8" +
                "%26wd%3D5kg%25E5%25A4%25A7%25E7%25B1%25B3%25E4%25B8%2580%25E4%25B8%25AA%25E4%25BA%25BA%25E5%2590%2583" +
                "%25E5%25A4%259A%25E4%25B9%2585%22%5D; _pk_ses.100001.8cb4=*; __utma=30149280.835562099.1587890488" +
                ".1588515963.1588520368.5; __utmt=1; _pk_id.100001.8cb4=d2bb86d9f8460bdf.1587890487.3.1588520483" +
                ".1588517154.; __utmb=30149280.12.10.1588520368";

        //相冊的集合
        List<List<String>> albumListAll = new ArrayList<>();

        //請求url帶上cookie
        Document document = RequestUtil.sendGetRequestWithNullReturnDoc(passUrl, passCookie);
        Elements allElements = document.getAllElements();
        Elements albumlst = document.getElementsByClass("albumlst");

        for (Element element : albumlst) {

            List<String> albumList = new ArrayList<>();

            Elements elements = element.getElementsByClass("albumlst");
            Element element1 = elements.get(0);

            String href = element1.getElementsByClass("album_photo").attr("href");
            String pl = element1.getElementsByClass("pl").text();
            String substring = pl.substring(0, pl.indexOf("張"));
            int totalRecord = Integer.parseInt(substring);

            //totalRecord:總記錄數(shù) / pageSize:每頁多少條記錄  /totalPageNum:總頁數(shù)
            int pageSize = 18;
            //分頁的總頁數(shù)算法
            int totalPageNum = (totalRecord + pageSize - 1) / pageSize;

            if (totalPageNum == 1) {
                albumList.add(href);
            } else if (totalPageNum >= 2) {
                albumList.add(href);
                for (int i = 1; i < totalPageNum; i++) {
                    String s = href + "?m_start=" + pageSize * i;
                    albumList.add(s);
                }
            } else {

            }
            albumListAll.add(albumList);
        }
        return albumListAll;
    }

獲取相冊名的集合

    /**
     * 獲取相冊名的集合
     */
    public List<String> getAlbumNameList(String passUrl) throws BusinessException {
        logger.info("圖片首頁");
        String passCookie = "gmxq-IDUYXw; douban-fav-remind=1; __yadk_uid=bK748gKAh8REVU6PsYrAF24ZroyVxSYA; " +
                "__gads=ID=9cf216a578728a98:T=1587890575:S=ALNI_MbpwRrOxhrMiUZPlDmEcg-YeTzuhw; ll=\"118159\"; " +
                "__utmc=30149280; ap_v=0,6.0; push_noty_num=0; push_doumail_num=0; __utmv=30149280.6241; " +
                "douban-profile-remind=1; ct=y; __utmz=30149280.1588515963.4.3.utmcsr=baidu|utmccn=(organic)" +
                "|utmcmd=organic|utmctr=%E8%B1%86%E7%93%A3%E7%9B%B8%E5%86%8C%E4%B8%8B%E8%BD%BD%E6%80%8E%E4%B9%88%E6%98" +
                "%AFwebp; dbcl2=\"62414040:cC/OMBA010s\"; ck=snAu; gr_user_id=7f5f3e5d-9cf9-4d38-9e3e-8ffebe3b22b1; " +
                "_pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1588520368%2C%22https%3A%2F%2Fwww.baidu" +
                ".com%2Fbaidu%3Fisource%3Dinfinity%26iname%3Dbaidu%26itype%3Dweb%26tn%3D02003390_42_hao_pg%26ie%3Dutf-8" +
                "%26wd%3D5kg%25E5%25A4%25A7%25E7%25B1%25B3%25E4%25B8%2580%25E4%25B8%25AA%25E4%25BA%25BA%25E5%2590%2583" +
                "%25E5%25A4%259A%25E4%25B9%2585%22%5D; _pk_ses.100001.8cb4=*; __utma=30149280.835562099.1587890488" +
                ".1588515963.1588520368.5; __utmt=1; _pk_id.100001.8cb4=d2bb86d9f8460bdf.1587890487.3.1588520483" +
                ".1588517154.; __utmb=30149280.12.10.1588520368";

        //相冊的集合
        List<String> albumNameList = new ArrayList<>();

        //請求url帶上cookie
        Document document = RequestUtil.sendGetRequestWithNullReturnDoc(passUrl, passCookie);
        Elements allElements = document.getAllElements();
        Elements albumlst = document.getElementsByClass("albumlst");
        for (Element element : albumlst) {

            Elements elements = element.getElementsByClass("albumlst");
            Element element1 = elements.get(0);

            Elements elements1 = element1.getElementsByClass("pl2");
            String albumName = elements1.text();

            albumNameList.add(albumName);
        }


        return albumNameList;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锭碳,隨后出現(xiàn)的幾起案子袁稽,更是在濱河造成了極大的恐慌,老刑警劉巖擒抛,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推汽,死亡現(xiàn)場離奇詭異补疑,居然都是意外死亡,警方通過查閱死者的電腦和手機歹撒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門莲组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暖夭,你說我怎么就攤上這事锹杈。” “怎么了迈着?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵竭望,是天一觀的道長。 經(jīng)常有香客問我裕菠,道長咬清,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任奴潘,我火速辦了婚禮旧烧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画髓。我一直安慰自己掘剪,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布雀扶。 她就那樣靜靜地躺著杖小,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愚墓。 梳的紋絲不亂的頭發(fā)上予权,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音浪册,去河邊找鬼扫腺。 笑死,一個胖子當著我的面吹牛村象,可吹牛的內(nèi)容都是我干的笆环。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厚者,長吁一口氣:“原來是場噩夢啊……” “哼躁劣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起库菲,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤账忘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖擒,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡溉浙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒋荚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳稽。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖期升,靈堂內(nèi)的尸體忽然破棺而出惊奇,到底是詐尸還是另有隱情,我是刑警寧澤吓妆,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布赊时,位于F島的核電站,受9級特大地震影響行拢,放射性物質(zhì)發(fā)生泄漏祖秒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一舟奠、第九天 我趴在偏房一處隱蔽的房頂上張望竭缝。 院中可真熱鬧,春花似錦沼瘫、人聲如沸抬纸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿故。三九已至,卻和暖如春膜蛔,著一層夾襖步出監(jiān)牢的瞬間坛猪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工皂股, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墅茉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓呜呐,卻偏偏與公主長得像就斤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蘑辑,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容