爬虫高级范式:使用无头浏览器puppeteer 模拟,克服js异步加载
使用 Puppeteer 爬取网页通常分为以下几个步骤。Puppeteer 是一个基于 Node.js 的库,允许你控制无头浏览器(headless browser),并模拟用户与网页的交互。
步骤 1: 安装 Puppeteer
首先,你需要安装 Puppeteer。你可以使用 npm(Node.js 包管理工具)来安装它:
npm install puppeteer
npm install puppeteer 会自动下载并安装一个版本的 Chromium(而不是 Google Chrome)作为 Puppeteer 的依赖。Puppeteer 会默认与一个特定版本的 Chromium 配合使用,这样你就不需要单独安装浏览器了。这个 Chromium 版本是 Puppeteer 自带的,并且是为了确保与 Puppeteer 的兼容性而提供的。
步骤 2: 编写爬虫脚本
示例代码:
const puppeteer = require('puppeteer');
(async () => {
// 启动无头浏览器
const browser = await puppeteer.launch({ headless: true });
// 创建一个新的页面
const page = await browser.newPage();
// 导航到目标网页
await page.goto('https://example.com');
// 获取页面的内容,或者可以提取具体的元素
const pageTitle = await page.title(); // 获取页面标题
console.log('Page Title:', pageTitle);
// 获取页面上的某些元素,使用选择器
const heading = await page.$eval('h1', el => el.textContent);
console.log('Heading:', heading);
// 如果需要提取多个元素
const links = await page.$$eval('a', links => links.map(link => link.href));
console.log('Links:', links);
// 关闭浏览器
await browser.close();
})();
步骤 3: 执行脚本
你可以在命令行中执行上述脚本:
node scraper.js
代码解释:
• puppeteer.launch():启动无头浏览器。headless: true 表示启动无头模式,即没有图形界面的浏览器。
• page.goto(url):让 Puppeteer 导航到指定的 URL。
• page.title():获取网页标题。
• page.$eval(selector, callback):选择页面上的某个元素并执行回调函数来提取该元素的内容。
• page.$$eval(selector, callback):选择多个元素并执行回调函数来提取它们的内容。
• browser.close():关闭浏览器。
步骤 4: 在浏览器中等待动态内容加载
如果你爬取的网页内容是动态加载的(比如使用 JavaScript 渲染的内容),你可能需要等页面加载完成后再进行数据提取。你可以使用 page.waitForSelector 来等待特定元素加载:
await page.waitForSelector('.dynamic-element'); // 等待页面上的特定元素加载
其他常见功能:
- 模拟用户操作:如点击按钮、填写表单等。
await page.click(‘#button’);
await page.type(‘#input’, ‘example text’);
- 截屏/截图:
await page.screenshot({ path: ‘screenshot.png’ });
- 获取页面 HTML 内容:
const html = await page.content();
console.log(html);
- 执行 JavaScript 脚本:
const result = await page.evaluate(() => {
return document.title;
});
console.log(result);
重要注意事项:
• 确保遵守目标网站的 robots.txt 文件中关于爬虫的规则。
• 如果目标网站反爬虫机制较强,可能需要使用代理、模拟用户行为(如随机等待时间)等策略来绕过限制。
• Puppeteer 适合抓取需要 JavaScript 渲染的页面,对于静态页面(仅包含 HTML)可以使用更轻量级的工具,如 Axios 或 Cheerio。