JS简易爬虫(一)——爬取接口数据

139 阅读4分钟

引言

事情发生在一个清静的午后,我无意之中打开了很久之前写的uniapp的项目,打开后页面出奇的难看,熟练的按下F12,果然,曾经的公共接口已经不能用了,因为是练手,当时的后端接口都是别人服务器上的,如果地址更改了,那么我的前端部分也就接近报废了,于是我尝试着,找到备用接口地址,将接口中的数据等,都爬取到本地,然后再参照相应的数据结构,写出对应的本地接口。

我不知道,我这种爬取数据的方式到底属不属于是爬虫的范畴,印象中,大学时的爬虫基本都是使用python来完成的,当时还有什么伪造请求头等等,哈哈,不过我的目的很简单,就是爬取接口数据到本地即可,我就姑且称其为简易爬虫吧,由于自己是前端出身,所以后端语言的话,还是node更熟悉一点,所以接下来的演示都是基于node开始的,不喜勿喷喔~

爬虫介绍

什么是爬虫?

顾名思义,爬虫,在可行区域内爬动,而互联网中的爬虫,就抽象为在网页中,爬取网页的每个部分,然后提取有用的信息或者数据,一句话概括,就是爬取被允许网页中的数据信息。

爬虫的作用?

  1. 数据采集: 从互联网中采集大量的数据,用于分析或者科研。
  2. 搜索引擎: 爬虫也是搜索引擎的基础,负责收集和更新网页信息。
  3. 监控网络情况: 对网站进行持续的监控,检测网站的正常运行情况,比如网站是否宕机,新内容的更新等。
  4. 电商价格监控: 获取各个电商网站的价格数据进行分析,从而进行价格监控。
  5. . . .

爬虫的原理

爬虫的工作方式类似于我们正常浏览网页。当爬虫载入一个起始网址URL时,会跳转到对应的网站,将其内容按照特定的规则爬取下来,如果这个页面中有其他的URL,爬虫就会打开新的URL,然后一直重复这个过程。

写爬虫的步骤

  1. 确定目标:确定想要爬取的网站以及需要获取的数据。
  2. 分析网站结构:了解目标网站的页面结构,包括HTML结构、CSS选择器、JavaScript动态加载等。
  3. 发起HTTP请求:使用编程语言中的HTTP库发送请求,如Python中的Requests库,Node中HTTP模块等。
  4. 解析网页:使用HTML解析库,解析网页内容,提取所需数据。
  5. 处理数据:对于提取到的数据进行清洗和处理,例如去除HTML标签、格式化数据等。
  6. 存储数据:将处理后的数据存储到合适的数据存储介质中,如数据库、CSV文件或Excel表格等。
  7. 循环处理:如果需要获取多个页面的数据,可以设置循环遍历,自动处理多个页面。
  8. 添加延迟:为了避免对目标网站造成过大负担,可添加适当的延迟,如设置请求间隔时间等。
  9. 错误处理:应对网络异常,添加错误捕获和处理机制

爬虫的注意事项

一定要注意,爬取的内容,是否被允许,否则可能会面临违法的风险!!!

  • 好爬虫:搜索引擎,如谷歌,百度等等,这种的爬虫的目的是,在特定时间内,扫描和收集优秀的网页,供大家查阅,也是我们说的SEO。
  • 坏爬虫:抢票,抢优惠券等系统,重复不停的模仿真人操作、爬取,让真人难以抢到票等。

接口爬取

首先下载axios

npm i axios

然后引入需要的模块和库

// 发请求
const axios = require('axios');
// 文件读写
const fs = require('fs');

接口爬取

// 目标数据接口的URL
const url = 'https://xxx.cn/api/public/shop/shopList';
// 发起请求
axios.get(url).then(response => {
    // 确保HTTP状态码为200,这表示请求是成功的
    if(response.status === 200) {
        // 获取接口数据
        const data = response.data;
        
        // 将数据转换为字符串
        const dataString = JSON.stringify(data, null, 2);
        
        // 写入到本地文件
        fs.writeFile('data.json', dataString, err => {
            if(err) {
                console.error(err);
            } else {
                console.log('爬取成功');
            }
        });
    }
}).catch(error => {
    console.error('ERROR', error);
});

爬取结果

image.png