资讯专栏INFORMATION COLUMN

不再羡慕python,nodejs爬虫撸起袖子就是干,爬取宅男女神网大姐姐的高清图片!

rubyshen / 2297人阅读

摘要:年前无心工作,上班刷知乎发现一篇分享爬虫的文章。另外携带的数据是用来告诉服务器当前请求是从哪个页面请求过来的。

年前无心工作,上班刷知乎发现一篇分享python爬虫的文章。

感觉他爬取的网站里的妹子都好好看哦,超喜欢这里的,里面个个都是美女。

无小意丶:自我发掘爬虫实战1:宅男女神网妹子图片批量抓取,分类保存到本地和MongoDB数据库

无奈python虽然入门过但太久没用早已荒废,最近在用nodejs重构后台接口,遂尝试用nodejs实现个爬虫。

先上几张图:

爬几个相册示范一下

都是高清无码大图哦

好了,开始准备工作吧,少年!

喂!我说的是准备工作环境!你,你,还有你,你们把手上的纸巾放下!

准备工作:

系统环境:mac (作为一个前端,应该不用我解释了吧?)
运行环境:node (作为一个前端,应该不用我解释了吧??)
所需模块:request-promise、cheerio、fs
编辑器:vscode (谁用谁知道)

简单了解一下这几个nodejs的模块:

request-promise----Node.js的一个网络请求模块,使用超简单:

   var request = require("request-promise");
    request("http://www.google.com")
    .then(function (htmlString) {
    console.log(htmlString)
    })
    .catch(function (err) {
    });

任何响应都可以输出到文件流:

request("http://google.com/doodle.png").pipe(
  fs.createWriteStream("doodle.png")
)

cheerio----为服务器特别定制的,快速、灵活、实施的jQuery核心实现:

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 文件系统

可以创建目录,创建文件,读取文件等。

网页分析:

分析目标网站的相册网页地址
因为python文章的作者已经很详细的分析了网站,所以我就简单分析一下。

随便打开几个相册,可以看到都是这样的规则:

"https://www.****.com/g/****/"

所以我们就可以确定要爬取的基本url:

const base_url = "https://www.****.com/g/";//爬取相册网页的基本网址

然后再看几乎每个相册底部都有页码,而我们要抓取的是整个相册,所以就要考虑分页的情况,点开分页,我们看到分页的url是这样的:

"https://www.****.com/g/****/*.html"


业务逻辑:

实战代码:

app.js 轮询及代码结构

const nvshens = require("./co");
const base_url = "https://www.nvshens.com/g/";//爬取相册网页的基本网址

let index = 1;
let start = 25380;
const end = 30000;

const main = async (URL) => {
  //1.请求网址
  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.请求下一个网址
      main(base_url + start);
    } else {
      console.log(`${base_url}${end}所有页面已完成`)
    }
  }
};

main(base_url + start);

co.js //业务代码

var request = require("request-promise"); //网络请求
const cheerio = require("cheerio");//操作dom
const fs = require("fs");//读写文件

const headers = {
  "Referer": "https://www.nvshens.com/g/24656/"
}
//因为一些网站在解决盗链问题时是根据Referer的值来判断的,所以在请求头上添加Referer属性就好(可以填爬取网站的地址)。
//另外Referer携带的数据 是用来告诉服务器当前请求是从哪个页面请求过来的。

const basePath = "/Users/用户名/Desktop/mm/";
//自定义mac本地下载目录,需预先创建,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();
      //创建相册
      if (!fs.existsSync(downloadPath)) {
        fs.mkdirSync(downloadPath);
        console.log(`${downloadPath}文件夹创建成功`)
      }
      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

几个函数就可以实现,是不是很简单呢?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107301.html

相关文章

  • 首次公开,整理12年积累博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 所见即所得,实现一个有趣动画效果

    摘要:每一个方格就是数组的一个个体。收工完成效果因为我实在是不想找那么多图片,大概只拷贝了十份,然后乘以,所以会出现一个头像重复三次的情况源码。 我看到了什么 在看淘宝前端团队的博客的时候,无意中点进了关于我们这个页面,其中有个动画我觉得很有趣,也很通用,感觉在哪里都可以使用一样,效果如下图所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...

    xuxueli 评论0 收藏0
  • 所见即所得,实现一个有趣动画效果

    摘要:每一个方格就是数组的一个个体。收工完成效果因为我实在是不想找那么多图片,大概只拷贝了十份,然后乘以,所以会出现一个头像重复三次的情况源码。 我看到了什么 在看淘宝前端团队的博客的时候,无意中点进了关于我们这个页面,其中有个动画我觉得很有趣,也很通用,感觉在哪里都可以使用一样,效果如下图所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...

    fyber 评论0 收藏0
  • Python 从零开始爬虫(五)——初遇json&爬取某宝商品信息

    摘要:能看到这里说明快进入动态网页爬取了,在这之前还有一两个知识点要了解,就如本文要讲的及其数据提取是什么是轻量级的文本数据交换格式,符合的格式的字符串叫字符串,其格式就像中字符串化后的字典,有时字典中还杂着列表字典,但是里面的数据都被双引号包着   能看到这里说明快进入动态网页爬取了,在这之前还有一两个知识点要了解,就如本文要讲的json及其数据提取 JSON 是什么   json是轻量级...

    2bdenny 评论0 收藏0
  • Python爬虫入门教程 2-100 妹子图网站爬取

    摘要:为了写好爬虫,我们需要准备一个火狐浏览器,还需要准备抓包工具,抓包工具,我使用的是自带的,加上,这两款软件的安装和使用,建议你还是学习一下,后面我们应该会用到。 妹子图网站----前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情。希望可以做好。 为了写好爬虫,我们需要准备一个火狐浏览器,还需...

    zqhxuyuan 评论0 收藏0

发表评论

0条评论

rubyshen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<