Node.js 爬虫(Puppeteer)
爬虫是自动浏览和提取网页信息的程序。使用爬虫需遵守法律法规和网站使用条款。
bash
npm install puppeteerPuppeteer 核心功能
| 功能 | 说明 |
|---|---|
| 自动化操作 | 加载页面、点击、填表单、提交 |
| 截图/PDF | 页面截图、生成 PDF |
| 爬虫抓取 | 模拟用户行为提取内容 |
| 性能分析 | 页面加载时间、网络请求监测 |
| 无头/调试 | 无头模式后台运行,调试模式可视化 |
掘金爬虫示例
js
import puppeteer from 'puppeteer'
import { spawn } from 'child_process'
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')
const articleList = []
for (let el of elements) {
const name = await (await el.getProperty('innerText')).jsonValue()
if (name.trim() === '前端') {
await el.click() // 自动点击"前端"分类
break
}
}
// 收集文章标题
await page.waitForSelector('.entry-list')
const titleEls = await page.$$('.entry-list .title-row a')
for (let el of titleEls) {
const name = await (await el.getProperty('innerText')).jsonValue()
articleList.push(name)
}
// 调用 Python 生成词云图
const python = spawn('python', ['index.py', articleList.join(',')])
python.stdout.on('data', (data) => console.log(data.toString()))Python 词云图(index.py)
python
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import sys
words = jieba.cut(sys.argv[1]) # 中文分词
wc = WordCloud(font_path='./font.ttf', width=1000, height=800,
background_color='white').generate(''.join(words))
# 输出词云图
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()Puppeteer 常用 API
| API | 说明 |
|---|---|
browser.newPage() | 打开新页面 |
page.goto(url) | 跳转到 URL |
page.waitForSelector(sel) | 等待元素出现 |
page.$$(sel) | 获取所有匹配元素 |
el.click() | 点击元素 |
el.getProperty('innerText') | 获取元素文本 |