nodejs爬虫示例<爬取官网首页>

embedded/2024/10/18 23:28:01/

背景

大家都知道,Python爬虫是最牛掰的,那么前端人员能玩爬虫吗?

  • 会Python:那么爬虫会很舒服,Python有很多成熟的库,我们可以直接拿来用
  • 不会Python:爬虫也没那么难,就是需要摸索一下,nodejs也是可以的。

今天,就用nodejs做一个简单的爬虫示例。

爬虫教程

nodejs爬虫最火的库是:puppeteer。详细用法大家可以自己搜索一下,本文只讲述示例用到的API.

初始化

随便新建一个文件夹,然后初始化:

npm init -y

这样你就看到一个package.josn文件了

安装依赖

然后安装依赖

yarn add puppeteer
分析

最近短剧很火,所以今天爬取一个短剧首页的内容,今天以河马剧场为例。目标是爬取首页三大板块的短剧封面、播放地址、总集数、标签类型、标题
在这里插入图片描述

代码

只把关键代码贴出来,具体含义代码里都有注释。

由于页面是服务端渲染后返回的,各个div的class名称可能会变化,读者操作的时候,请打开控制台,用实际的节点class名处理

const puppeteer = require('puppeteer');// 需要爬取的网址
const targetUrl = "https://www.kuaikaw.cn/";(async () => {// 创建 Browser 实例,初始化全屏const browser = await puppeteer.launch({headless: false, // false:显示浏览器,true:不显示浏览器defaultViewport: { width: 0, height: 0 }, // 满屏显示args: ['--start-maximized'], // 窗口最大化});//然后创建一个 tab页的 Page 实例const page = await browser.newPage();console.log('开始进入页面...')await page.goto(targetUrl, {waitUntil: 'networkidle0'});// 等待这个元素加载出来await page.waitForSelector('#__next', { timeout: 5000 })console.log('进入成功')// 获取抓取的数据const htmlInfoList = await page.evaluate(() => {const dataBoxLists = document.querySelectorAll('.pcHome_bookColumn__5t5zY');// 定义变量,存抓取的数据let dataList = [];for (let i = 0; i < dataBoxLists.length; i++) {const title = dataBoxLists[i].querySelector('h2').innerText;// 获取每一条剧集信息const skipItems = dataBoxLists[i].querySelectorAll('.SecondList_secondListItem__2_lJR');const cellInfoList = [];for (let j = 0; j < skipItems.length; j++) {const skipItem = skipItems[j];// 获取短剧 链接const skipUrl = skipItem.querySelector('.SecondList_bookImage__f2rZc').href;// 获取短剧 标题const skipTitle = skipItem.querySelector('.SecondList_bookName__6KW0W').innerText;// 获取短剧 集数const episode = skipItem.querySelector('.SecondList_totalChapterNum__c1QOf').innerText;// 获取短剧 封面图const poster = skipItem.querySelector('img').src;// 获取短剧 标签类型const tags = skipItem.querySelectorAll('.SecondList_tagItem__DI39u');const tagList = [];for (let k = 0; k < tags.length; k++) {const tag = tags[k];tagList.push(tag.innerText);}cellInfoList.push({url: skipUrl,title: skipTitle,poster,episode,tagList})}dataList.push({title: title,cellList: cellInfoList})}return dataList;})console.log('爬取的数据为:', htmlInfoList)
})();

执行上述代码,你就能看到终端打印出这样的内容:在这里插入图片描述
这样看着不是很直观,所以还是把爬取的数据写入一个txt文件里吧,加上如下代码:

const fs = require('fs');// 文件路径,将爬虫数据保存到该文件中
const filePath = '爬虫(河马短剧).txt';// 使用 writeFile 异步写入文件// JSON.stringify()第三个参数设置为 2 表示每层缩进两个空格fs.writeFile(filePath, JSON.stringify(htmlInfoList, null, 2), 'utf8', (error) => {if (error) {console.error('写入文件时出错:', error);} else {console.log(`内容已写入文件 ${filePath}`);}});

再次npm run index.js,就会看到文件夹下多了个爬虫(河马短剧).txt
在这里插入图片描述

完整代码

完整代码放在码云gitee托管了,如果大家去看的话,切换到这个分支,因为主分支我想作为基础分支,以后爬取各种各类的东西,所以主分支是一个基础模版:
在这里插入图片描述

最后

小编是前端开发者,目前正在持续更新《若依nodejs全栈》系列,请大家多多关注。


http://www.ppmy.cn/embedded/93406.html

相关文章

自动化测试工具:Selenium

Selenium作为一种广泛使用的自动化测试工具&#xff0c;尤其在Web自动化测试领域发挥着重要作用。为了提升测试效率、增强测试的可维护性和可读性&#xff0c;Selenium经常与各种流行框架集成&#xff0c;其中pytest和Allure报告是两个非常受欢迎的选项。本文将详细探讨Seleniu…

HTTPS

重要:面试关于HTTPS的工作流程 关于HTTPS的基本概念 HTTPS HTTP SSL 加密 既然要保证数据安全, 就需要进⾏ "加密". ⽹络传输中不再直接传输明⽂了, ⽽是加密之后的 "密⽂". 加密的⽅式有很多, 但是整体可以分成两⼤类: 对称加密 和 ⾮对称加密 明文…

Adobe Substance 3D Sampler v4.2.2.3719 解锁版下载安装教程(3D材质管理软件)

前言 Substance 3D Sampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料&#xff0c;或通过扫描&#xff08;单个或多个图像&#xff09;中提取新材料来创建和迭代材料集合&#xff0c;从而轻松将真实的图片转换为具有真实感的表面…

WordPress原创插件:Category-id-list分类ID显示查看

WordPress原创插件&#xff1a;Category-id-list分类ID显示查看 插件设置位置在工具栏

蓝凌EKP二次开发资料大全 完整蓝凌二次开发资料 蓝凌 EKP开发实战教程 蓝凌OA二次开发资料大全 蓝凌OA java开发快速入门

蓝凌EKP二次开发资料大全 完整蓝凌二次开发资料 蓝凌 EKP开发实战教程 蓝凌OA二次开发资料大全 记得两年前花了非常贵的费用去现场学习的资料&#xff0c;把这些开发技术文档分享出来&#xff0c;希望通过这个资料&#xff0c; 为大家学习开发大大减少时间。期待大家能快速上…

修改pom.xml为阿里云仓库并且让他生效

一、项目pom.xml添加 <repositories><repository><id>aliyun-central</id><name>Aliyun Maven Central</name><url>https://maven.aliyun.com/repository/central</url></repository><repository><id>aliyu…

2024 某公司python 面试真题

Q: Can the type of options or labels of switch-case be floating? 在C语言中&#xff0c;switch-case语句的标签必须是整数类型&#xff0c;不能是浮点型。而在Python中&#xff0c;没有switch-case语句&#xff0c;但是可以使用字典来实现类似的功能&#xff0c;而字典的键…

leetcode:1822. 数组元素积的符号(python3解法)

难度&#xff1a;简单 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。如果 x 是负数&#xff0c;返回 -1 。如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。…