Node.js实现简单爬虫 讲解

article/2025/10/11 5:01:05

一、什么是爬虫

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

  • 搜索引擎
  • 今日头条/网易新闻
  • .抢票软件
    • 最终都指向的是 12306
  • 比价网
  • ·淘宝
  • 京东
  • 拼多多

在生活中网络爬虫经常出现,搜索引擎就离不开网络爬虫。例如,百度搜索引擎的爬虫名字叫作百度蜘蛛(Baiduspider)。百度蜘蛛,是百度搜索引擎的一个自动程序。它每天都会在海量的互联网信息中进行爬取,收集并整理互联网上的网页、图片视频等信息。当用户在百度搜索引擎中输入对应的关键词时,百度将从收集的网络信息中找出相关的内容,按照一定的顺序将信息展现给用户。

二、接口抓取

如果网站提供了接口,那么就直接请求获取接口得到数据

// 请求获取接口数据// 前端发请求:
//   XMLHttpRequest:axios
//   Fetch// Node.js 发请求
// tcp  模块,最麻烦
// http 模块,
// const http = require('http')
// http.request()
// 为了方便,也有一些封装好的第三方库:request、axios
// axios 既可以在浏览器使用也可以在 Node 中使用
// 1. 都是 JavaScript
// 2. 在不同的平台做了适配,浏览器:XMLHttpRequest,Node:httpconst axios = require('axios')axios({url: 'https://blackhole-m.m.jd.com/getinfo',method: 'POST',// params: {}, // 查询参数data: {appname: 'jdwebm_pv',jdkey: '',isJdApp: false,jmafinger: '',whwswswws: 'eQY7noLwJFCJEuiO9SCt4Tw',businness: 'ProDetail',body: {sid: '80ff0fd789ec316ae0c222d686a51c2d',squence: '4',create_time: '1647001099375',shshshfpa: 'b0271365-4825-0def-83a7-9c6dc52c94a6-1647001029',ecflag: 'e',whwswswws: 'eQY7noLwJFCJEuiO9SCt4Tw',jdkey: '',isJdApp: false,jmafinger: '',browser_info: '23b8dc51f2f5538686ab08c97bf506a4',page_name: 'https://item.jd.com/100016777690.html',page_param: '',cookie_pin: '',msdk_version: '2.4.4',wid: '',pv_referer: 'https://list.jd.com/',lan: 'zh-CN',scrh: 864,scrah: 816,scrw: 1536,scaw: 1536,oscpu: '',platf: 'Win32',pros: '20030107',temp: 33,hll: false,hlr: false,hlo: false,hlb: false}} // 请求体数据// headers: {} // 请求头
}).then(res => {console.log(res.data)
})

三、网页抓取

一些安全性比较高的网站会设置反爬虫,一般会校验请求头user-agent字段,判断请求来源(当然不全是)

const axios = require('axios')
const fs = require('fs')
const cheerio = require('cheerio') // 类似jq,在node环境下操作domconst getPage = async () => {const { data } = await axios.get('https://item.jd.com/100016777690.html', {headers: {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36'}})return data// data 是什么?字符串// fs.writeFileSync('jd.html', data)// console.log('抓取网页成功')
}// const main = async () => {
//   // const pageData = await getPage()
//   const $ = cheerio.load(`
//     <!DOCTYPE html>
//     <html lang="en">
//     <head>
//       <meta charset="UTF-8" />
//       <meta http-equiv="X-UA-Compatible" content="IE=edge" />
//       <meta name="viewport" content="width=device-width, initial-scale=1.0" />
//       <title>Document</title>
//     </head>
//     <body>
//       <h1>hello</h1>
//       <p id="p1" foo="bar">我是 p1</p>
//       <p id="p2">我是 p2</p>
//       <p id="p3">我是 p3</p>
//     </body>
//     </html>
//   `)
//   console.log($('#p1').text())
//   console.log($('#p1').attr('foo'))
//   console.log($('#p2').text())
//   $('#p1').addClass('abc')
//   console.log($.html())
// }const main = async () => {const pageData = await getPage()const $ = cheerio.load(pageData)console.log(`标题:${$('.sku-name').text().trim()}价格:${$('.price').text().trim()}`)
}main()

四、puppeteer

puppeteer是chrome团队开发的一个node库,可以通过api来控制浏览器的行为(模拟浏览器),比如点击、跳转、刷新,在控制台执行javascript脚本等。通过这个工具可以用来处理爬虫、制动签到、网页截图、生成pdf、自动化测试等。

const puppeteer = require('puppeteer');(async () => {// 1. 打开浏览器const browser = await puppeteer.launch()// 2. 新建一个标签页const page = await browser.newPage()// 3. 输入地址敲回车await page.goto('https://item.jd.com/100016777690.html')// 4. 操作://    对加载完毕的网页进行截图await page.screenshot({ path: '100016777690.png' })// 5. 关闭浏览器await browser.close()
})()

在这里插入图片描述

五、抓取文章

const cheerio = require('cheerio')
const axios = require('axios')
const url = require('url')
const fs = require('fs')const request = axios.create({baseURL: 'https://cnodejs.org/' // 基础路径
})const getLastPage = async () => {const { data } = await request({method: 'GET',url: '/',params: { // tab=all&page=1tab: 'all',page: 1}})const $ = cheerio.load(data)const paginations = $('.pagination a')const lastPageHref = paginations.eq(paginations.length - 1).attr('href')const { query } = url.parse(lastPageHref, true)return query.page
}// 需求:获取 cnodejs.org 网站所有的文章列表(文章标题、发布时间、文章内容)
//      并且将该数据存储到数据库中// 获取所有文章列表
const getArticles = async () => {const lastPage = await getLastPage()const links = []for (let page = 1; page <= lastPage; page++) {const { data } = await request({method: 'GET',url: '/',params: { // tab=all&page=1tab: 'all',page}})const $ = cheerio.load(data)$('.topic_title').each((index, element) => {const item = $(element) // 转换为 $ 元素links.push(item.attr('href'))})// 每次抓取完一页的数据就等待一段时间,太快容易被发现await new Promise(resolve => {setTimeout(resolve, 500)})console.log(links.length)}return links
}// 获取文章内容
const getArticleContent = async (url) => {const { data } = await request({method: 'GET',url})const $ = cheerio.load(data)const title = $('.topic_full_title').text().trim()const changes = $('.changes span')const date = changes.eq(0).text().trim()const author = changes.eq(1).find('a').text().trim()const content = $('.markdown-text').html()return {title,author,date,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.author}
发布日期:${article.date}
文章内容:${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)})
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/l8RcAONO.shtml

相关文章

爬虫攻略(一)

互联网 Web 就是一个巨大无比的数据库&#xff0c;但是这个数据库没有一个像 SQL 语言可以直接获取里面的数据&#xff0c;因为更多时候 Web 是供肉眼阅读和操作的。如果要让机器在 Web 取得数据&#xff0c;那往往就是我们所说的“爬虫”了。现在项目需要&#xff0c;所以研究…

javascript爬虫

用js爬虫&#xff0c;使用到nodejs 例子中爬取的是中国新闻网时政频道的最新10条新闻的title和链接 事先准备&#xff1a; 1、先去node官网下载安装一下 2、推荐vs code&#xff0c;需要通过终端下载插件&#xff0c;不想的话用cmd小黑框做终端&#xff0c;记事本写代码也行…

用js写个爬虫

如何用js完成爬虫项目 前言一、node.js的安装二、mysql的安装三、确定爬取网页四、查看分析网页源码五、开始写爬虫npmNode调用mysql定义要访问的网站定义新闻页面里具体的元素的读取方式定义哪些url可以作为新闻页面构造一个模仿浏览器的request读取种子页面解析出种子页面里所…

Docker—容器数据卷

目录 1.什么是容器数据卷 2.数据卷的使用 3.实战MySQL同步数据 4.卷 常用命令 5.匿名挂载与具名挂载 5.1 匿名挂载 5.2 具名挂载 6.数据卷容器 1.什么是容器数据卷 Docker将运用与运行的环境打包形成容器运行&#xff0c; Docker容器产生的数据&#xff0c;如果不通过d…

docker删除已停止的容器

一、docker删除已停止的容器 1、根据容器的状态&#xff0c;删除Exited状态的容器 先停止容器、再删除镜像中的容器、最后删除none的镜像。执行命令如下&#xff1a; docker stop $(docker ps -a | grep "Exited" | awk {print $1 }) #停止容器 docker rm $(docke…

Docker与容器的区别

容器 虚拟机和容器结构主要区别在于中间两层&#xff0c;虚拟机自带了操作系统&#xff0c;这个操作系统可以和宿主机一样&#xff0c;也可以不一样&#xff0c;而容器是和宿主机共享一个操作系统。我们知道&#xff0c;操作系统的内容是很多的&#xff0c;就像我们自己电脑上的…

docker 删除 容器/镜像 方法

docker的删除有两种&#xff0c;一个是rm 删除容器&#xff0c;一个是rmi删除镜像 想要删除运行过的images(镜像) 必须首先删除它的container(容器) 首先查看并找到要删除的镜像 docker images 这里我们要删除hello-world镜像 使用rmi 加 镜像id docker rmi fce289e99eb9 报…

docker多容器操作与强制删除容器的方法步骤

简介&#xff1a; 这是一篇有关【doker的多容器操作和强制删除容器的方法】的文章&#xff0c;用最精简的语言去表达给前端读者们。 1、创建多个容器 在WIndows环境下我们来作这个&#xff0c;先打开三个PowerShell窗口&#xff0c;然后在每个窗口中输入创建容器的命令&#…

Docker删除镜像和容器

一、删除容器 首先需要停止所有的容器&#xff08;只停止单个时把后面的变量改为image id即可&#xff09; docker stop $(docker ps -a -q) 删除所有的容器&#xff08;只删除单个时把后面的变量改为image id即可&#xff09; docker rm $(docker ps -a -q) 二、删除镜像…

如何删除docker镜像与容器

目录 删除示例&#xff1a; 1.查看docker中要删除的镜像 2.删除镜像&#xff0c;使用命令“docker rmi image id” 3.查看docker中正在运行的容器 4.停止容器 5.删除容器 6.查看容器 7.删除镜像 8.最后查看所有镜像 删除示例&#xff1a; 1.查看docker中要删除的镜像 …

docker删除容器日志

废话不多数,看步骤 查看容器日志命令 docker logs -f 容器id 1.进入docker容器目录 cd /var/lib/docker/containers/ 2.查看容器的id&#xff0c;获取容器id&#xff0c;容器id就是容器目录名字 docker ps -a 3.进入容器&#xff0c;删除以.log结尾的文件就是日志文件了&a…

Docker 删除容器

用docker一段时间后&#xff0c;host上可能会有大量已经退出了的容器&#xff0c; 这些容器依然会占用host的文件系统资源&#xff0c;如果确认不会再重启此类容器&#xff0c;可以通过docker rm删除 docker rm一次可以指定多个容器&#xff0c;如果希望批量删除所有已经退出的…

如何优雅地删除Docker镜像和容器(超详细)

一、前言 大家是怎么删除Docker中的镜像和容器的呢&#xff0c;有没有考虑过如何优雅地删除呢&#xff1f;本教程详细指导如何在优雅地删除Docker容器和镜像。如需了解如何在Centos7系统里面安装Docker&#xff0c;可以参考教程【最新Docker在Centos7下安装部署&#xff08;参考…

AirPlay

最近一直在研究苹果的AirPlay协议。真是个好东西&#xff0c;基本上现在可以把任何屏幕内容&#xff0c;包括音频&#xff0c;视频和屏幕投射到支持AirPlay接收的设备上&#xff0c;目前是Apple TV或者AirExpress。 网上资料很少&#xff0c;比较有用的是这个哥们写的一篇AirPl…

aplay amixer用法详解

aplay aplay -t raw -c 1 -f S16_LE -r 8000 test2.pcm -t: type raw表示是PCM -c: channel 1 -f S16_LE: Signed 16bit-width Little-Endian -r: sample rate 8000 PCM是最raw的音频数据&#xff0c;没有任何头信息。WAV文件就是PCM头信息&#xff0c;头信息就是上述的声道…

aplay amixer arecord说明

arecord声音录制 arecord -l列出声卡和数字音频设备 -D参数用于指定音频设备PCM 以hwx,x开头 根据上面l列出的设备,如果选择tvp5158来录制声音的话那么pcm设备就位hw0,0,如果是tlv320aic3x则pcm设备为hw0,1,sii9135则pcm设备为hw0,2。 声卡号,设备号 -r指定采样频率:5512/8000…

【全志T113-S3_100ask】9-音频输入与输出(amixer、aplay、arecord)

【全志T113-S3_100ask】9-音频输入与输出 背景&#xff08;一&#xff09;amixer 的使用&#xff08;二&#xff09;amixer 设置音频输出参数&#xff08;三&#xff09;使用 aplay 播放音乐&#xff08;四&#xff09;使用 arecord 录音 背景 之前查看系统命令&#xff0c;发…

如何使用Aplayer播放器

Aplayer 一、部署 1、Aplayer 官网体验网址&#xff1a;https://aplayer.js.org/ Aplayer的GitHub网址&#xff1a; https://github.com/MoePlayer/APlayer 中文文档手册网址&#xff1a;首页 – APlayer 使用方法很简单&#xff0c;加载Aplayer的js和css&#xff0c;在想…

aplay,arec,amix使用

标准的alsa命令为&#xff0c;aplay&#xff0c;amixer&#xff0c;arecord 如下是高通在mdm9x07芯片上做了客制化的命令 aplay aplay -D hw:0,17 -P &arec arec -D hw:0,17 -P -R 8000 -C 1 &-D card 声卡 -d device 设备 -c channels 通道 -r rate 采样率 -b bits…

Splay

Spaly 众所周知&#xff0c;Splay 是一种平衡二叉查找树&#xff08;不要告诉我你不知道二叉查找树是什么qwq 不知道什么是二叉查找树的看过来&#xff1a; 关于二叉查找树&#xff09;。在这篇东西的最后我们也解释了为什么我们需要用到平衡二叉查找树而不是直接查找&#xff…