閑扯幾句
大家好,我是你們的老朋友青戈,之前分享了一篇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
對象:
從
Document
對象中擷取到目标圖檔所在父級的
div
,擷取到這個
div
之後,事情就簡單多了。
我們從這個
div
中擷取所有的
a
标簽,然後判斷,
a
标簽的
href
屬性是否包含
jpeg
關鍵字,如果包含了,那就是我們需要抓取的圖檔。
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>
下載下傳圖檔到本地磁盤:
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-content
的
a
标簽中包含了我們所需要的資料,是以我們來循環一次看看,是不是能拿到:
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
結尾的位址。
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);
}
}
再跑一次,這就完美了:
接下來就好辦了,有了網頁的位址,我們隻需要挨個循環,就能批量得到網頁的資料了!
完整代碼:
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學習指南
還趕得上趟哦🤩
關注
感謝你的閱讀,看完别忘記
三連
哦🍭我們下期見~