如何用nodejs构造一个网站爬虫

news2024/11/15 17:47:11

爬虫是个什么东西

英文spider,网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫

                                                                                                                           

爬虫能做些什么

你肯定很熟悉股市,也许见到过一些收费网站把股市的变化显现到页面上,并提供收费的对比服务;金融行业的计算机大多是做这个的

他的工作原理就是爬虫收集网页内容,提取加工(比如加入某些线性代数)并重新渲染(可视化)到新的网页上,从而直观地进行预测,

你也许见识过曾经爆火的各种刷单刷屏论,注册多个账号的僵尸粉,

甚至是疫情期间的各个地区的疫情情况大地图,数据不尽相同的原因也是如此,(爬取了主网站,二次渲染数据)

亦或者是各种查询电影票的网站或者app(各种软件的本质在展现给用户的时候都是页面的形式)能准确获取当地电影开场时间票价剩余位置的原因都在这里

爬虫效果

比如这是一个电影网站

我想获取他的电影名,电影分数,电影海报(占用空间大,一般不用区分开)等

那么F12打开开发者控制台,检查我们想查看的部分源代码

得知网页代码中这部分对应这部分标签

继续展开代码标签,这时候我们就知道更具体的对应内容了,其他类似电影展示模块也是如此进行

我们会发现因为代码的严格,很多标签为了规范和后期重构维护都有重复的命名的习惯;

因此我们可以写一个爬虫函数,让它去获取这个页面这些指定的标签内容(可以通过截取数据,或者爬取数据,更高级点就截图识别),之后就交给我们开发小哥们去制作更好的内容吧😶‍🌫️

比如,在分数那里都是move-score命名的变量来存储分数;于是我们就可以利用这点,写一个函数,把这块内容给复制下来

关于node作为中间件解决跨域问题

据说很多大厂在java为后端搭建的程序在进行重构的时候,会采用node作为中间件作为后端;这是由于java所构建的程序多用于中大型程序,这时候改变代码的代价是很大的,所以基本不会对源代码进行修改,如果要加什么功能的话,最好的办法就是模块化添加功能,这符合前端模块化开发;而node本身在浏览器中就担任了小后端的角色,自然可以承担起中间件的角色

什么是跨域

跨域是指在Web浏览器中,一个网页的脚本代码(如JavaScript、Flash、Java等)向其他网站(域)的服务器发出请求,而非当前网页所在的服务器,这样的操作称之为跨域请求。它受到同源策略的限制,需要通过特殊的方法进行处理。

上面是ChatGPT的答案,就我自己的理解来讲,除了跨域这个名词你还需要知道同源策略是什么

什么是同源策略

同源策略是一种Web安全策略,用于限制从一个源加载的文档或脚本如何与来自另一个源的资源交互。它是浏览器实施的一种安全机制,可以防止恶意脚本从跨站点窃取数据、欺骗用户进行操作等安全问题。

举个栗子

我们都知道不论是我们电脑上的pc端软件还是移动端上的app,他都可以读取本地文件(更新游戏,分享小姐姐照片😀,),但是浏览器是做不到的,如果做到了,想想你盘里的小视频在没有被你允许的情况下被传到网上,或是把一个锁屏病毒下载到你的主机里🥲,别问我怎么知道的哈;

有的小伙伴这时候就说,博主,你这说的不准确吧,网页上能下病毒,app和软件里就不行吗🤔?

很棒的问题哈,大概是因为在以前软件还很少的时代,第一是我们还不需要考虑这点,第二是所有软件都经过了互联网筛选这一层屏障了,另外苹果app上线都需要审核,安卓app有利🤫有弊

实现代码

var http = require('http');
// 调用内置模块http
var https = require('https');
var url = require('url');
var cheerio = require('cheerio');
​
// 创建服务器
http
  .createServer((req, res) => {
    var urlobj = url.parse(req.url, true);
    // 内部url模块,url解析地址
    // console.log(urlobj.query.callback)
    res.writeHead(200, {
      'Content-Type': 'application/json;charset=utf-8',
      // cros头,允许数据访问,否认拦截数据,*表示所有网站都能访问,实际生产环境不用这个,类似百度微信api,外连接网站允许使用
      // https://blog.csdn.net/baijiafan/article/details/126501682
      'access-control-allow-origin': '*',
      // 跨域,前端使用反向代理,node使用的时候,提供了CORS跨域处理方案,即为请求头添加access-control-allow-origin
    });
​
    switch (urlobj.pathname) {
      case '/api/aaa':
        // 设置本地3000端口下的api/aaa路径能访问;其余的显示404
        httpget((data) => {
          res.end(spider(data));
        });
        break;
        defalut: res.end('404');
    }
  })
  .listen(3001);
​
// 请求了网站的什么???
function httpget(cb) {
  var data = '';
  https.get('https://i.maoyan.com/', (res) => {
    res.on('data', (chunk) => {
      data += chunk;
    });
    res.on('end', () => {
      console.log(data);
      cb(data);
      // response.end(data)
    });
  });
}
function spider(data) {
  // npm i cheerio
  //  安装个正则表达的包
  let $ = cheerio.load(data);
  let $moviewlist = $('.column.content');
  // console.log($moviewlist)
  let movies = [];
  // 这里设置空数组
  $moviewlist.each((index, value) => {
    movies.push({
      title: $(value).find('.title').text(),
      grade: $(value).find('.grade').text(),
      actor: $(value).find('.actor').text(),
    });
  });
  console.log(movies);
  return JSON.stringify(movies);
}
// 太久没前端了,竟然忘记怎么渲染,光想确实是没什么印象了
​

控制台效果

在网页上简单展示效果

有了这些数据以后我们可以自己写成接口用了,也减少不必要的sql语句

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货分享 | 采购没“云”和有云的区别有哪些?

多年前,提起“云”这个词,很多人还是“不知所云”。 但如今,大众对“云”的了解和认可程度也越来越高,尽情享受着“云”带来的便利。 通过“云”,可以随时随地畅听海量音乐、进行网购、访问云盘的照片和视频、在云端创…

【数据分析】——分析方法

上司要你帮忙看看公司最近的网站运营情况怎么样? 公司最近的网站运营情况?这个问题太宽泛了,你得要知道上司的明确需求 问题1:boss,你是想看看公司网站具体哪方面的问题? 回答:公司最近销售不太好,订单转…

Kubernetes 多集群网络方案系列 1 -- Submariner 介绍

Submariner 是一个完全开源的项目,可以帮助我们在不同的 Kubernetes 集群之间(无论是在本地还是云端)实现网络通信。Submariner 有以下功能: 跨集群的 L3 连接跨集群的服务发现Globalnet 支持 CIDR 重叠提供命令行工具 subctl 简…

MappedByteBuffer 详解(图解+秒懂+史上最全)

背景: 在尼恩视频版本里,从架构师视角,尼恩为大家彻底介绍 rocketmq 高可用、高并发中间件的原理与实操。 给大家底层的解读清楚 rocketmq 架构设计、源码设计、工业级高可用实操,含好多复杂度非常高、又非常核心的概念&#xff…

Python 小型项目大全 11~15

十一、标题党生成器 原文:http://inventwithpython.com/bigbookpython/project11.html 我们的网站需要欺骗人们去看广告!但是想出有创意的原创内容太难了。幸运的是,有了标题党生成器,我们可以让一台计算机产生数百万个令人发指的…

在CentOS 7.5上用离线压缩包安装Python-3.9.10的过程记录

项目的需要,需要在CentOS 7.5上去部署一个Python 3.9.10的安装环境。 值得注意的是在CentOS 7.5系统中,默认安装了 Python 2.7.x。 Python 2.7.x 是许多系统工具和应用程序所依赖的版本,因此它被包括在 CentOS 7.5 发行版中。如果在 CentOS …

太全面了,数据治理8大核心模块建设参考

数据治理是一个去中心化、多元参与的系统工程。一个全面且明确的数据治理体系,可以帮助组织构建生态式、协同化治理路径,最大化地提升整体数据质量,实现数据战略,激活新型生产力。 本文以元数据、数据标准、主数据、数据交换、数…

Mybatis-Plus批量添加或修改数据的三种方式

SpringBoot批量添加或修改数据的三种方式 方式一.Mybatis-plus 提供的 saveOrUpdateBatch 提供的方法 是遍历每一个元素,判断主键是否存在,如果存在则做更新,不存在添加 方式二.分组数据再批量添加或修改 先获取表中所有的主键 &#xff0…

6D姿态检测

3D相机—结构光相机 结构光,英文叫做 Structured light,其原理是基本原理是,通过近红外激光器,将具有一定结构特征的光线投射到被拍摄物体上,再由专门的红外摄像头进行采集。这种具备一定结构的光线,会因被…

如何在TikTok视频描述中提高用户参与度

鑫优尚电子商务:TikTok视频描述(包括话题标签)有150个字符的限制,因此卖家需要合理撰写出有趣且有实际意义的视频描述。可尝试将描述保持在140个字符以内,将最重要的信息放在前面,并通过多次修改文案以排除…

蚂蚁4.11笔试

文章目录前言一、红蓝格子填字母【蚂蚁4.11笔试第三题】解法一:二分解法解法二:模拟二、桌上弹球游戏【蚂蚁4.11笔试第二题】每日一题day82:困于环中的机器人(力扣1041)前言 1、红蓝格子填字母 2、桌上弹球游戏 3、困…

12 个好用且不花钱的网络监控工具

导读要让一个多级机构运行良好而且平稳的话,一个非常艰巨重大的任务就是做好网络管理。每个机构都配备专门的人员,即网络分析师,来进行网络管理。他们 使用了 许多工具来监视网络的运行状况,并查看网络流量的上升和下降状况。他们…

机器学习 03 K-近邻算法

目录 一、K-近邻算法 1.1 K-近邻算法(KNN)概念 1.1.1 概念理解举例 1.2 KNN算法流程总结 1.3 K值的选择 1.3.1 举例说明 1.4 kd树 1.4.1 KD树原理 1.4.2 树的建立 1.5 最近领域的搜索 k近邻算法优缺点 二、距离度量 2.1 距离公式的基本性质 2.2 常见的距离 2.2.…

进程间通信之消息队列

消息队列一. 什么是消息队列二. 消息队列有关函数1.获取key - ftok2.创建消息队列 - msgget3.发送消息 - msgsnd4.接收消息 - msgrcv5.删除消息队列 - msgctl三. 实例注意:一. 什么是消息队列 消息队列独立于发送消息的进程和接收消息的进程,消息队列是消息的链表&…

【牛客刷题专栏】0x19:JZ18 删除链表的节点(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…

GPT-5年底上线?初创公司Runway CEO再爆料:OpenAI员工相信GPT-5有望成AGI

来源: 新智源 微信号:AI-era 最近,Runway CEO关于GPT-5的爆料,又被网友们翻了出来,讨论得热火朝天。不论AGI会在哪一年出现,显然,能见证这一天的人都是幸运的。 最近,又有网友翻出了关于GPT-5的…

初识Linux+Linux基本指令(一)

目录 一.😆计算机与操作系统😆 计算机与操作系统发展史简介: 计算机与操作系统的关系: 二.😄Linux操作系统😄 开源软件的代名词:Linux 非图形化界面的Liunx 三.😆Linux基本指令之文件管理篇😆 1.操…

Spring配置数据源

Spring配置数据源数据源的作用环境准备手动创建c3p0数据源封装抽取关键信息,手动创建c3p0数据源使用Spring容器配置数据源数据源的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完…

网络安全行业现在好混吗,工资水平怎么样?

前段时间看到有人私信:网络安全行业现在好混吗,工资水平怎么样?今天在这里做个回答,不知你所说的“好混吗”指的是什么? 薪资高,待遇好?不加班,活儿少?不受气&#xff0…

我的创作纪念日 - 2048

2048 ✌️ 今天是 2023 年 4 月 10 日,系统说我在 2017 年 08 月 31 日那天发布了第一篇博客(【算法】编写一个能将给定非负整数列表中的数字排列成最大数字的程序),距离当时已经有 2048 天了,2048 这个数字真的很能挑…