Nodejs 第五十六章(爬虫)

什么是爬虫?

爬虫,也称为网络爬虫或网络蜘蛛,是指一种自动化程序或脚本,用于在互联网上浏览和提取信息。爬虫模拟人类用户在网页上的行为,通过HTTP协议发送请求,获取网页内容,然后解析并提取感兴趣的数据

在使用爬虫时,需要遵守法律法规和网站的使用条款

  1. 网站的使用条款:每个网站都有自己的使用条款和隐私政策,这些规定了对网站内容和数据的访问和使用限制。在使用爬虫之前,务必仔细阅读并遵守网站的使用条款。
  2. 知识产权:爬虫可能涉及到对网站上的内容进行复制、提取或分发。在进行这些操作时,你应该尊重知识产权法律,包括版权和商标法。确保你有合法的权利使用、复制或分发所爬取的内容。
  3. 网络破坏和滥用:使用爬虫时,应避免对目标网站造成不必要的负载、干扰或破坏。不得以恶意方式使用爬虫,如进行DDoS攻击、破解安全措施或非法搜集个人信息。
  4. 数据隐私和个人信息保护:在爬取网站上的数据时,需特别注意处理个人身份信息和隐私数据的合规性。遵守适用的数据保护法律,确保合法地处理和存储用户数据。
  5. 欺诈和滥用:不得使用爬虫进行欺诈、仿冒、垃圾邮件或其他非法活动。尊重其他用户和网站的利益,遵守公平竞争原则

掘金robots.txt规则

安装依赖

nodejs

sh 复制代码
npm install puppeteer #爬虫 | 自动化UI测试

Puppeteer是一个由Google开发和维护的Node.js库,它提供了一个高级的API,用于通过Headless Chrome或Chromium控制和自动化网页操作。它可以模拟用户在浏览器中的交互行为,例如点击、填写表单、截屏、生成PDF等,同时还能够获取网页的内容和执行JavaScript代码。

以下是Puppeteer的一些主要特性:

  1. 自动化浏览器操作:Puppeteer可以以无头模式运行Chrome或Chromium,实现对网页的自动化操作,包括加载页面、点击、表单填写、提交等。它还支持模拟用户行为,如鼠标移动、键盘输入等。
  2. 截图和生成PDF:Puppeteer可以对页面进行截图,保存为图像文件,也可以生成PDF文件。这对于生成网页快照、生成报告、进行页面测试等非常有用。
  3. 爬虫和数据抓取:Puppeteer可以帮助你编写网络爬虫和数据抓取脚本。你可以通过模拟用户行为来导航网页、提取内容、执行JavaScript代码,并将数据保存到本地或进行进一步的处理。
  4. 网页性能分析:Puppeteer提供了一些用于分析网页性能的API,例如测量页面加载时间、网络请求和资源使用情况等。这对于性能优化和监测非常有用。
  5. 无头模式与调试模式:Puppeteer可以在无头模式下运行,即在后台运行Chrome或Chromium,无需显示浏览器界面。此外,它还支持调试模式,允许你在开发过程中检查和调试页面。

python

sh 复制代码
pip install wordcloud #生成词云图
pip install jieba #正文分词
  1. WordCloud:
    WordCloud是一个用于生成词云的Python库。它可以根据给定的文本数据,根据词频生成一个美观的词云图像,其中词语的大小表示其在文本中的重要程度或频率。WordCloud库提供了丰富的配置选项,可以控制词云的外观、颜色、字体等属性。你可以根据需求定制词云的样式和布局。WordCloud还提供了一些方便的方法,用于从文本中提取关键词、过滤停用词等。你可以使用pip安装WordCloud库,并参考官方文档进行使用。
  2. jieba:
    jieba是一个开源的中文分词库,用于将中文文本切分成单个词语。中文分词是NLP(自然语言处理)中的一个重要任务,jieba库提供了一种有效且灵活的分词算法,可以在中文文本中准确地识别出词语边界。jieba支持三种分词模式:精确模式、全模式和搜索引擎模式。你可以根据需要选择适合的分词模式

代码案例

puppeteer 会自动打开浏览器点击你传入的参数,例如前端,它就会自动点击前端菜单,然后拿到推荐的数据,交给python,进行中文分词,分完词之后输出词云图。

index.js

js 复制代码
import puppeteer from 'puppeteer'
import { spawn } from 'child_process'
const btnText = process.argv[2]
const browser = await puppeteer.launch({
    headless: false,//取消无头模式
});
const page = await browser.newPage(); //打开一个页面
page.setViewport({ width: 1920, height: 1080 }); //设置页面宽高
await page.goto('https://juejin.cn/'); //跳转到掘金
await page.waitForSelector('.side-navigator-wrap'); //等待这个元素出现

const elements = await page.$$('.side-navigator-wrap .nav-item-wrap span') //获取menu下面的span

const articleList = []
const collectFunc = async () => {
   //获取列表的信息
    await page.waitForSelector('.entry-list')
    const elements = await page.$$('.entry-list .title-row a')
    for await (let el of elements) {
        const text = await el.getProperty('innerText')
        const name = await text.jsonValue()
        articleList.push(name)
    }
    console.log(articleList)
    //调用python脚本进行中文分词 输出词云图
    const pythonProcess = spawn('python', ['index.py', articleList.join(',')])
    pythonProcess.stdout.on('data', (data) => {
        console.log(data.toString())
    })
    pythonProcess.stderr.on('data', (data) => {
        console.log(data.toString())
    })
    pythonProcess.on('close', (code) => {
        console.log(`child process exited with code ${code}`)
    })
}

for await (let el of elements) {
    const text = await el.getProperty('innerText') //获取span的属性
    const name = await text.jsonValue() //获取内容
    if (name.trim() === (btnText || '前端')) {
        await el.click() //自动点击对应的菜单
        collectFunc() //调用函数
    }
}

index.py

py 复制代码
import jieba #引入结巴库
from wordcloud import WordCloud #引入词云图
import matplotlib.pyplot as plt
import sys
text = sys.argv[1]
words = jieba.cut(text) #中文分词
#添加字体文件 随便找一个字体文件就行 不然不支持中文
font = './font.ttf'
info = WordCloud(font_path=font,width=1000,height=800,background_color='white').generate(''.join(words))

#输出词云图
plt.imshow(info,interpolation='bilinear')
plt.axis('off')
plt.show()

效果展示 (词云图)

相关推荐
wangruofeng34 分钟前
AI Models 1.1.0 发布,查大模型价格、对比模型和找 API 地址
前端·aigc·ai编程
wangruofeng37 分钟前
给前端开发者的 100 个设计参考网站
前端·设计
星栈4 小时前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技4 小时前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户47949283569154 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马6 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng7 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding8 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
鶴哥只手遮天8 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron
FungLeo10 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构