摘要:決定送大家一套美圖。美腿可以分為白璧無瑕的大腿美晶瑩剔透的小腿美細(xì)微的美足健康明朗的腿形美。所謂腿健美,是指腿部的線條美。腿的長短與肥瘦是決定腿部美丑的兩大因素。
決定送大家一套美圖。但是授之以魚不如授之以漁,我們就來使用node實(shí)現(xiàn)個(gè)小爬蟲去爬取各種美女
來吧,我們先來看看今天的目標(biāo): mmjpg.com的美腿頻道下的圖片
在開始之前先來科普科普
美腿是形容女性美麗、性感、修長的腿形美。美腿可以分為白璧無瑕的大腿美、晶瑩剔透的小腿美、細(xì)微的美足、健康明朗的腿形美。所謂腿健美,是指腿部的線條美。腿的長短與肥瘦是決定腿部美丑的兩大因素。一、實(shí)現(xiàn)步驟
確定目標(biāo)頁面
使用superagent庫來獲取頁面
分析頁面結(jié)構(gòu),使用cheerio 獲取有效信息
保存圖片到本地
開擼
不斷優(yōu)化
二、開始編寫爬取妹子圖的爬蟲下載這個(gè)小項(xiàng)目需要使用的庫
npm i superagent cheerio fs-extra --save
這兒我們用到了superagent cheerio fs-extra這三個(gè)庫
superagent 是nodejs里一個(gè)非常方便的客戶端請(qǐng)求代理模塊
cheerio:為服務(wù)器特別定制的,快速、靈活、實(shí)施的jQuery核心實(shí)現(xiàn)
fs-extra: 豐富了fs模塊,同時(shí)支持async/await
2.1 請(qǐng)求URL獲取HTML使用superagent發(fā)起請(qǐng)求并打印出頁面內(nèi)容
const request = require("superagent") const cheerio = require("cheerio") const fs = require("fs-extra") let url = "http://www.mmjpg.com/tag/meitui/" request .get(url + "1") .then(function (res) { console.log(res.text) }) // 你就可以看見HTML內(nèi)容打印到了控制臺(tái)2.2 分析頁面結(jié)構(gòu)
現(xiàn)在我們就需要分析頁面結(jié)構(gòu),然后使用cheerio來操作了,你沒用過cheerio不要緊它的語法和jQuery基本一樣。作為前端,在開發(fā)者工具中分析頁面應(yīng)該是家常便飯,手到擒來。這兒就不多說了,記住我們的目標(biāo)是找出需要的節(jié)點(diǎn)獲取到有效信息就好
我們可以發(fā)現(xiàn)需要的東西都在class為pic那個(gè)div下的列表中,現(xiàn)在我們就可以使用cheerio來獲取
... async function getUrl() { const res = await request.get(url + 1) const $ = cheerio.load(res.text) $(".pic li").each(function(i, elem) { const href = $(this).find("a").attr("href") const title = $(this).find(".title").text() console.log(title, href) }) } getUrl() /* console $ node app.js 大美女尹菲開檔網(wǎng)襪寫真令人眼花繚亂 http://www.mmjpg.com/mm/1230 宅男女神豐滿誘人的胴體令人想入非非 http://www.mmjpg.com/mm/1164 性感美女浴室寫真高聳的酥胸誘惑十足 http://www.mmjpg.com/mm/1162 長相清純甜美的97年妹子苗條美腿圖片 http://www.mmjpg.com/mm/1157 麗質(zhì)美女柔美修長美腿帶給你曼妙感受 http://www.mmjpg.com/mm/1153 容貌似楊冪的美女馨怡美腿極致誘惑圖 http://www.mmjpg.com/mm/1148 絲襪美腿誘惑!甜美女神楊晨晨私房套圖 http://www.mmjpg.com/mm/1130 性感美女劉鈺兒透視內(nèi)衣私密照真撩人 http://www.mmjpg.com/mm/1127 膚白貌美的模特李晨晨十分惹人憐愛 http://www.mmjpg.com/mm/1126 萌妹林美惠子穿黑絲浴室私房寫真福利 http://www.mmjpg.com/mm/1124 美女趙小米修長雙腿絲襪寫真能玩幾年 http://www.mmjpg.com/mm/1111 */2.3 分析URL地址
在很多時(shí)候我們都需要分析URL,就像點(diǎn)擊不同的頁碼觀察URL變化 http://www.mmjpg.com/tag/meit...,我們可以很容易發(fā)現(xiàn)頁碼對(duì)應(yīng)為URL最后的數(shù)字。查看mmjpg.com的美腿頻道我們可以發(fā)現(xiàn)它一共有10頁內(nèi)容,我們就不寫代碼判斷頁數(shù)了直接寫死為10。當(dāng)然了這兒你可以自己實(shí)現(xiàn)動(dòng)態(tài)判斷總頁數(shù),就當(dāng)是留的小練習(xí)吧。
async function getUrl() { let linkArr = [] for (let i = 1; i <= 10; i++) { const res = await request.get(url + i) const $ = cheerio.load(res.text) $(".pic li").each(function (i, elem) { let link = $(this).find("a").attr("href") linkArr.push(link) }) } return linkArr }2.4 獲取圖片地址
現(xiàn)在我們已經(jīng)能獲取到圖集的URL了。在上一步我們獲取圖集URL的時(shí)候是把頁碼寫死了的,這是因?yàn)槟莻€(gè)頁碼不是動(dòng)態(tài)的,然而每個(gè)圖集的圖片頁數(shù)是不一樣的,這兒我們就需要?jiǎng)討B(tài)判斷了。進(jìn)入圖集后,切換圖片的頁碼URL也會(huì)跟著變,現(xiàn)在這個(gè)URL就是每張圖片頁面的URL。我們只需要獲取最后一個(gè)頁面的頁碼, 從 1 開始?xì)v遍,和我們上面獲取的URL拼接在一起就是每張圖片的頁面地址啦!
獲取到單個(gè)圖片URL后,我們可以通過圖片的src屬性去拿到真實(shí)的圖片地址,然后實(shí)現(xiàn)下載保存
async function getPic(url) { const res = await request.get(url) const $ = cheerio.load(res.text) // 以圖集名稱來分目錄 const dir = $(".article h2").text() console.log(`創(chuàng)建${title}文件夾`) await fs.mkdir(path.join(__dirname, "/mm", title)) const pageCount = parseInt($("#page .ch.all").prev().text()) for (let i = 1; i <= pageCount; i++) { let pageUrl = url + "/" + i const data = await request.get(pageUrl) const _$ = cheerio.load(data.text) // 獲取圖片的真實(shí)地址 const imgUrl = _$("#content img").attr("src") download(dir, imgUrl) // TODO } }2.5 保存圖片到本地
現(xiàn)在我們就來實(shí)現(xiàn)下載保存圖片的方法,這兒我們使用了stream(流) 來保存圖片
function download(dir, imgUrl) { console.log(`正在下載${imgUrl}`) const filename = imgUrl.split("/").pop() const req = request.get(imgUrl) .set({ "Referer": "http://www.mmjpg.com" }) // mmjpg.com根據(jù)Referer來限制訪問 req.pipe(fs.createWriteStream(path.join(__dirname, "mm", dir, filename))) }
ok,現(xiàn)在我們就來把之前寫的各個(gè)功能的函數(shù)連起來
async function init(){ let urls = await getUrl() for (let url of urls) { await getPic(url) } } init()
運(yùn)行該文件,你就可以看終端打印出入下信息,你的文件夾中也多了好多美女圖喲!開不開心?嗨不嗨皮?
前方高能
一大波美女來襲
好吧~不刪掉通過不了
源碼:https://github.com/ogilhinn/m...
到此這個(gè)小爬蟲就算寫完了,但是這只是一個(gè)很簡陋的爬蟲,還有很多需要改進(jìn)的地方
你還可以加入很多東西讓它更健壯,如:
使用多個(gè)userAgent
不斷更換代理ip
降低爬蟲的速度,加個(gè)sleep()
……
如何讓它更健壯、如何應(yīng)對(duì)反爬蟲策略這些留著以后再講吧
三、參考鏈接源碼:https://github.com/ogilhinn/m...
superagent: http://visionmedia.github.io/...
cheerio:https://github.com/cheeriojs/...
fs-extra:https://github.com/jprichards...
大家可以關(guān)注我的公眾號(hào),一起玩耍。有技術(shù)干貨也有扯淡亂談,關(guān)注回復(fù)[888]還有意外驚喜領(lǐng)取
左手代碼右手磚,拋磚引玉
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94425.html
摘要:又到了一年一度的情人節(jié)大家都準(zhǔn)備送什么給自己心儀的對(duì)象呢鮮花巧克力都太俗套了,今天給大家?guī)硪粋€(gè)抖音上看到的表白神器用寫一個(gè)告白程序,讓她看到你滿滿的愛意。 又到了一年一度的情人節(jié)!大家都準(zhǔn)備送什么給自己心儀的對(duì)象呢? 鮮花、巧克力都太俗套了,今天給大家?guī)硪粋€(gè)抖音上看到的表白神器 — 用Python寫一個(gè)告白程序,讓她看到你滿滿的愛(tao)意(lu)。 先上效果: showImg(...
摘要:可以直接給特定返回特定的數(shù)據(jù)。對(duì)于服務(wù)器的話就是發(fā)送了的文件,惡意程序請(qǐng)求后會(huì)自動(dòng)解包為的數(shù)據(jù),可以對(duì)爬蟲程序等造成很大的壓力。入群后直接輸入禁止爬蟲采集群輸入密碼查看隱藏內(nèi)容提交最后額,很新奇的方法,不過爬蟲變成隨機(jī)即可繞過。在loc看到的,Caddy有個(gè)http.nobots??梢灾苯咏o特定UA返回特定的數(shù)據(jù)。比如1G壓縮一次就剩1M,壓兩次就3k。 對(duì)于服務(wù)器的話就是發(fā)送了1M的...
摘要:下面是本周精選內(nèi)容,請(qǐng)享用。不要看錯(cuò)了,這個(gè)是,和測試框架僅一字之差。本文作者王仕軍,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。想知道我接下來會(huì)寫些什么歡迎訂閱我的掘金專欄或知乎專欄前端周刊讓你在前端領(lǐng)域跟上時(shí)代的腳步。 showImg(https://segmentfault.com/img/remote/1460000009646412); 破解前端面試系列文章本周出到第 ...
摘要:未授權(quán)的爬蟲抓取程序是危害原創(chuàng)內(nèi)容生態(tài)的一大元兇,因此要保護(hù)網(wǎng)站的內(nèi)容,首先就要考慮如何反爬蟲。反爬蟲的銀彈目前的反抓取機(jī)器人檢查手段,最可靠的還是驗(yàn)證碼技術(shù)。機(jī)器人協(xié)議除此之外,在爬蟲抓取技術(shù)領(lǐng)域還有一個(gè)白道的手段,叫做協(xié)議。 本文首發(fā)于我的個(gè)人博客,同步發(fā)布于SegmentFault專欄,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處,商業(yè)轉(zhuǎn)載請(qǐng)閱讀原文鏈接里的法律聲明。 web是一個(gè)開放的平臺(tái),這也奠定了...
摘要:總的來說有兩種反爬策略,要么驗(yàn)證身份,把蟲子踩死在門口要么在網(wǎng)站植入各種反爬機(jī)制,讓爬蟲知難而退。本節(jié)內(nèi)容就著這兩種反爬策略提出一些對(duì)策。內(nèi)嵌反爬很靈活,沒有什么固定的代碼格式,要花時(shí)間去分析出來。 ??之前提到過,有些網(wǎng)站是防爬蟲的。其實(shí)事實(shí)是,凡是有一定規(guī)模的網(wǎng)站,大公司的網(wǎng)站,或是盈利性質(zhì)比較強(qiáng)的網(wǎng)站,都是有高級(jí)的防爬措施的??偟膩碚f有兩種反爬策略,要么驗(yàn)證身份,把蟲子踩死在門口...
閱讀 4598·2021-09-10 11:22
閱讀 547·2019-08-30 11:17
閱讀 2580·2019-08-30 11:03
閱讀 441·2019-08-29 11:18
閱讀 3469·2019-08-28 17:59
閱讀 3229·2019-08-26 13:40
閱讀 3178·2019-08-26 10:29
閱讀 1152·2019-08-26 10:14