爬了1000张清纯妹子私房照,我流鼻血了...

news/2024/7/19 10:37:50 标签: 爬虫, 美女, java

闲扯几句

大家好,我是你们的老朋友青戈,之前分享了一篇Java爬虫的入门实战教程,收获了不少赞,看来大家伙对爬虫的热情度还是蛮高的哈。既然大家都这么想学爬虫,那今天就安排点刺激的。那你要非问我有多刺激,那我只能告诉,我看完…流鼻血了…🤪

插播一条反爬信息:本文作者:程序员青戈,博客:https://blog.csdn.net/xqnode

我知道大家平时工作生活都挺累的,要是程序员的话就更苦逼了,加不完的班,敲不完的bug,着实让老哥我有点心疼啊,那么这期就给大家放一波福利。高能预警!一大批美女即将来袭,请各位朋友们把持住,把持住啊!


啥?看的不过瘾?我就知道你这么说,同样作为兄弟的我非常能理解啊,那么下面这篇教程你得好好看看了,因为这将直接决定你今晚能不能睡个好觉😂

进入主题

今天我们爬取的网站是 唯美女生网 ,我们进来看看

是不是很哇塞?都是好看的小姐姐😎这谁顶得住啊,我就点进去瞅一眼


卧槽?这什么鬼?小姐姐怎么变大妈了!

导演:搞错了,再来!

啊这,为什么让小小年纪的我看到这个?兄弟们,我又相信爱情了!曾经有一段真挚的爱情摆在我的面前,我没有好好珍惜,现在,她回来了,还是那么清纯、羞涩,穿着碎花的裙子,趴在床上向我微笑。

这,不就是青春吗?
这,不就是爱情吗?

还等什么?我来啦!

网页代码分析

回归主题哈,各位,我这个人有个不好的习惯,看到美女就走神,真是抱歉了,差点忘记了今天是来写代码的😅

这个网站的站长估计每天被爬虫的烦死了,服务器顶着巨大的压力,曾经一段时间还频繁宕机。为了解决后患,他干脆关了网页的f12功能,不让看代码了,防止无数的se狼们搞他的小站,毕竟人家也不容易,你们干太猛了,怼太深了,不给人家活路啊

今天我为了写这篇教程,也是花尽了心思啊,想尽办法拿到了他的源码,你们猜我是怎么搞的?

不知道你们观察过没,平时你在看网站源代码的时候,地址栏的前面会多这一段:view-source:,后面跟的就是你实际的网站的地址,比如百度的源码是这样的:view-source:https://www.baidu.com


那么同样的道理,我们也可以使用这个地址看这个网站的源代码,比如:view-source:https://www.vmgirls.com/15215.html

我们从网页的源代码分析可以找到图片的位置,分析得出 a标签的href 属性就是图片的地址:

随便点开看一下,证实我的想法:

OK,确定了图片的位置,那就好办了

开始撸码

还是老规矩,我们继续使用 Jsoup 来进行网页数据抓取,先引入jsoup的包:

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

连接目标网页,得到 Document 对象:

java">Document document = Jsoup.connect("https://www.vmgirls.com/15298.html").get();

Document对象中获取到目标图片所在父级的 div ,获取到这个div之后,事情就简单多了。

我们从这个div中获取所有的a标签,然后判断,a标签的href属性是否包含 jpeg 关键字,如果包含了,那就是我们需要抓取的图片。

java">Elements elements = element.getElementsByTag("a");
        for (Element a : elements) {
            String href = a.attr("href");
            if(href.contains("jpeg")) {
                System.out.println(href);
            }
        }

打印下结果,确实是拿到了所有的图片。

到了这一步算不算完成了呢?肯定没有啊,我们还没有下载到本地磁盘里面呢。不在自己电脑里怎么能在夜深人静的时候自己偷偷看啊😆

那我们就得想办法把这些链接下载下来啊,Java下载网络文件非常简单,我这里为了省事呢,直接使用了第三方的工具类 hutool ,感兴趣的同学们可以自己去了解一下 hutool 这个甜甜的工具类啊,保证你用完一次就爱上他。官网地址:https://www.hutool.cn/

引入hutool

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.7</version>
</dependency>

下载图片到本地磁盘:

java">for (Element a : elements) {
            String href = a.attr("href");
            if(href.contains("jpeg")) {
        System.out.println(href);
        // 下载图片到项目根路径下的imgs文件夹中
        HttpUtil.downloadFile("https:" + href, new File(System.getProperty("user.dir") + "/imgs"));
    }
}

再跑一遍:

控制台显示下载完成,我们打开本地磁盘的文件夹看看:


非常完美啊,看到这一排排的美女图片,内心还是有那么一丝丝的小躁动的 [害羞]

批量下载

刚才演示的是下载单个网页中的图片,那么很多坏家伙又会很好奇,怎么批量下载美女图片?

别以为我不知道你们的小心思哈,因为我也在琢磨呢,哈哈🤣

你别说,我还真找到办法了。

经过没日没夜的研究,我发现,不同网页的地址,是通过数字控制的,比如:https://www.vmgirls.com/14636.html 和 https://www.vmgirls.com/15298.html

那么就是说我们找到了这个数字,问题就迎刃而解了。

那么去哪找这个数字呢?答案肯定是在首页啊,打开首页的源代码看看:

我注意到这个 class=media-contenta 标签中包含了我们所需要的数据,所以我们来循环一次看看,是不是能拿到:

java">Document main = Jsoup.connect("https://www.vmgirls.com").get();
Elements medias = main.getElementsByClass("media-content");
for (Element media : medias) {
    System.out.println(media.attr("href"));
}

跑了一下代码,确实拿到了这个数字的地址,但是数据还是有点混乱。

我们需要做进一步的筛选,筛选出末尾是html结尾的地址。

java">Document main = Jsoup.connect("https://www.vmgirls.com").get();
Elements medias = main.getElementsByClass("media-content");
for (Element media : medias) {
    String href = media.attr("href");
    if (href.endsWith("html")) {
        System.out.println(href);
    }
}

再跑一次,这就完美了:

接下来就好办了,有了网页的地址,我们只需要挨个循环,就能批量得到网页的数据了!

完整代码:

java">Document main = Jsoup.connect("https://www.vmgirls.com").get();
Elements medias = main.getElementsByClass("media-content");
for (Element media : medias) {
    String url = media.attr("href");
    if (url.endsWith("html")) {
        Document document = Jsoup.connect("https://www.vmgirls.com/" + url).get();
        Element element = document.getElementsByClass("nc-light-gallery").get(0);
        Elements elements = element.getElementsByTag("a");
        for (Element a : elements) {
            String href = a.attr("href");
            if (href.contains("jpeg")) {
                System.out.println(href);
                HttpUtil.downloadFile("https:" + href, new File(System.getProperty("user.dir") + "/imgs"));
            }
        }
    }
}
System.out.println("下载完成");


怎么样?看到这琳琅满目的妹子,都是青春期的诱惑啊!心动没?没事,代码拿去,自己跑跑,晚上在被窝里偷偷看也没人知道的🤭

至少,我不会说出去~


我是程序员青戈,没错,逗比青年就是我了,还不赶紧来关注这个骚味十足的年轻人😋

我的原创公众号:Java学习指南 最近正在筹备一批Java干货教程,现在关注还赶得上趟哦🤩

感谢你的阅读,看完别忘记三连哦🍭我们下期见~


http://www.niftyadmin.cn/n/887815.html

相关文章

Java面试合集(一)Java基础知识点汇总

大家好&#xff0c;我是 程序员青戈&#xff0c;一个被Bug耽误了才艺的程序员&#x1f466;专注于Java领域的知识分享和技术交流&#xff0c;每天都会给大家带来Java学习的干货教程&#x1f4da; 微信搜索公众号 Java学习指南&#xff0c;回复 面试 领取一线大厂面试题一套&…

分享一个开源的Springboot博客系统,界面简洁精致,拿来即用

文章目录系统简介主要技术与框架环境设置页面展示项目待优化获取方式系统简介 本期给大家带来一款基于Springboot的博客系统。 博客系统通过从零开始搭建整个项目&#xff0c;会带你了解整个开发流程&#xff0c;如何设计&#xff0c;如何实现&#xff0c;一步步发现&#xf…

面试官问你:知道什么是ABA问题吗?

大家好啊&#xff0c;我是你们的老朋友青戈&#xff0c;我又来分享干货啦&#x1f609;最近有没有好好学习啊&#xff1f;我不在的时候也不能懈怠哦~毕竟升职加薪还得靠自己努力的呀&#x1f606; 在开始问题阐述之前呢&#xff0c;我们先看一则小故事&#xff1a; 狸猫换太子…

面试中被问到CAS机制该怎么回答

一个小例子说说什么是线程安全 并发是Java编程的基础&#xff0c;在我们日常的工作中&#xff0c;很多时候都会跟并发打交道&#xff0c;当然&#xff0c;这也是面试考察的重点。在并发编程中&#xff0c;被提起最多的概念是线程安全&#xff0c;下面我们先来看一段代码&#…

ecshop 商品详情页面显示-赠品信息-优惠活动

在goods.php中搜索$goods get_goods_info($goods_id);然后下下一行中&#xff0c;添加下面的代码 /* 取得用户等级 */ $user_rank_list array();$user_rank_list[0] $_LANG[not_user];$sql "SELECT rank_id, rank_name FROM " . $ecs->table(user_rank);…

关于Mysql分库分表,面试的时候怎么回答比较好呢?

前言 公司最近在搞服务分离&#xff0c;数据切分方面的东西&#xff0c;因为单张包裹表的数据量实在是太大&#xff0c;并且还在以每天60W的量增长。 之前了解过数据库的分库分表&#xff0c;读过几篇博文&#xff0c;但就只知道个模糊概念&#xff0c; 而且现在回想起来什么…

经验:一个普通的二本学生如何拿到大厂的offer?

大家好&#xff0c;我是程序员青戈&#xff0c;本期分享一位二本普通学生逆袭斩获大厂offer的故事&#xff0c;请大家细细品读&#xff0c;相信从中会有所收获和感触的。 1、终于步入大学 我既没有跨过山和大海&#xff0c;也没有穿过人山人海&#xff0c;我就是我&#xff0c…

【Spring Cloud Alibaba】 Nacos服务注册中心

文章目录理论什么是Nacos实战Nacos下载和安装Nacos与SpringBoot集成nacos-server-discoverynacos-server-consumer测试总结说起注册中心&#xff0c;我们肯定会想起Eureka、Zookeeper等&#xff0c;但是你知道阿里的Nacos注册中心吗&#xff1f;Nacos相对于Eureka和Zookeeper有…