基于NodeJs的爬虫

使用NodeJS+Cheerio实现网络爬虫 1.安装 node.js 下载网址 https://nodejs.org/en/ 找到下载好的安装文件,双击开始安装 如果安装完成,默认情况下是安装在系统盘的Program Files目录下的: 我们可以打开命令行窗口测试一下能否正常运行node 安装Node的同时已经默然安装了我们后面需要的npm工具,我们也可以查看一下npm的版本: 到这里,我们就可以确认已经正常的... 阅读详情

参考博客:手把手教你做爬虫—基于NodeJs
第一个nodejs爬虫:爬取豆瓣电影图片

引入模块

1.node 必须安装
2.http模块、fs模块都是内置的包,不需要额外添加
cheerio包,request包和async包,需要用npm或cnpm安装

cheerio包:是一个有着jQuery类似语法的文档解析模块,可以简单理解为nodejs中的jQuery。
async包:是一个异步流程控制模块用来控制并发,因为很多网站都有并发连接数量的限制,所以当请求发送太快的时候会导致返回值为空或报错。更有甚者,有些网站可能因为你发出的并发连接数量过多而当你是在恶意请求,封掉你的ip。

cnpm i cheerio -S
cnpm i request -S
cnpm i async -S

代码

创建index.js

var http = require('https'); //使用https模块(内置的包)
var fs = require('fs');//文件读写内置的包
var cheerio = require('cheerio');//jquery写法获取所得页面dom元素(须安装)
var request = require('request');//发送request请求(须安装)
var async = require('async');//控制并发(须安装)
var i = 0;
var url = "https://movie.douban.com/subject/1889243/?from=subject-page";
//判断data是否存在,创建data文件夹存储文本
fs.exists("./data", function (exists) {
    if (exists) {
        console.log("data目录存在")
    } else {
        console.log("data目录不存在")
        fs.mkdir('./data/', function (err) {
            if (err) {
                return console.error(err);
            }
            console.log("data目录创建成功。");
        });
    }
});
//判断image是否存在,不存在就创建image文件夹存储图片
fs.exists("./image", function (exists) {
    if (exists) {
        console.log("image目录存在")
    } else {
        console.log("image目录不存在")
        fs.mkdir('./image/', function (err) {
            if (err) {
                return console.error(err);
            }
            console.log("image目录创建成功。");
        });
    }
});

fetchPage(url); //主程序开始运行

//初始url 
function fetchPage(x) { //封装一层函数,方便递归调用
    startRequest(x);
}

function startRequest(x) {
    //采用http模块向服务器发起一次get请求      
    http.get(x, function (res) { //get到x网址,成功执行回调函数
        var html = ''; //用来存储请求网页的整个html内容
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function (chunk) {
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function () {
            var $ = cheerio.load(html); //采用cheerio模块解析html
            var news_item = {
                //获取电影的标题
                title: $('.related-info h2 i').text().trim(),
                //i是用来判断获取页数
                i: i = i + 1,
            };

            console.log(news_item); //打印新闻信息
            var news_title = $('.related-info h2 i').text().trim();

            savedContent($, news_title); //存储每篇文章的内容及文章标题

            savedImg($, news_title); //存储每篇文章的图片及图片标题

            //下一篇电影的url
            nextLink = $(".recommendations-bd dl:last-child dd a").attr('href');
            if (i < 10) { //爬取10页
                fetchPage(nextLink);
            }
        });
    }).on('error', function (err) { //http模块的on data,on end ,on error事件
        console.log(err);
    });

}
//存储每篇文章的内容
function savedContent($, news_title) {
    var text = '';
    $('#link-report span').each(function (index, item) {
        text += $(this).text();
        text += '\n';
    })
    //将新闻文本内容一段一段添加到/data文件夹下,并用新闻的标题来命名文件
    fs.appendFile('./data/' + news_title + Math.random() + '.txt', text, 'utf-8', function (err) {
        if (err) {
            console.log(err);
        }
    });
}
//储所爬取到的图片资源
function savedImg($, news_title) {
    var fileName = './image/' + news_title + Math.random() + '/';
    var imgList = []; // 存储下载图片列表
    fs.mkdir(fileName, function (err) {
        if (err) {
            return console.error(err);
        }
        console.log("目录创建成功。");
    });
    $('#recommendations img').each(function (index, item) {
        var img_title = $(this).text().trim(); //获取图片的标题
        if (img_title.length > 35 || img_title == "") { //图片标题太长
            img_title = "图片";
        }
        var img_filename = img_title + Math.random() + '.jpg';
        var img_src = $(this).attr('src'); //获取图片的url
        imgList.push({
            img_title: img_title,
            img_filename: img_filename,
            img_src: img_src
        });
    });
    //并发请求一次发送五个
    async.mapLimit(imgList, 5, function (obj, callback) {
        //采用request模块,向服务器发起一次请求,获取图片资源
        request.head(obj.img_src, function (err, res, body) {
            if (err) {
                console.log(err);
            }
            request(obj.img_src).pipe(fs.createWriteStream(fileName + obj.news_title + '---' + obj.img_filename));
            //通过流的方式,把图片写到本地/image目录下,并用标题和图片的标题作为图片的名称。
            callback(null);
        });
    }, function (err, result) {
        if (err) {
            console.log(err);
        } else {
            // console.log(result);<=会输出一个有2万多个“successful”字符串的数组
            console.log("全部已下载完毕!");
        }
    });
}

运行

node index.js

结果

在这里插入图片描述
在这里插入图片描述

福利(获取妹子图片)

var http = require('https'); //使用https模块
var fs = require('fs');//文件读写
var cheerio = require('cheerio');//jquery写法获取所得页面dom元素
var request = require('request');//发送request请求
var url = "https://www.nanrentu.cc/mntp/swmn.html";
//判断image是否存在,不存在就创建image文件夹存储图片
fs.exists("./image", function (exists) {
    if (exists) {
        console.log("image目录存在")
    } else {
        console.log("image目录不存在")
        fs.mkdir('./image/', function (err) {
            if (err) {
                return console.error(err);
            }
            console.log("image目录创建成功。");
        });
    }
});

startRequest(url); //主程序开始运行

function startRequest(x) {
    //采用http模块向服务器发起一次get请求      
    http.get(x, function (res) { //get到x网址,成功执行回调函数
        var html = ''; //用来存储请求网页的整个html内容
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function (chunk) {
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function () {
            var $ = cheerio.load(html); //采用cheerio模块解析html
            //把跳转页面的图片的跳转地址取出来,传到详情页面
            $('.h-piclist li').each(function (index, item) {
                if (index < 10) {
                    var url = $(this).find('a').attr('href');
                    var text = $(this).find('p').text();
                    console.log(text);
                    var path = './image/' + text + Math.random() + '/';
                    fs.mkdir(path, function (err) {
                        if (err) {
                            return console.error(err);
                        }
                    });
                    enterPage(url, path);
                }
            });
        });

    }).on('error', function (err) { //http模块的on data,on end ,on error事件
        console.log(err);
    });
}
//进入详情页
function enterPage(x, path) {
    //采用http模块向服务器发起一次get请求     
    http.get(x, function (res) { //get到x网址,成功执行回调函数
        var html = ''; //用来存储请求网页的整个html内容
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function (chunk) {
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function () {
            var $ = cheerio.load(html); //采用cheerio模块解析html
            savedImg($, path); //存储每篇文章的图片及图片标题
            var flag = false;
            //获取下一页的地址,然后递归跳转
            $('.page li').each(function (index, item) {
                if ($(this).find('a').text() === '下一页') {
                    flag = true;
                    url = $(this).find('a').attr('href');
                }
            });
            if (flag) {
                enterPage('https://www.nanrentu.cc' + url, path);
            }
        });

    }).on('error', function (err) { //http模块的on data,on end ,on error事件
        console.log(err);
    });
}
//存储所爬取到的图片资源
function savedImg($, path) {
    $('.info-pic-list img').each(function (index, item) {
        var img_title = $(this).attr('alt'); //获取图片的标题
        var img_filename = img_title + Math.random() + '.jpg';
        var img_src = $(this).attr('src'); //获取图片的url
        console.log(img_src);
        //采用request模块,向服务器发起一次请求,获取图片资源
        request.head(img_src, function (err, res, body) {
            if (err) {
                console.log(err);
            }
        });
        request(img_src).pipe(fs.createWriteStream(path + img_filename));
        //通过流的方式,把图片写到本地/image目录下,并用标题和图片的标题作为图片的名称。
    })
}
用NodeJS实现一个网络爬虫小应用-爬取博客园首页文章列表 前言   网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。   我们可以使用网络爬虫对数据信息进行自动采集,比如应用于搜索引擎中对站点进行爬取收录,应用于数据分析与挖掘中对数据进行采集,应用于金融分析中对金融数据进行采集,除此之外,还可以将网络爬... 阅读详情

相关推荐

网络爬虫nodejs爬虫代理配置

随着互联网的发展进步,现在互联网上也有许多网络爬虫。网络爬虫通过自己爬虫程序向目标网站采集相关数据信息。当然互联网的网站会有反爬策略。比如某电商网站就会限制一个用户IP的访问频率,从而出现验证码。就算验证码通过了,也不会采集到数据,这也就是所谓的反爬虫策略。所以这种情况下,越来越多的网络爬虫会利用代理IP去进行采集。目标网站限制了一个IP,可以换一个代理IP继续进行业务采集。当然每个人的爬虫程序不同,使用爬虫代理用法也不同。 互联网也有常见的爬虫代理使用方式: 1、传统的API提取的优质代理(传统API提取

Laicaling的博客 1269

cheerio 库学习(一)

cheerio ​ 这个库是特别为服务器端实现的一个快速敏捷的Jquery核心库。 安装 npm install cheerio --save 特点 熟悉的语法:它的实现是基于Jquery的核心库。它从Jquery库中移除了所有DOM的冲突和令人不爽的浏览器的东西。 迅速:它始终工作在一个持续的单一的DOM模型中。对于语法解析,手动操纵和渲染都是异常地迅速。以后端-后端的标准进行测试,结果发...

豆破苍琼 2447

网络爬虫,使用NodeJs抓取RSS新闻

提供RSS服务的站点超级多,百度、网易、新浪、虎嗅网 等等站点,基于java c++ php的rss抓取网上很多,今天说说NodeJs抓取RSS信息, 使用NodeJs做网络爬虫,抓取RSS新闻。各站点编码格式不一样 GBK,UTF-8,ISO8859-1等等,所以需要进行编码,对国人来说UTF-8是最酷的。抓取多站点,然后保存到数据库,充分利用javascript异步编程的特点,抓取速度超级快呀。

Full Stack 1万+

Node爬虫(二):使用cheerio爬取表情包

cheerio 官方在线文档 简介 cheerio是nodejs的抓取页面模块,为服务器特别定制的,快速、灵活、实施的jQuery核心实现。适合各种Web爬虫程序 安装 npm install cheerio 使用 1、载入html字符串 const cheerio = require('cheerio'); const $ = cheerio.load('<ul id="fruits">...</ul>'); 2、选择器 Cheerio的选择器实现与jQuery的选择器实现几乎

weixin_41897680的博客 1119

[Nodejs] Nodejs实现新闻爬虫及展示网站

文章目录1. `Node.js`爬取新闻网站1.1 用正则表达式判断新闻页面1.2 网易新闻页面结构分析2. 将爬取的信息存储于`mysql`数据库中.2.1 `Mysql`操作2.2 `Nodejs`操作3.利用`Nodejs`框架`Express`搭建基础的查询网站.3.1 `Express`框架生成搜索网站脚手架4 利用`css`, `html`, `js`等前端技术对网站进行功能扩充和美化.前端设计4.1 网站查询框美化4.2 网站图标网站`logo`4.3 网站导航栏4.4 网站图标展示栏4.5

handsomeer的博客 1582

AI赚钱新思路 利用RPA+KIMI实现小红书全自动制作发布(详细攻略)

我已经事先准备好了文案素材,现在就利用Kimi的智能,根据我们已有的文案来创作出新的文案吧。之前我写过一篇关于【:一个戴着用百元大钞制成的简约头饰的少女,她坐在小车里,手里拿着一叠港元,整个画面洋溢着现实主义动漫风格和治愈系的温暖气息。通过这篇文章,我们已经一步步地完成了小红书治愈系文案的创作、治愈系图片的生成,以及笔记的发布,实现了整个流程的自动化。不慌不忙,快乐常在 在繁忙的日常中,给自己的心灵留一片净土,感受内心深处的平静与安宁。接下来,我将展示如何使用影刀来编写自动化脚本,以生成治愈系的图文图片。

weixin_42172073的博客 3690

使用node第三方包爬虫

node.js爬虫cheerio包 const http = require('http') const https = require('https') const url = require('url') const cheerio = require('cheerio')//引入第三方包cheerio function filterData(data){ const $ = cheerio.load(data)//jquery语法 $('p').each((i,el)=>{ conso

KindomJ的博客 227

【可穿戴算法开发】-PPG信号检测方法

文章目录一、PPG(光电容积脉搏波法)信号的检测原理二.PPG技术目前存在的问题(挑战)三. **心电信号产生的原理** 随着经济的发展,在人们生活水平提高的同时,高脂肪摄入和低运动量成为了人们普遍的生活模式,近年来高血压、高血脂已经发展为危险性最高的病症。心电、血压、血氧等生理参数是预防和分析心血管疾病的重要生理参数。 常用的心电测量仪器有:多导ECG心电图仪、PPG心率检测器、心率带等; 常...

wxq_1993的博客 2万+

2024年最新手把手教你做爬虫---基于NodeJs_nodejs爬虫,绝对干货分享

好久没更新博客了,内疚感十足,趁着北京今儿天气格外的蓝,我觉得我得干点什么,于是乎,卷起袖子,整理一下最近做爬虫的那些事儿。

2401_85013863的博客 1638

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

SAP固定资产原值与净值取值逻辑全解析:从数据表到ABAP实战

在企业资源计划(ERP)系统中,固定资产的价值管理是财务会计的核心模块,其关键在于准确核算资产原值与净值。从技术原理上看,这涉及对资产全生命周期业务(如购置、折旧、转移、报废)的财务建模,以及底层数据表(如ANLC、ANEP)的精准关联与计算。掌握这一逻辑的技术价值在于,能够确保财务报表数据的准确性,满足合规性要求,并为管理决策提供可靠依据。在SAP ECC或S/4HANA系统的应用场景中,ABAP开发者与财务顾问常需通过编写报表程序,从复杂的数据结构中提取资产价值信息。本文聚焦于SAP资产会计模块,深入剖

weixin_30984001的博客 393

通读Cheerio文档

前言 cheerio是一款非常实用的nodejs第三方包,适用于服务端(nodejs端)处理html。它有着与jquery及其相似(几乎是一致)的api,速度飞快,使用灵活,而且不仅能够处理html,同样也能处理xml。 本文主要的参考文档就是cheerio的官方文档,基本上就是它的翻译。 APIs cheerio文档的api我将其分为以下几个方面,包括 加载(loading) 选...

weixin_34075268的博客 248

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 531

NodeJs网络爬虫集:一网打尽知乎、豆瓣、拉勾等网站数据

NodeJs网络爬虫集:一网打尽知乎、豆瓣、拉勾等网站数据 1. 项目基础介绍与编程语言 本项目是一个开源的NodeJs网络爬虫集,由qieguo2016创建并维护。该项目集合了多个针对不同网站的爬虫脚本,包括知乎、豆瓣、拉勾等,旨在帮助开发者快速获取这些网站上所需的数据。主要使用的编程语言是JavaScript,同时也包含了一些HTML、CSS和Batchfile代码。 2. 项目的核心功能 ...

gitblog_00027的博客 974

【异常】Milvus 向量数据库字段缺失错误分析与解决 MilvusVectorStoreServiceV2 - Failed to insert batch [0-1]: The field:

本文分析了Milvus向量数据库插入操作中出现的字段缺失错误。错误显示age_mode字段未提供,导致批量插入失败。根本原因是Milvus Schema要求所有定义字段必须存在,但代码中对部分字段采用条件添加方式。解决方案是将条件添加改为始终添加,为可能为null的字段提供空字符串默认值。文章总结了Schema约束、防御性编程等经验,并建议通过Schema变更检查、单元测试覆盖和数据校验层等预防措施避免类似问题。该问题影响product、mac、source等多个字段,修改后确保了数据插入的可靠性。

奶爸的编程之路,也就一周冷个三天 407

2023华为od机试【最小循环子数组】C++

2023华为od机试【最小循环子数组】C++ 给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。

MISAYAONE的博客 2185

前端之使用NodeJS+Cheerio实现网络爬虫图解

图解使用NodeJS+Cheerio实现网络爬虫来进行数据爬取使用。

琅枫的博客 1994

AI大模型探索之路-训练篇3:大语言模型全景解读

大规模语言模型(Large Language Models,LLM),也称大语言模型或大型语言模型,是一种由包含数百亿以上参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标注文本进行训练。

寻道AI,探索AI无限可能! 6278

nodejs爬虫与python爬虫_爬虫知多少-(NodeJS 爬虫)

不久前在公司做了一个关于爬虫的分享,简单介绍了网络爬虫的基础知识、爬虫的运作方式、抓取策略、攻防方式以及如何使用 NodeJS 进行爬虫开发, 在这里分享给各位同学分享一下~一、爬虫简介二、爬虫的运作方式三、抓取策略(1)深度优先搜索(2)广度优先搜索四、爬虫攻防之爬虫与反爬虫1、校验用户户请求的Headers反爬虫策略:对Headers的User-Agent进行检测对Referer进行检测应对方...

weixin_39611047的博客 391

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

nodejs 实现网络爬虫技术

## nodejs 制作网络爬虫,实现爬取浙江农林大学官网的新闻 ## 由于最近一直在研究nodejs ,所以便萌生了制作网络爬虫的想法,本人是浙农林的一个学生,自然便将官网当作是一个实验对象,那么话不多说,直接入正题: 首先我们需要预装 nodejs,下载地址为https://nodejs.org/en/download/ 。本人采取用的ide为webstorm,让我们打开终端,

qq_33171875的博客 626

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

nodeJS写一个简单的网络爬虫

将工作做完,中午趁着休息时间用node做了一个简单的网络爬虫,将一个网站的图片下载至本地计算机中,以下是全部代码,代码不够完善,如果有想拿去玩玩的可以copy后完善一下。 /* node实现网络爬虫 原理: 1.发起请求 2.获取目标网站的所有url地址 3.逐个请求图片url 4.获取请求数据 5.将图片存到硬盘 */ const fs = require("fs"); const...

逍遥生的博客 653

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

nodejs爬虫与php爬虫,使用NodeJS编写爬虫示例

本篇文章主要给大家讲解了一下用NodeJS学习爬虫,并通过爬糗事百科来讲解用法和效果,一起学习下吧。1.前言分析往常都是利用 Python/.NET 语言实现爬虫,然现在作为一名前端开发人员,自然需要熟练 NodeJS。下面利用 NodeJS 语言实现一个糗事百科的爬虫。另外,本文使用的部分代码是 es6 语法。实现该爬虫所需要的依赖库如下。request: 利用 get 或者 post 等方法获...

weixin_42108778的博客 226

NodeJS网络爬虫

原文地址:NodeJS网络爬虫 网上有很多其他语言平台版本的网络爬虫,比如Python,Java。那怎么能少得了我们无所不能的javascript呢

weixin_30641999的博客 121

网络爬虫 Nodejs

最近学Nodejs时候,就做了一个简单的网络爬虫来练下手,就是提取如下图博客主页的10条最新评论, 要抓取网页信息首先要获取博客主页的HTML信息,使用http.get(options[, callback])方法获取信息,代码如下: http.get(url,function(res){ var html='' res.on('data',function(data){ htm

LTG01的博客 1138

NodeJs 是否适合开发网络爬虫

场景下优势明显,适合中小型爬虫或需要快速迭代的原型。如果项目需要将爬虫集成到全栈 JavaScript 应用中(如配合 Express 提供 API,或使用 TypeScript 增强代码质量),Node.js 能保持技术栈统一,降低维护成本。对于需要同时抓取数百甚至数千个页面的场景(如监控价格、聚合数据),Node.js 可以通过异步编程(如。相比 Python 的 Scrapy 框架(内置去重、调度、扩展机制),Node.js 缺乏同等成熟的“一站式”爬虫框架,更多需要自行组装工具链。

xianyinnm的博客 1711

NodeJS简单爬虫

NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1、该网站的页面呈现出一定的规律 2、使用NodeJS的request模块发起请求 3、对获取到的数据进行处理 4、使用NodeJS的fs模块将数据写入文件 源码说明 //声明需要的模块 var request = require('request');...

failte的博客 352
上一篇: 推荐几个jquery实用的插件
下一篇: git Bash 命令行大全
haogemr
博客等级 码龄9年 71粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值