node.js爬取网站数据【dom方式】

news/2024/5/19 13:47:56/文章来源:https://blog.csdn.net/weixin_43101443/article/details/115299727

node.js爬取网站数据

  • 提醒:示例网站代码已失效[ 应用逻辑有效 ]
  • 第一步:准备工作;
    • 1. 选择目标地址URL;
    • 2. 确保 node.js 环境;
    • 3. CMd命令 :创建项目文件夹 ;
    • 4. CMd窗口 :调用 npm init 来初始化 生成 package.json ;
    • 5. CMd窗口 : 安装所需依赖包 cheerio 、superagent 及nodejs 中的 fs 文件模块;
      • (1)superagent 包 定义:
      • (1)cheerio 包 定义:
  • 第二步: 编写代码;
    • 1. 引入依赖包;
    • 2. 声明目标网址的url;
    • 3. superagent 发送网络请求,下载Demo;
    • 4 . 分析目标网站Dom结构,定位所需数据位置;
    • 5 . 用 cheerio 的 load 方法进行包装请求后的响应体;
    • 6 . 数据写入 json 文件;
  • 第三步:执行一次test.js,爬取一次热门列表数据;
  • 拓展 : 添加定时任务,定时爬取数据 【基于 node-schedule 包】;
    • 1 . 安装node-schedule;
    • 2 . node-schedule代码中的用法;
  • 完整版:node.js 定时爬虫抓取数据;


提醒:示例网站代码已失效[ 应用逻辑有效 ]

示例网站已添加反爬处理,superagent部分仅获取到包含js跳转功能的部分html,非完整页面html;

针对未添加反爬处理的网站,本文逻辑依旧有效


第一步:准备工作;



1. 选择目标地址URL;

URL: https://s.weibo.com/top/summary?cate=realtimehot ;


2. 确保 node.js 环境;

node.js下载\安装


3. CMd命令 :创建项目文件夹 ;


mkdir antd-course
cd antd-course



4. CMd窗口 :调用 npm init 来初始化 生成 package.json ;


npm init -y  // -y命令代表yes, 省略默认选项点击



5. CMd窗口 : 安装所需依赖包 cheerio 、superagent 及nodejs 中的 fs 文件模块;

npm i cheerio superagent -D



(1)superagent 包 定义:

一个轻量级、渐进式的请求库,内部依赖 nodejs 原生的请求 api,适用于 nodejs 环境;


(1)cheerio 包 定义:

nodejs 的抓取页面模块,为服务器特别定制的,快速、灵活、实施的 jQuery 核心实现;
适合各种 Web 爬虫程序。node.js 版的 jQuery ;




第二步: 编写代码;

1. 引入依赖包;

创建test.js文件

const cheerio = require("cheerio");
const superagent = require("superagent");
const fs = require("fs");



2. 声明目标网址的url;

const weiboURL = "https://s.weibo.com";  // 域名
const hotSearchURL = weiboURL + "/top/summary?cate=realtimehot";  // 路径



3. superagent 发送网络请求,下载Demo;

(1)参数:2 个;(请求的 url ,请求成功后的回调函数);
(2)回调函数参数:2个;(error 【成功,则返回 null,反之则抛出错误】, 成功后的 响应体);

# hotSearchURL :请求的Url;
# err : 回调函数第一参数[ 成功,则返回 null,反之则抛出错误 ];
# res : 请求的响应体;
superagent.get(hotSearchURL, (err, res) => {if (err) console.error(err);
});



4 . 分析目标网站Dom结构,定位所需数据位置;

如图:
第12条为例


5 . 用 cheerio 的 load 方法进行包装请求后的响应体;

【作用】:达成 nodejs 中,可以写 jQuery 语法的效果;

// 包装请求后的响应体 ;
const $ = cheerio.load(res.text);  
let hotList = [];
$("#pl_top_realtimehot table tbody tr").each(function (index) {// 拼接数组元素;if (index !== 0) {const $td = $(this).children().eq(1);const link = weiboURL + $td.find("a").attr("href");const text = $td.find("a").text();const hotValue = $td.find("span").text();const icon = $td.find("img").attr("src")? "https:" + $td.find("img").attr("src"): "";// 元素push进数组;hotList.push({index,link,text,hotValue,icon,});}
});



6 . 数据写入 json 文件;

fs.writeFileSync(file, data[, options]).

 // node.js文件模块fs;
fs.writeFileSync('qq.json',JSON.stringify(hotList),"utf-8"
);




第三步:执行一次test.js,爬取一次热门列表数据;

node test.js

结果:
打开生成的qq.json文件可见, 爬取成功;

爬取数据成功




拓展 : 添加定时任务,定时爬取数据 【基于 node-schedule 包】;

schedule 的git地址.

1 . 安装node-schedule;

npm i node-schedule 



2 . node-schedule代码中的用法;

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
// 分割线: 上方为对应使用规则 ;
const nodeSchedule = require("node-schedule");
const rule = "30 * * * * *"; // 30秒刷新一次,输出时间点;
nodeSchedule .scheduleJob(rule, () => {console.log(new Date());
});




完整版:node.js 定时爬虫抓取数据;

包含知识点:async、await 异步内容;.

const cheerio = require("cheerio");
const superagent = require("superagent");
const fs = require("fs");
const nodeSchedule = require("node-schedule");
const weiboURL = "https://s.weibo.com";
const hotSearchURL = weiboURL + "/top/summary?cate=realtimehot";
// 封装单词抓取数据函数为async 函数,返回Promise对象,;
function getHotSearchList() {return new Promise((resolve, reject) => {superagent.get(hotSearchURL, (err, res) => {if (err) reject("request error");const $ = cheerio.load(res.text);let hotList = [];$("#pl_top_realtimehot table tbody tr").each(function (index) {if (index !== 0) {const $td = $(this).children().eq(1);const link = weiboURL + $td.find("a").attr("href");const text = $td.find("a").text();const hotValue = $td.find("span").text();const icon = $td.find("img").attr("src")? "https:" + $td.find("img").attr("src"): "";hotList.push({index,link,text,hotValue,icon,});}});hotList.length ? resolve(hotList) : reject("errer");});});
}// 利用node包“ nodeSchedule” 每隔30秒,执行async函数;
nodeSchedule.scheduleJob("30 * * * * *", async function () {
// 捕捉错误try {const hotList = await getHotSearchList(); // 阻塞代码,直到拿到resolve的值,此处即 hotList;await fs.writeFileSync(`app.json`,JSON.stringify(hotList),"utf-8");} catch (error) {console.error(error);}
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_851489.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【技术贴】VS2005不能新建项目不能新建网站。提示Microsoft visual studio

出现这种现象的原因就是你是用了注册表垃圾清除软件,不用怀疑了,你肯定经常清理垃圾。 解决办法很简单,重装系统,重装vs2005,或者换成vs2008,2010也行。切记,千万别再清理注册表垃圾。不然你会死…

【技术贴】VS2005不能新建项目不能新建网站。提示Microsoft visual studio

出现这种现象的原因就是你是用了注册表垃圾清除软件,不用怀疑了,你肯定经常清理垃圾。 解决办法很简单,重装系统,重装vs2005,或者换成vs2008,2010也行。切记,千万别再清理注册表垃圾。不然你会死…

【转】极品免费网站空间申请:000webhost.com免费1.5G美国空间PHP+MySQL

极品免费网站空间:000webhost.com免费1.5G美国空间PHPMySQLFiled Under: 未分类 by rainlin2010四.22, 2010 www.000webhost.com是国外著名空间商Hosting24旗下的一个产品,号称“比收费虚拟主机更好用”,而确实如其所说的,该空间非常优质和稳…

20个专业在线配色网站分享

摘自http://www.websbook.com/yuanli/20gzyzxpswzfx_17814.html 现在专门用于配色的在线网站真不少,之前一片文章已经总结了18个配色网站,这次推荐的这20个配色网站也十分出色,而且网站本身的设计也十分精美,网页设计师可以参考使…

【技术贴】网站首页浏览量统计代码,适合.NET||网页浏览量计数器代码

【.NET】独家发布网页首页浏览量计数器,目前网上木有我这么简单的 设计的思路就是在本地路径下放一个txt存放初始值,然后每次刷新首页之后让.net去访问这个txt文件读取这个初始值并累加之后再写入这个文件,(这样以后就能读取到总…

足球比赛集锦的在线网站

rel"File-List" href"file:///D:%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">www.partofthegame.tv Carlsberg web-tv,是嘉士伯最近提供的一个服务,在Partofthegame.tv上,是提供足球(football&#xf…

微信PC端打开网站页面空白

重点 : 微信pc端的浏览器是IE内核,所以你懂的(PS:IE问题贼多) 解决 : 直接把链接丢到IE上,F12查看控制台,出现什么错误解决什么错误 , so

来自微软官方网站Windows Sysinternals的小工具Process Explorer(进程浏览器)

先上地址:https://docs.microsoft.com/zh-cn/sysinternals/ 当前网页如下:Sysinternals网站由Mark Russinovich于1996年创建,主持其先进的系统实用程序和技术信息。 无论您是IT专业人员还是开发人员,您都可以找到Sysinternals实用…

每日一记:发现一个Oracle大牛(Suresh Gandhi)的网站

今天搜索问题的过程中,无意间看到了一个Oracle大牛的网站,特意拿出来分享给大家! 地址:http://db.geeksinsight.com/

高性能网站性能优化

一、LiveJournal发展历程 LiveJournal是99年始于校园中的项目,几个人出于爱好做了这样一个应用,以实现以下功能: 博客,论坛 社会性网络,找到朋友 聚合,把朋友的文章聚合在一起 LiveJournal采用了大量的开源…

JAVA中 如何访问https链接的网站或者接口

在日常开发中,我们访问的链接接口一般都是http,但是现在为了数据在传输过程中的安全,很多网站或者接口都升级为https,那么我们以前的接口如何在改动不大的情况下也能够支持呢?本篇主要讲解JAVA如何在https下应用访问接…

牛腩新闻发布系统总结——网站发布和分页制作

牛腩新闻发布系统的视频看了将近半个月的时间,今天成功地把它发布了,哈哈。第一次看教学视频看得这么专注,都不带走思的,很不错。给小牛老师赞一个,嘿嘿! 言归正传,每学完一个阶段,最…

【SSO】——使用CAS实现二级域名不同的网站的单点登录(二)

回顾 上一篇文章中,实现了二级域名相同的网站的单点登录的效果。但是利用上篇文章的方式不能满足诸如:www.blog.com和www.news.com这样二级域名不同的网站的单点登录。 问题出在哪呢?就是当访问一个网站把Cookie存放到某个地方之后&#xff…

很多门户网站中常见的既可以在页面呈现内容,又可以节省空间的HTML代码。

很多门户网站中常见的既可以在页面呈现内容&#xff0c;又可以节省空间的代码。<html><head><script language"javascript">function changBg(obj,id){ objUlobj.parentNode.parentNode; listA objUl.getElementsByTagName("A"); for(…

Bing(必应)搜索引擎可以查询IP上的其他网站

这个小功能涉及到一个SEO问题&#xff1a;搜索引擎是否从IP上遍历、抓取此IP上的其他网站&#xff1f; 据我所知&#xff0c;搜索引擎是否从IP上遍历其他网站一直没有一个官方的文档&#xff01;但SEO们的假象和测试&#xff0c;得出的结论是&#xff1a;搜索引擎会从IP上遍历其…

javaweb应用网站实现第三方QQ登入过程

腾讯开发文档入口 今天实现了web应用第三方QQ登入&#xff0c;由于我当时只看了开发文档中实现登入的流程&#xff0c;没有看SDK中的demo&#xff0c;所以SDK中的工具我没有用到。其实只要知道流程&#xff0c;完全可以不借助它的SDK也能实现第三方登入。当然&#xff0c;既然…

开发中一些简单好用的网站(珍藏)

百度地图开放平台 可以实现在自己的网页上添加各种地图&#xff0c;不论是地铁图、公交图、热力图&#xff0c;都可以。 网址http://lbsyun.baidu.com/ 阿里妈妈矢量图标库 在想要一些特定的图标&#xff0c;可以直接搜索&#xff0c;可以设置图标颜色&#xff0c;图标大小 网址…

Springboot+Maven+Mysql+EasuUI+freemarker制作的一个简单的高校后台管理网站

1.技术 开发工具:STS 数据库&#xff1a;MYSQL 框架Springboot加Mybatis 前端模板引擎&#xff1a;Freemarker 依赖管理&#xff1a;Maven 前端界面模板&#xff1a;EasyUI 数据库连接池&#xff1a;使用Druid连接池 统一配置登录拦截器 权限管理 管理员可以查看所有教师信息&a…

齐博V7精品课程培训网站模板

模板名称&#xff1a;精品课程培训网站 程序内核&#xff1a;齐博V7 模板内容&#xff1a;首页、文章列表内容、下载列表内容、视频列表内容 模板制作&#xff1a;奋斗的十二 技术支持&#xff1a;http://www.e553.com 完成时间&#xff1a;2012年7月 使用说明&#xff1a; 1 …

带给你设计灵感的30个超棒的暗色系网站设计

日期&#xff1a;2012-8-4 来源&#xff1a;GBin1.com 暗色系的网站设计能够让你的访问者产生炫酷和神秘的感觉。我们GBin1也使用了暗色系的风格。在今天的这套网站设计实例展示中&#xff0c;我们将收集30个超棒的暗色系的网站设计&#xff0c;希望大家喜欢&#xff01; 1. T…