8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

本文讲的是利用nodejs以及相关库,爬取JRS爆照区内的爆照贴,并保存相关数据到本地。依赖选择constsuperagent=require(‘superagent’);//nodejs里一个非常方便的客户端请求代理模块constcheerio=require(‘cheerio’);//Node.js版的jQueryconstasync=r…

大家好,又见面了,我是你们的朋友全栈君。

本文讲的是利用nodejs以及相关库,爬取JRS爆照区内的爆照贴,并保存相关数据到本地。

 

 

依赖选择

const superagent = require('superagent');  
//nodejs里一个非常方便的客户端请求代理模块
const cheerio = require('cheerio'); 
//Node.js 版的jQuery
const async = require('async'); 

const fs = require('fs');
//fs操作IO
const url = require('url');
//url模块

 

 

初步准备

既然是要爬取网站内容,那我们就应该先去看看网站的基本构成

选取的是BXJ作为目标网站,想要去爬取爆照区的前5页的帖子里的数据

 

分析页面

要爬取前5个分页的内容,就要先找到分页的规律

先进入自行查看分页规律

爆照区第一页

爆照区第二页

爆照区第三页

可以看出,页面都是以  https://bbs.hupu.com/selfie-  加上1/2/3/4/5 作为分页

找到了分页规律,继续去第一页找帖子入口

页面结构如下:

8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

 

可以看到,每个class为titlelink下的第一个a标签元素是帖子的路径

再进入到帖子内部

8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

 

可以发现相关数据都是有对应的关系的,以下我总结一下

标题:bbs-hd-h1>h1

头像:headpic:first-child>img

用户ID:j_u

正文图片:quote-content>p>img

ok,有了以上这些信息,可以开工了。

 

开始编码

const superagent = require('superagent');
const cheerio = require('cheerio');
const async = require('async');
const fs = require('fs');
const url = require('url');
const request =require('request');
const hupuUrl = 'https://bbs.hupu.com/selfie-1';

let ssr = [];
let allUrl = [];
let curCount = 0;

for (let i = 1; i <= 4; i++) {
    hupuUrl2 = 'https://bbs.hupu.com/selfie-' + i;
//for循环把五页的页面循环出来
    superagent.get(hupuUrl2)
//通过superagent去请求每一页
        .end(function (err, res) {
            if (err) {
                return console.error(err);
            }
//cheerio  nodejs版的JQ 
            let $ = cheerio.load(res.text);
//获取首页所有的链接
            $('.titlelink>a:first-child').each(function (idx, element) {
                let $element = $(element);
                let href = url.resolve(hupuUrl2, $element.attr('href'));
                allUrl.push(href);
                curCount++;
//获取到此url,异步进行以下操作,此操作为进入到这个帖子中爬取数据
                superagent.get(href)
                    .end(function (err, res) {
                        if(err){
                            return console.error(err);
                        }
                        let $ = cheerio.load(res.text);
                        let add = href;
                        let title = $('.bbs-hd-h1>h1').attr('data-title');//帖子标题
                        let tximg = $('.headpic:first-child>img').attr('src');//用户头像
                        let txname = $('.j_u:first-child').attr('uname');//用户ID
                        let contentimg1 = $('.quote-content>p:nth-child(1)>img').attr('src');//爆照图1
                        let contentimg2 = $('.quote-content>p:nth-child(2)>img').attr('src');//爆照图2
                        let contentimg3 = $('.quote-content>p:nth-child(3)>img').attr('src');//爆照图3
                        ssr.push({
                            'tx': tximg,
                            'name': txname,
                            'pic': contentimg1,contentimg2,contentimg3
                        });
//把数据存储到一个对象里
                        let stad = {
                            "address": add,
                            "title":title,
                            "ID" : txname,
                            "touxiang" : tximg,
                            "pic1" : contentimg1,
                            "pic2" : contentimg2,
                            "pic3" : contentimg3
                        };
                        let picArr = [contentimg1,contentimg2,contentimg3];
                        //console.log(stad);
//通过fs模块把数据写入本地json
                        fs.appendFile('data/result1.json', JSON.stringify(stad) ,'utf-8', function (err) {
                            if(err) throw new Error("appendFile failed...");
                            //console.log("数据写入success...");
                        });
//定义一个以title为文件夹名的路径,作为以后下载图片时使用
                        let lujin = 'data/' + title + '/';
//判断文件夹是否存在
                        fs.exists('data/111',function (exists) {
                            if(!exists){
                                fs.mkdir("data/111", function(err) {
                                    if (err) {
                                        throw err;
                                    }
                                    async.mapSeries(picArr,function(item, callback){
                                        setTimeout(function(){
//downloadPic方法下载图片
                                            downloadPic(item, 'data/'+ (new Date()).getTime() +'.jpg');
                                            callback(null, item);
                                        },400);
                                    }, function(err, results){});
                                });
                                console.log('ye')
                            }else {
                                console.log('er')
                            }
                        })
                    })
            });
        });
}

完成

(以上代码整洁性非常差,随手写下,欢迎大神滋醒)

 

最终效果

8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

 

看一下存储的json对象

8分钟完成NodeJs爬虫,把JRS小姐姐全部看个遍

{
  "address": "https://bbs.hupu.com/21728753.html",
  "title": "一位老阿姨硬是活成小萝莉",
  "ID": "跪舔男神",
  "touxiang": "https://i1.hoopchina.com.cn/user/112/215256735735112/215256735735112-1521510126.jpg@45h_45w_2e",
  "pic1": "https://i1.hoopchina.com.cn/hupuapp/bbs/112/215256735735112/thread_215256735735112_20180320093735_s_208585_o_h_1280px_w_720px1663636189.jpeg?x-oss-process=image/resize,w_800/format,webp",
  "pic2": "https://i1.hoopchina.com.cn/hupuapp/bbs/112/215256735735112/thread_215256735735112_20180320093759_s_165873_o_h_1280px_w_720px886916407.jpeg?x-oss-process=image/resize,w_800/format,webp",
  "pic3": "https://i1.hoopchina.com.cn/hupuapp/bbs/112/215256735735112/thread_215256735735112_20180320093821_s_418960_o_h_1800px_w_1350px1812779326.jpeg?x-oss-process=image/resize,w_800/format,webp"
},
{
  "address": "https://bbs.hupu.com/21851823.html",
  "title": "我这女票什么水平",
  "ID": "simdnn",
  "touxiang": "https://i3.hoopchina.com.cn/user/397/85978131436397/85978131436397-1522686391.jpg@45h_45w_2e",
  "pic2": "https://i1.hoopchina.com.cn/hupuapp/bbs/397/85978131436397/thread_85978131436397_20180403115414_s_234115_h_1280px_w_960px584136217.jpeg?x-oss-process=image/resize,w_800/format,webp",
  "pic3": "https://i1.hoopchina.com.cn/hupuapp/bbs/397/85978131436397/thread_85978131436397_20180403115415_s_275233_h_1280px_w_960px1095493159.jpeg?x-oss-process=image/resize,w_800/format,webp"
},
{
  "address": "https://bbs.hupu.com/21839377.html",
  "title": "婊里婊气惹人爱,毕业答辩来临之际,踏青放松",
  "ID": "干宝儿",
  "touxiang": "https://i1.hoopchina.com.cn/user/157/172535625820157/172535625820157-1522652123.jpg@45h_45w_2e"
},
{
  "address": "https://bbs.hupu.com/21843345.html",
  "title": "不知不觉儿子已经9个月了",
  "ID": "55475662",
  "touxiang": "https://i1.hoopchina.com.cn/user/283/16832283/16832283_small_1.jpg",
  "pic1": "https://i1.hoopchina.com.cn/hupuapp/bbs/548/5527135742548/thread_5527135742548_20180402114924_s_274665_o_h_1080px_w_1080px1680465497.jpeg?x-oss-process=image/resize,w_800/format,webp",
  "pic2": "https://i1.hoopchina.com.cn/hupuapp/bbs/548/5527135742548/thread_5527135742548_20180402114935_s_479392_o_h_1080px_w_1080px1877442272.jpeg?x-oss-process=image/resize,w_800/format,webp",
  "pic3": "https://i1.hoopchina.com.cn/hupuapp/bbs/548/5527135742548/thread_5527135742548_20180402114924_s_176443_o_h_800px_w_600px1088551107.jpeg?x-oss-process=image/resize,w_800/format,webp"
},
{
  "address": "https://bbs.hupu.com/21847465.html",
  "title": "手下留情,有两分吗?",
  "ID": "科比之后蜜库里",
  "touxiang": "https://i1.hoopchina.com.cn/user/681/32949681/32949681-1510592138.jpg",
  "pic2": "https://i1.hoopchina.com.cn/hupuapp/bbs/689/60341568799689/thread_60341568799689_20180402203722_s_362569_h_1333px_w_1000px2077096544.jpeg?x-oss-process=image/resize,w_800/format,webp"
}

部分摘选

图片大多是webp格式的

 

其实存储下来也不是json格式,有想法的同学可以自行拼接成合适的格式,再进行一些拓展的利用嘿嘿嘿。

 

 

 

本文仅为了学习交流,请勿进行一些非法或不道德的操作。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127216.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 阿里云服务器中了挖矿程序应该如何清除「建议收藏」

    阿里云服务器中了挖矿程序应该如何清除「建议收藏」阿里云服务器中了挖矿程序如何处理?云安全中心安全告警短信提醒云服务器中了挖矿程序怎么处理?护云盾来详细说下阿里云服务器挖矿程序的解决方法,一种是使用云安全中心自动处理,另一种方式是自行手动清除。阿里云服务器挖矿程序解决方法如果你的阿里云服务器中了挖矿程序,你有两种处理方式,一种是使用云安全中心自动清理,另一种是手动清除:云安全中心处理挖矿程序1、登录到云安全中心控制台2、左侧栏,选择“威胁检测”–“安全告警处理”在安全告警处理列表中,找到挖矿程序,然后点“处理”云安全中心安

  • 中文按字母排序_怎么按首字母顺序排

    中文按字母排序_怎么按首字母顺序排        项目中用到前端排序,自己写了一个实现,给大家分享一下。      存在的问题:很多时候是用汉字的首拼来比较,但汉字转拼音在前端实现是个问题,主要表现在两个地方1、字符库里的数据量没有覆盖所有汉字,2、多音字问题(注:这里都是说简体汉字)。      实现思路:1、从网上找了一个汉字转拼音的库,能转大部分汉字(多音字也没处理);2、写一个字符比较的函数;3、调用Array里的…

    2022年10月12日
  • NVIDIA Jetson TX1介绍(一)

    NVIDIA Jetson TX1介绍(一)NVIDIAJetsonTX1概述NVIDIAJetsonTX1是计算机视觉系统的SoM(system-on-module)解决方案。它组合了最新的NVIDIAMaxwellGPU架构,其具有ARMCortex-A57MPCore(Quad-Core)CPU族,实现性能与电源功耗的最大优化,满足下一代产品的工业视觉计算的要求。JetsonTX1SoM设计满足低功耗环境…

  • ideaIU-2022.01.4 激活码-激活码分享2022.03.13

    (ideaIU-2022.01.4 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 模型矩阵、视图矩阵、投影矩阵

    模型矩阵、视图矩阵、投影矩阵模型视图投影矩阵的作用,就是将顶点从局部坐标系转化到规范立方体(CanonicalViewVolnme)中。总而言之,模型视图投影矩阵=投影矩阵×视图矩阵×模型矩阵,模型矩阵将顶点从局部坐标系转化到世界坐标系中,视图矩阵将顶点从世界坐标系转化到视图坐标系下,而投影矩阵将顶点从视图坐标系转化到规范立方体中。如下图所示,假设现在要将三维空间中的三角形渲染到屏幕上。三角形的模型文件中,顶点坐标是…

  • 运维架构

    运维架构运维架构1、运维团队配置运维团队分为:应用运维、系统运维、运维开发、监控运维、DBA团队和安全团队团队分工:应用运维:负责支持线上业务,各自会负责对应的业务线,主要职能是保证线上业务稳定性和同开发共

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号