当前位置: 首页 > news >正文

用 Node.js 写一个爬虫

自己设计一个网站,然后去爬取别人家页面的数据来做一个自己的网站。哈哈哈,如果自己写着玩可能没啥事,但如果用这个网站来获利,你可能就要被寄律师函了,毕竟这有点‘刑’。这篇文章呢,就带大家爬取豆瓣TOP250电影的信息。豆瓣电影 Top 250 \(douban.com\)[1]

准备工作

  1. 通过指令npm init初始化文件夹,会获得package.json项目说明书。

  2. 爬虫必备工具:cheerio;通过在终端输入npm i cheerio,即可将文件装到项目里。cheerio 是 jquery 核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对 DOM 进行操作的地方。大家可以简单的理解为用来解析 html 非常方便的工具。

开始(细分七步)

  1. 用https模块(node直接提供给我们的)获取网站地址,通过get方法读取网站地址上的数据。

const https = require('https')
https.get('https://movie.douban.com/top250', function (res) {let html = ''res.on('data', function (chunk) {//console.log(chunk + '');//得到数据流,通过字符串拼接得到html结构html += chunk})

这样会读取到整个页面的html结构。

  1. 通过 res.on('end', function () {}),保证读取完了才会去做操作。

  2. 引入cheerio

const cheerio = require('cheerio')

  1. 获取html中的数据

const $ = cheerio.load(html)$('li .item').each(function () {const title = $('.title', this).text()const star = $('.info .bd .rating_num', this).text()const pic = $('.pic img', this).attr('src')})

这里需要注意的是我们可以去页面上看我们需要拿到哪个类名里面的内容,通过$符号可以拿到内容。

 

 

  1. 创建一个空数组,把数据以对象的形式存放在数组中

let allFiles = []allFiles.push({title: title,star: star,pic: pic})

我们可以通过console.log(allFiles)来检查是否打印出来了我们需要的结果。

  1. 将数据写入文件,引用node官方提供的模块fs

const fs = require('fs')

  1. 创建文件夹files.json,向其中写入数据

fs.writeFile('./files.json', JSON.stringify(allFiles), function (err, data) {if (err) {throw err}console.log('文件保存成功');})

到这之后,我们可以看到在当前文件夹下自动创建了文件files.json,里面已经有了我们想要的数据。

 

完整代码

//引入模块
const https = require('https')
const cheerio = require('cheerio')
const fs = require('fs')
//获取页面的html结构
https.get('https://movie.douban.com/top250', function (res) {let html = ''res.on('data', function (chunk) {//console.log(chunk + '');html += chunk})res.on('end', function () {// 获取html中的数据const $ = cheerio.load(html)let allFiles = []//拿到每一个item中我们需要的数据$('li .item').each(function () {const title = $('.title', this).text()const star = $('.info .bd .rating_num', this).text()const pic = $('.pic img', this).attr('src')//数据以对象的形式存放在数组中allFiles.push({title: title,star: star,pic: pic})})//console.log(allFiles);//将数据写入文件中fs.writeFile('./files.json', JSON.stringify(allFiles), function (err, data) {if (err) {throw err}console.log('文件保存成功');})})
})

 

http://www.lryc.cn/news/270200.html

相关文章:

  • 关于HTTPS
  • 安全配置审计概念、应用场景、常用基线及扫描工具
  • 【计算机毕业设计】python+django数码电子论坛系统设计与实现
  • 最优化方法Python计算:无约束优化应用——神经网络回归模型
  • Spring Data Redis对象缓存序列化问题
  • 自动驾驶代客泊车AVP巡航规划详细设计
  • 亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless
  • Flink on K8S集群搭建及StreamPark平台安装
  • SpringBoot如何优雅的处理免登录接口
  • 元旦档首日票房超4.69亿,“下雪场尴尬”上热搜!
  • CentOS系统中设置IP地址的方式和存在的问题
  • 使用vmware,在ubuntu18.04中使用笔记本的摄像头
  • 中间件系列 - Redis入门到实战(高级篇-分布式缓存)
  • 使用Visual Studio调试VisionPro脚本
  • Ubuntu安装K8S的dashboard(管理页面)
  • zookeeper之集群搭建
  • 从0开始界面设计师 Qt Designer
  • Html / CSS刷题笔记
  • 关于“Python”的核心知识点整理大全51
  • Termius for Mac/Win:一站式终端模拟器、SSH 和 SFTP 客户端软件的卓越选择
  • vr体验馆用什么软件计时计费,如遇到停电软件程序如何恢复时间
  • HTML---JavaScript基础
  • 2023年03月17日_微软和谷歌办公AI的感慨
  • 2023年新一代开发者工具 Vue ,正式开源!
  • springboot(ssm校园组团平台 高校组团系统 Java系统
  • QT 利用开源7z 实现解压各种压缩包,包括进度条和文件名的显示(zip,7z,rar,iso等50多种格式)
  • androidStudio 没有新建flutter工程的入口?
  • 微信小程序开发系列-03全局配置中的“window”和“tabBar”
  • 基于CNN神经网络的手写字符识别实验报告
  • Ubuntu 系统中安装和配置 clash