一、什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在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)})
}

Node.js实现简单爬虫 讲解相关推荐

  1. node.js 实现简单爬虫批量下载喜马拉雅音频

    前提:最近一直在看node,平时碎觉喜欢听盗墓笔记啥的有声小说,然后突然就就想试着写个爬虫自己下载下来,虽然有点多此一举,但是就当学习练练手了,在这里记录一下! 没有express基础的,请先行了解 ...

  2. Node.js实现简易爬虫

    为什么选择利用node来写爬虫呢?就是因为cheerio这个库,全兼容jQuery语法,熟悉的话用起来真真是爽 依赖选择 cheerio: Node.js 版的jQuery http:封装了一个HTP ...

  3. Node.js实现网络新闻爬虫及搜索功能(一)

    Node.js实现网络新闻爬虫及搜索功能(一) Node.js实现网络新闻爬虫及搜索功能(一) 项目要求 一.爬虫部分 1. 引入相关包 2. 建立数据库连接 3. 爬取并解析网页首页 4. 爬取并解 ...

  4. Node.js实现网络新闻爬虫及搜索功能(四)

    Node.js实现网络新闻爬虫及搜索功能(四) Node.js实现网络新闻爬虫及搜索功能(四) 项目要求 三.搜索网站部分 1. 建立前端网页 2. 建立后端路由 Node.js实现网络新闻爬虫及搜索 ...

  5. Node.js实现网络爬虫

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.必要工具安装 二.爬取前操作 三.爬取新闻数据 四.建立个人网页展示爬取内容 总结 前言 网络爬虫是按照一定规则自 ...

  6. 使用node.js作为简单的Web服务器

    我想运行一个非常简单的HTTP服务器. 对example.com每个GET请求都应该将index.html提供给它,但是作为常规HTML页面(即,与阅读普通网页时相同的体验). 使用下面的代码,我可以 ...

  7. 使用 Node.js 开发简单的脚手架工具

    前言 像我们熟悉的 vue-cli,react-native-cli 等脚手架,只需要输入简单的命令 vue init webpack project,即可快速帮我们生成一个初始项目.在实际工作中,我 ...

  8. node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试

    WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询 (Polling)和Comet技术,Come ...

  9. vue之node.js的简单介绍

    一.什么是node.js? 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 二.安装 1.node.js的特性: - 非阻塞IO模型 - ...

最新文章

  1. 《C++游戏编程入门(第4版)》——2.4 使用带else子句的if语句序列
  2. 如何写一个通用的README规范 1
  3. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章
  4. 安卓程序添加指纹解锁功能
  5. 关于购买企业邮箱,谨防陷入几大误区
  6. 1.5 编程基础之循环控制 20 球弹跳高度的计算
  7. CSS3 多列布局的column-gap 和 column-rule属性
  8. 《上海堡垒》改编电影发布 QQ阅读披露作者江南心声
  9. 将运行时地理数据库(*.geodatabase)复制到文件地理数据库
  10. 两台linux建立GRE隧道
  11. Unity3D笔记 切水果 一
  12. 300字总结计算机flash,Flash学习心得体会范文
  13. 一体化伺服电机与施耐德PLC TM241CEC24T在Canopen协议下的应用
  14. python --爬虫 --下载小说
  15. 如何做一个炫酷的墨水屏电子钟?
  16. Eclipse(二)如何给 eclipse 设置快捷键
  17. QT/C++——主窗口和事件处理
  18. 四川师范大学Java期末_四川师范大学2008-2009第一学期常微分方程期末试题A英文版(含答案)精选.pdf...
  19. 中华英才网张建国:规划人生三级跳(转)
  20. 彻底解剖人民币升值问题 文/岑科

热门文章

  1. ASP在线转flv+所略图+flash在线录制视频
  2. 【Mtk Camera Hal到驱动的流程(1)】
  3. python打印语句_Python 打印语句
  4. C/C++下使用SQLite轻量级数据库
  5. VS2008正版序列号
  6. 坚持长期主义 上汽大众ID.纯电品牌迎来加速发展阶段
  7. 有创业及野心的一定要看
  8. 如何从windows电脑远程iPhone手机?
  9. Android ConstraintLayout 2.1 功能 Carousel
  10. 公众号原来的主体注销了怎么办?