摘要:年前無心工作,上班刷知乎發(fā)現(xiàn)一篇分享爬蟲的文章。另外攜帶的數(shù)據(jù)是用來告訴服務(wù)器當前請求是從哪個頁面請求過來的。
年前無心工作,上班刷知乎發(fā)現(xiàn)一篇分享python爬蟲的文章。
感覺他爬取的網(wǎng)站里的妹子都好好看哦,超喜歡這里的,里面?zhèn)€個都是美女。
無小意丶:自我發(fā)掘爬蟲實戰(zhàn)1:宅男女神網(wǎng)妹子圖片批量抓取,分類保存到本地和MongoDB數(shù)據(jù)庫
無奈python雖然入門過但太久沒用早已荒廢,最近在用nodejs重構(gòu)后臺接口,遂嘗試用nodejs實現(xiàn)個爬蟲。
先上幾張圖:
爬幾個相冊示范一下
都是高清無碼大圖哦
好了,開始準備工作吧,少年!
喂!我說的是準備工作環(huán)境!你,你,還有你,你們把手上的紙巾放下!
準備工作:系統(tǒng)環(huán)境:mac (作為一個前端,應(yīng)該不用我解釋了吧?)
運行環(huán)境:node (作為一個前端,應(yīng)該不用我解釋了吧??)
所需模塊:request-promise、cheerio、fs
編輯器:vscode (誰用誰知道)
簡單了解一下這幾個nodejs的模塊:
request-promise----Node.js的一個網(wǎng)絡(luò)請求模塊,使用超簡單:
var request = require("request-promise"); request("http://www.google.com") .then(function (htmlString) { console.log(htmlString) }) .catch(function (err) { });
任何響應(yīng)都可以輸出到文件流:
request("http://google.com/doodle.png").pipe( fs.createWriteStream("doodle.png") )
cheerio----為服務(wù)器特別定制的,快速、靈活、實施的jQuery核心實現(xiàn):
api類似jQuery,使用超簡單
const cheerio = require("cheerio") const $ = cheerio.load("Hello world
") $("h2.title").text("Hello there!") $("h2").addClass("welcome") $.html() //=>Hello there!
fs----Node.js 文件系統(tǒng)
可以創(chuàng)建目錄,創(chuàng)建文件,讀取文件等。
網(wǎng)頁分析:分析目標網(wǎng)站的相冊網(wǎng)頁地址
因為python文章的作者已經(jīng)很詳細的分析了網(wǎng)站,所以我就簡單分析一下。
隨便打開幾個相冊,可以看到都是這樣的規(guī)則:
"https://www.****.com/g/****/"
所以我們就可以確定要爬取的基本url:
const base_url = "https://www.****.com/g/";//爬取相冊網(wǎng)頁的基本網(wǎng)址
然后再看幾乎每個相冊底部都有頁碼,而我們要抓取的是整個相冊,所以就要考慮分頁的情況,點開分頁,我們看到分頁的url是這樣的:
"https://www.****.com/g/****/*.html"業(yè)務(wù)邏輯: 實戰(zhàn)代碼:
app.js 輪詢及代碼結(jié)構(gòu)
const nvshens = require("./co"); const base_url = "https://www.nvshens.com/g/";//爬取相冊網(wǎng)頁的基本網(wǎng)址 let index = 1; let start = 25380; const end = 30000; const main = async (URL) => { //1.請求網(wǎng)址 const data = await nvshens.getPage(URL); //2.判斷是否存在相冊 if (nvshens.getTitle((data.res))) { //3.下載照片 await nvshens.download(data.res); //4.請求分頁 index++; const new_url = `${base_url}${start}/${index}.html`; main(new_url); } else { index = 1; console.log(`${base_url}${start}頁面已完成`) start++; if (start < end) { //5.請求下一個網(wǎng)址 main(base_url + start); } else { console.log(`${base_url}${end}所有頁面已完成`) } } }; main(base_url + start);
co.js //業(yè)務(wù)代碼
var request = require("request-promise"); //網(wǎng)絡(luò)請求 const cheerio = require("cheerio");//操作dom const fs = require("fs");//讀寫文件 const headers = { "Referer": "https://www.nvshens.com/g/24656/" } //因為一些網(wǎng)站在解決盜鏈問題時是根據(jù)Referer的值來判斷的,所以在請求頭上添加Referer屬性就好(可以填爬取網(wǎng)站的地址)。 //另外Referer攜帶的數(shù)據(jù) 是用來告訴服務(wù)器當前請求是從哪個頁面請求過來的。 const basePath = "/Users/用戶名/Desktop/mm/"; //自定義mac本地下載目錄,需預先創(chuàng)建,windows路徑可參考評論 let downloadPath; let pageIndex = 1; module.exports = { //請求頁面 async getPage(url) { const data = { url, res: await request({ url: url }) } return data; }, //判斷頁面是否存在相冊 getTitle(data) { const $ = cheerio.load(data); if ($("#htilte").text()) { downloadPath = basePath + $("#htilte").text(); //創(chuàng)建相冊 if (!fs.existsSync(downloadPath)) { fs.mkdirSync(downloadPath); console.log(`${downloadPath}文件夾創(chuàng)建成功`) } return true; } else { return false; } }, //下載相冊照片 async download(data) { if (data) { var $ = cheerio.load(data); $("#hgallery").children().each(async (i, elem) => { const imgSrc = $(elem).attr("src"); const imgPath = "/" + imgSrc.split("/").pop().split(".")[0] + "." + imgSrc.split(".").pop(); console.log(`${downloadPath + imgPath}下載中`) const imgData = await request({ uri: imgSrc, resolveWithFullResponse: true, headers, }).pipe(fs.createWriteStream(downloadPath + imgPath)); }) console.log("page done") } }, }
跑起來
node app.js
幾個函數(shù)就可以實現(xiàn),是不是很簡單呢?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107301.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:每一個方格就是數(shù)組的一個個體。收工完成效果因為我實在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會出現(xiàn)一個頭像重復三次的情況源碼。 我看到了什么 在看淘寶前端團隊的博客的時候,無意中點進了關(guān)于我們這個頁面,其中有個動畫我覺得很有趣,也很通用,感覺在哪里都可以使用一樣,效果如下圖所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...
摘要:每一個方格就是數(shù)組的一個個體。收工完成效果因為我實在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會出現(xiàn)一個頭像重復三次的情況源碼。 我看到了什么 在看淘寶前端團隊的博客的時候,無意中點進了關(guān)于我們這個頁面,其中有個動畫我覺得很有趣,也很通用,感覺在哪里都可以使用一樣,效果如下圖所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...
摘要:能看到這里說明快進入動態(tài)網(wǎng)頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的及其數(shù)據(jù)提取是什么是輕量級的文本數(shù)據(jù)交換格式,符合的格式的字符串叫字符串,其格式就像中字符串化后的字典,有時字典中還雜著列表字典,但是里面的數(shù)據(jù)都被雙引號包著 ??能看到這里說明快進入動態(tài)網(wǎng)頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的json及其數(shù)據(jù)提取 JSON 是什么 ??json是輕量級...
摘要:為了寫好爬蟲,我們需要準備一個火狐瀏覽器,還需要準備抓包工具,抓包工具,我使用的是自帶的,加上,這兩款軟件的安裝和使用,建議你還是學習一下,后面我們應(yīng)該會用到。 妹子圖網(wǎng)站----前言 從今天開始就要擼起袖子,直接寫Python爬蟲了,學習語言最好的辦法就是有目的的進行,所以,接下來我將用10+篇的博客,寫爬圖片這一件事情。希望可以做好。 為了寫好爬蟲,我們需要準備一個火狐瀏覽器,還需...
閱讀 3834·2021-09-27 13:56
閱讀 881·2021-09-08 09:36
閱讀 765·2019-08-30 15:54
閱讀 609·2019-08-29 17:29
閱讀 927·2019-08-29 17:21
閱讀 1683·2019-08-29 16:59
閱讀 2757·2019-08-29 13:03
閱讀 2964·2019-08-29 12:47