Skip to content

Node.js 爬虫(Puppeteer)

爬虫是自动浏览和提取网页信息的程序。使用爬虫需遵守法律法规和网站使用条款。

bash
npm install puppeteer

Puppeteer 核心功能

功能说明
自动化操作加载页面、点击、填表单、提交
截图/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')获取元素文本