![node.js爬虫获取新闻TOP10](https://i-blog.csdnimg.cn/blog_migrate/68cccaa15dba92b629ec3b1234cd485b.png)
前言
随着各种APP和网页的使用的增多,我们查看资讯就需要打开各个APP进行查看,耗时且耗费我们很多精力。很多时候我们想要把数据收集起来,放在自己的系统中进行统一展示输出。数据收集的方法由手工记录,剪贴报,截图,手工复制粘贴等传统方法,这里我们尝试使用 node.js 来对信息进行采集处理成我们需要的格式供我们使用。
确定信息源
每个人按照自己的需要来挑选信息源,这里以本地服务器部署的新闻网站(http://localhost/hotnews
)为例。收集到数据后我们可以做很多很酷的事,譬如每天早上通过微信或邮箱推送我们感兴趣的信息。先通过浏览器打开网页查看页面,找出我们感兴趣的信息,这里以总排行的点击量排行为例。
分析数据来源
- 通过在浏览器按下F12打开开发者工具,切换到Network网络tab面板,然后刷新页面,可以看到这个页面的所有网络请求。
- 点击网络请求后查看Response,探索哪个请求的数据是我们感兴趣的。经过查看发现 GetTopDataList.php 这个请求是我们感兴趣的,这个本地部署的新闻应用是用 php 搭建的。
- 点击 Response 面板左下角的花括号 {} 把返回体进行格式化,这时我们可以看到数据更加易读,进一步方便我们分析数据。
分析结构化数据
把Response 数据复制出来,我们具体分析一下
var all_1_data01 = {
"conf": {
"js_var": "all_1_data01"
},
"data": [{
"id": "6744594",
"title": "最新消息,我是新闻标题",
"media": "宇宙最强媒体",
"author": "记者张三",
"url": "https:\/\/localhost\/w\/2023-03-09\/news10086999.php",
"create_date": "2023-03-09",
"create_time": "07:32:01",
"cat_name": "www_www_all_suda_suda",
"top_time": "20230309",
"top_num": "37,245",
"ext4": "mykfkcf3254354",
"time": "Thu, 09 Mar 2023 07:32:01 +0800"
}],
}
response返回的是一段 js 代码,该代码声明了一个 all_1_data01 对象,对象里面的 data 属性就是我们需要的数据,它是一个包含了排行数据的数组列表,列表里面的每项都是一条新闻数据。我们对数据进行清洗,去除空数据,无效数据和不感兴趣的数据,得到最终存表的结构。
{
"id": "6744594",
"title": "最新消息,我是新闻标题",
"url": "https:\/\/localhost\/w\/2023-03-09\/news10086999.php",
"create_date": "2023-03-09",
"create_time": "07:32:01",
"top_num": "37,245",
"time": "Thu, 09 Mar 2023 07:32:01 +0800"
}
新建爬虫项目
创建项目目录,并安装依赖
$ mkdir node-spider
$ cd node-spider
$ npm init -y
$ npm i axios cheerio promise-mysql -S
新建项目目录和文件,/db/index.js, /db/topNewsDao.js, /index.js
node-spider
|__db
| |__index.js
| |__topNewsDao.js
|__index.js
各文件代码清单
/*
* /db/index.js
* 封装了连接数据库,执行sql查询的方法
*/
const mysql = require('promise-mysql')
const config = {
connectionLimit: 100,
host: 'localhost',
port: 3306,
user: 'root',
password: '123456', // 此处替换为你的mysql密码
database: 'spider',
}
let pool = null
const getPool = async () => {
if (!pool) {
pool = await mysql.createPool(config)
}
}
class DB {
/**
* 执行sql查询数据库
* @param {String} sql sql语句
* @param {String} isSql 是否是sql语句
*/
static async query(