node-spider:node实践简单的爬虫

news/2024/7/19 12:38:08 标签: 爬虫, node.js

一、理解

1.1、爬虫:网络爬虫也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。

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

二、待抓取页面分析

2.1、url分页分析

// 第一页地址
https://money.163.com/special/businessnews/
// 第二页地址
https://money.163.com/special/businessnews_02/
// 第三页地址
https://money.163.com/special/businessnews_03/

我们通过页面地址分析,url的分页参数在最后一个字段通过 _02 标记,第一页没有,2-9页,是02-09,超过10 正常展示

2.2、列表分析

2.3、分页器分析

这里展示了全部的页码,我们可以获取到最后一页的页码数,从而抓取到每一页

 2.4、文章详情页分析,找到要抓取的字段,标题,正文

三、实践node爬虫

3.1、创建目录spider

创建目录spider,pnpm init创建package.json

3.2、安装依赖

npm i axios
npm i cheerio

3.3、代码

const cheerio = require('cheerio')
const axios = require('axios')
const url = require('url')
const fs = require('fs')

const request = axios.create({
  baseURL: 'https://money.163.com/' // 网易财经商讯
})

// 获取最后一页的页码数
const getLastPage = async () => {
  const { data } = await request({
    method: 'GET',
    url: '/special/businessnews/', // 新闻列表首页
  })

  const $ = cheerio.load(data)
  const paginations = $('.index_pages a') // 分页区域
  const lastPageHref = paginations.eq(paginations.length - 2).attr('href')
  return Number(lastPageHref.split("/")[4].split("_")[1])
}

// 需求:获取 网易财经商讯网站 所有的文章列表(文章标题、文章内容)并且将该数据存储到数据库中

// 获取所有文章列表
const getArticles = async () => {
  const lastPage = await getLastPage()
  console.log('28', lastPage)
  const links = []
  for (let page = 1; page <= lastPage; page++) {
    let url = "special/businessnews/"
    if(page > 1 && page <= 9){
      url = `special/businessnews_0${page}/`
    } else if(page > 9){
      url = `special/businessnews_${page}/`
    }
    const { data } = await request({
      method: 'GET',
      url: url,
    })
    const $ = cheerio.load(data)
    $('.index_list a').each((index, element) => {
      const item = $(element) // 转换为 $ 元素
      links.push(item.attr('href'))
    })
    // 每次抓取完一页的数据就等待一段时间,太快容易被发现
    await new Promise(resolve => {
      setTimeout(resolve, 1000)
    })
    console.log("links.length", links.length)
  }
  return links
}

// 获取文章内容
const getArticleContent = async (url) => {
  const { data } = await request({
    method: 'GET',
    url
  })
  const $ = cheerio.load(data)
  const title = $('.post_title').text().trim()
  const content = $('.post_body').html()
  return {
    title,
    content
  }
}

const main = async () => {
  // 1. 获取所有文章列表链接
  const articles = await getArticles()
  // 2. 遍历文章列表
  for (let i = 0; i < articles.length; i++) {
    const link = articles[i]
    const article = await getArticleContent(link)
      // 生产环境可以存到数据库里边了
      fs.appendFileSync('./db.txt', `
      标题:${article.title}
      文章内容:${article.content}
      \r\n\r\n\r\n\r\n
    `)
    console.log(`${link} 抓取完成`)
    await wait(500)
  }
}

main()

function wait (time) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve()
    }, time)
  })
}

3.4、执行爬虫

执行node spider.js,数据抓取到db.txt文件,成功。

四、爬虫配置文件

本文仅实现了一个网站列表的抓取,代码全部在一个文件内实现。如果是要抓取多个文件可以把每个网站的结构写在一个json文件内,爬虫读取每个网站的配置文件,从而提高效率。同时可以把开发爬虫和写爬虫配置的工作分开交由不同的人员实现,提高爬虫开发过程的整体效率。

// 配置文件
{
    url: "",
    list: [],
    pagination: {
        max: 20,
    },
    article: {
        title: "",
        author: "",
        time: "",
        content: ""
    }
    ...
}

五、欢迎交流指正,关注我,一起学习。

参考链接:

Node.js实现简单爬虫 讲解_node爬虫_拾荒李的博客-CSDN博客


http://www.niftyadmin.cn/n/217412.html

相关文章

R语言处理数据——janitor包的介绍及使用

janitor功能介绍 janitor可以检查并清理脏数据&#xff0c;适用于R语言用户。主要功能如下&#xff1a; 1、完美格式化数据框的列名&#xff1b; 2、创建并格式化1-3个变量的频率表&#xff0c;可以看作是一个改进的table()函数&#xff1b; 3、提供用于清理和检查数据框的其他…

代码随想录算法训练营第39天| 62.不同路径,63. 不同路径 II

代码随想录算法训练营第39天| 62.不同路径&#xff0c;63. 不同路径 II62.不同路径63. 不同路径 II62.不同路径 题目链接&#xff1a;62.不同路径&#xff0c;难度&#xff1a;中等 【实现代码】 class Solution { public:int uniquePaths(int m, int n) {/*dp[i][j]代表了走…

超详细!腾讯NLP算法岗面经(已offer)

作者 | ZipZou整理 | NewBeeNLP面试锦囊之面经分享系列&#xff0c;持续更新中 可以后台回复"面试"加入交流讨论组噢分享一篇旧文&#xff0c;希望大家都成功上岸~写在前面首先来段简单的自我介绍&#xff1a;2021届硕士&#xff0c;硕士期间未有实习经历&#xff0c…

MATLAB算法实战应用案例精讲-【深度学习】多尺度特征融合-工程应用(论文篇四)

目录 基于多尺度特征融合与残差收缩网络的齿轮箱故障诊断研究 卷积神经网络 2.1 引言

如何免费使用ChatGPT 4?

自从ChatGPT发布以来&#xff0c;它就取得了巨大的成功。无论是常春藤法学考试还是商学院作业&#xff0c;ChatGPT都被用于各种试验。统计数据显示&#xff0c;ChatGPT每月吸引约9600万用户。随着ChatGPT的巨大成功&#xff0c;Open AI最近推出了它的最新版本&#xff0c;名为“…

Android路由ARoute使用

一、先导入ARoute,这里分为两种情况&#xff0c;java和kotlin 在module(或library)中的build.gradle添加如下代码 java配置 android {defaultConfig {//java路由配置javaCompileOptions {annotationProcessorOptions {arguments [AROUTER_MODULE_NAME: project.getName()]}}…

Java基础(五)面向对象编程(基础)

学习面向对象内容的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…

源码解析tomcat回调springmvc servlet init方法的原理

我们知道Springmvc启动时会创建并注册servlet&#xff0c;然后tomcat会扫描并回调servlet的init方法。 那么tomcat是如何回调springmvc生成的servlet的init方法的呢&#xff0c;具体细节和时机呢。 下面首先给出结论&#xff1a;Tomcat是调用自身的StandWrapper的initServlet…