selenium爬虫下载豆瓣相册

想爬豆瓣相册起因是因为,想将豆瓣照片转移到其他地方,但是豆瓣的照片下载下来都是webp格式,正常情况下没法打开,所以想到能不能通过selenium爬到数据呢?
E:\IDEAProject\MyProject\SeleniumTest

本来想的是从模拟登陆开始,然后一步步进到相册里,获取相册图片列表,但是比较麻烦。还有一个更方便的操作,通过F12开发者工具,查看请求的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/
如果相册里图片数量超过了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 {

        //第五步:在获取以上凭证后开始采集数据
        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循环,单个元素有哪些子元素,通过getElementsByTag方法得到子元素后就,再调用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 {

        // 构造URL
        URL url = new URL(urlString);
        // 打开连接
        URLConnection con = url.openConnection();
        // 输入流
        InputStream is = con.getInputStream();
        // 1K的数据缓冲
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        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);
        // 完毕,关闭所有链接
        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:总记录数 / pageSize:每页多少条记录  /totalPageNum:总页数
            int pageSize = 18;
            //分页的总页数算法
            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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容