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格式,有想法的同学可以自行拼接成合适的格式,再进行一些拓展的利用嘿嘿嘿。

 

 

 

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

 

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 非同构无向图(同形同构)

    题目链接:http://codeforces.com/problemset/problem/103/B大意:判断图的形状是否为一个章鱼型(?)由几棵树构成,树的根节点围成一个环。思路:只需判断一棵树内加一个环即可。判断方法:边数==顶点数&&连通图#include#definemem(s,t)memset(s,t,sizeof(s))

    2022年4月13日
    217
  • 线程池面试题一般会怎么问?线程池面试题总结及答案整理

    线程池面试题一般会怎么问?线程池面试题总结及答案整理对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。一、线程池是什么?答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。二、线程池有几种?答:常见的线程池有四种。newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超过处理需要,

    2022年5月5日
    46
  • 长春python编程培训学校

    长春python编程培训学校近年来,教育部频频下发相关政策,强调编程教育的重要性,探究编程教育发展的新方式。从政策出台的趋势看,编程教育列入基础教育的趋势越来越大。在今年(2020年),教育部及各个省市又都下发了什么政策我们正好借着这个机会来盘点一下2020年各地编程教育政策汇总2020年2月教育部教育部公布了《2019年度普通高等学校本科专业备案和审批结果》,确定通过人工智能专业审批的高校达到180所。2020年4月四川四川省教育厅发布《关于加强初中学业水平考试命…

    2022年5月16日
    42
  • 现代的新语言–Swift初探

    现代的新语言–Swift初探

    2021年12月1日
    41
  • linux将一个文件夹的内容复制到另一个文件夹_linux复制文件夹命令

    linux将一个文件夹的内容复制到另一个文件夹_linux复制文件夹命令1.前言本文主要讲解Linux系统如何使用命令行工具把文件复制到另一个文件夹或者目录。2.cp命令的选项和功能copy命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大。语法:cp[选项]源文件或目录目标文件或目录说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。该命令的各选项含义如下:-a该选项通常在拷贝目录…

    2022年8月23日
    4
  • 电容触摸屏GT911、GT928、GT9147的使用

    电容触摸屏GT911、GT928、GT9147的使用一、介绍与硬件连接GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片,他们支持的触控点数不同(GT928支持10个点、GT911支持5个点)、驱动和感应通道也可能不同。可是他们的寄存器和IIC通讯时序是相同的,也就是说驱动程序是兼容的。与主机的接口共有6PIN,分别为:VDD、GND、SCL、SDA、INT、RESET。INT、RESET…

    2022年6月29日
    137

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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