决定送你们一套美图。可是授之以鱼不如授之以渔,咱们就来使用node实现个小爬虫去爬取各类美女javascript
来吧,咱们先来看看今天的目标: mmjpg.com的美腿频道下的图片前端
在开始以前先来科普科普java
美腿是形容女性美丽、性感、修长的腿形美。美腿能够分为白璧无瑕的大腿美、晶莹剔透的小腿美、细微的美足、健康明朗的腿形美。所谓腿健美,是指腿部的线条美。腿的长短与肥瘦是决定腿部美丑的两大因素。
下载这个小项目须要使用的库node
npm i superagent cheerio fs-extra --save
这儿咱们用到了superagent
cheerio
fs-extra
这三个库git
使用superagent发起请求并打印出页面内容github
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内容打印到了控制台
如今咱们就须要分析页面结构,而后使用cheerio来操做了,你没用过cheerio没关系它的语法和jQuery基本同样。做为前端,在开发者工具中分析页面应该是屡见不鲜,手到擒来。这儿就很少说了,记住咱们的目标是找出须要的节点获取到有效信息就好npm
咱们能够发现须要的东西都在class
为pic那个div
下的列表中,如今咱们就可使用cheerio来获取bash
... 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 */
在不少时候咱们都须要分析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 }
如今咱们已经能获取到图集的URL了。在上一步咱们获取图集URL的时候是把页码写死了的,这是由于那个页码不是动态的,然而每一个图集的图片页数是不同的,这儿咱们就须要动态判断了。进入图集后,切换图片的页码URL也会跟着变,如今这个URL就是每张图片页面的URL。咱们只须要获取最后一个页面的页码, 从 1 开始历遍,和咱们上面获取的URL拼接在一块儿就是每张图片的页面地址啦!app
获取到单个图片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 } }
如今咱们就来实现下载保存图片的方法,这儿咱们使用了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...
到此这个小爬虫就算写完了,可是这只是一个很简陋的爬虫,还有不少须要改进的地方
你还能够加入不少东西让它更健壮,如:
sleep()
如何让它更健壮、如何应对反爬虫策略这些留着之后再讲吧
你们能够关注个人公众号,一块儿玩耍。有技术干货也有扯淡乱谈,关注回复[888]还有意外惊喜领取
左手代码右手砖,抛砖引玉