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