Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 随着互联网的发展,网页数据抓取已成为数据分析和市场调研的关键手段。Puppeteer是一款由Google开发的无头浏览器工具,可在Node.js环境中模拟用户行为,高效抓取网页数据。本文将介绍如何利用Puppeteer的高级功能,通过设置代理IP、User-Agent和Cookies等技术,实现复杂的Web Scraping任务,并提供示例代码,展示如何使用亿牛云的爬虫代理来提高爬虫的成功率。通过合理配置这些参数,开发者可以有效规避目标网站的反爬机制,提升数据抓取效率。

爬虫代理.png

概述

随着互联网的发展,网页数据抓取(Web Scraping)已成为数据分析和市场调研的重要手段之一。Puppeteer作为一款强大的无头浏览器自动化工具,能够在Node.js环境中模拟用户行为,从而高效地抓取网页数据。然而,当面对复杂的网页结构和反爬虫机制时,基础的爬虫技术往往无法满足需求。本文将深入探讨如何在Node.js中利用Puppeteer的高级功能,实现复杂的Web Scraping任务,并通过代理IP、User-Agent、Cookies等技术提高爬虫的成功率。

细节

1. Puppeteer简介与安装

Puppeteer是由Google开发的一款无头浏览器工具,它可以控制Chromium或Chrome浏览器进行各种自动化操作。使用Puppeteer,开发者可以模拟浏览器的行为,例如点击、输入、导航等,甚至可以生成页面的PDF或截图。
安装Puppeteer非常简单,只需在Node.js环境中执行以下命令:

npm install puppeteer
2. 设置代理IP、User-Agent与Cookies

在进行Web Scraping时,使用代理IP可以有效避免被目标网站限制,尤其是在大量请求的情况下。此外,通过设置User-Agent和Cookies,爬虫可以伪装成真实用户的访问行为,从而进一步提高数据抓取的成功率。
以下是一个使用Puppeteer进行复杂Web Scraping的示例代码(BOSS直聘),代码中使用了亿牛云的爬虫代理,并设置了User-Agent与Cookies信息。

const puppeteer = require('puppeteer');

// 配置代理IP的信息 亿牛云爬虫代理 www.16yun.cn
const proxy = {
   
   
    host: 'proxy.16yun.cn', // 代理IP端口服务器
    port: 8000, // 代理IP端口
    username: '你的代理用户名', // 代理IP用户名
    password: '你的代理密码' // 代理IP密码
};

// 用户代理信息(User-Agent)
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36';

// 预设的Cookies信息
const cookies = [
    {
   
   
        name: 'your_cookie_name', // 替换为实际的Cookie名称
        value: 'your_cookie_value', // 替换为实际的Cookie值
        domain: '.zhipin.com' // Boss直聘的域名
    }
];

(async () => {
   
   
    // 启动Puppeteer浏览器实例,并设置代理IP
    const browser = await puppeteer.launch({
   
   
        headless: true, // 无头模式
        args: [
            `--proxy-server=${
     
     proxy.host}:${
     
     proxy.port}` // 配置代理IP
        ]
    });

    // 创建一个新的浏览器页面
    const page = await browser.newPage();

    // 设置User-Agent
    await page.setUserAgent(userAgent);

    // 设置代理IP的认证
    await page.authenticate({
   
   
        username: proxy.username,
        password: proxy.password
    });

    // 设置Cookies
    await page.setCookie(...cookies);

    // 导航到Boss直聘的应聘简历页面
    await page.goto('https://www.zhipin.com/web/geek/job-recommend', {
   
    waitUntil: 'networkidle2' });

    // 等待页面中的简历列表加载完成
    await page.waitForSelector('.geek-item');

    // 抓取简历信息
    const resumes = await page.evaluate(() => {
   
   
        const resumeElements = document.querySelectorAll('.geek-item');
        const resumeData = [];

        resumeElements.forEach((element) => {
   
   
            const name = element.querySelector('.name').innerText; // 应聘者姓名
            const jobTitle = element.querySelector('.job-name').innerText; // 目标职位
            const experience = element.querySelector('.text').innerText; // 工作经验
            const location = element.querySelector('.address').innerText; // 所在城市
            const salary = element.querySelector('.salary').innerText; // 期望薪资

            resumeData.push({
   
    name, jobTitle, experience, location, salary });
        });

        return resumeData;
    });

    // 打印抓取的简历数据
    console.log(resumes);

    // 在抓取完成后关闭浏览器
    await browser.close();
})();
3. 代码解析
  • 代理IP设置:通过--proxy-server参数设置代理IP,避免IP被封禁的风险。同时,使用page.authenticate()方法对代理IP进行认证。
  • User-Agent设置:通过page.setUserAgent()方法伪装请求的浏览器信息,模拟真实用户的访问行为。
  • Cookies设置:通过page.setCookie()方法预设Cookies信息,以维持会话状态或绕过登录验证。
  • 页面抓取:通过page.goto()方法导航到目标网页,并使用page.content()方法获取网页内容。

    4. 代理IP与Puppeteer的配合

    使用代理IP进行Web Scraping时,建议选择一个稳定、速度快的代理服务商,例如亿牛云爬虫代理。通过使用稳定的代理服务,可以大大提高爬虫的效率和成功率。此外,合理设置抓取频率和随机等待时间,也能有效避免触发目标网站的反爬虫机制。

    5. 提高爬虫效率的其他技巧
  • 使用并发请求:在不影响目标网站的前提下,可以使用Puppeteer的并发功能,批量抓取多个页面的数据,以提高抓取效率。

  • 动态加载处理:对于动态加载的网页,可以使用page.waitForSelector()page.waitForTimeout()方法,确保所有数据加载完成后再进行抓取。
  • 错误处理与重试机制:在Web Scraping过程中,难免会遇到网络异常或抓取失败的情况。通过设置错误处理与重试机制,可以提高爬虫的鲁棒性。

    结论

    Puppeteer作为一款功能强大的无头浏览器自动化工具,在Web Scraping领域具有广泛的应用前景。通过合理配置代理IP、User-Agent与Cookies,开发者可以有效提升爬虫的成功率,并规避目标网站的反爬虫机制。希望本文的内容能够帮助你在Node.js环境中更好地掌握Puppeteer的高级用法,并在实际项目中成功实现复杂的Web Scraping任务。
相关文章
|
2月前
|
JavaScript
使用Node.js创建一个简单的Web服务器
使用Node.js创建一个简单的Web服务器
|
2月前
|
机器学习/深度学习 人工智能 JavaScript
JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景
本文探讨了JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景。JavaScript将注重性能优化、跨平台开发、AI融合及WebAssembly整合;TypeScript则强调与框架整合、强类型检查、前端工程化及WebAssembly的深度结合。两者结合发展,特别是在Vue 3.0中完全采用TypeScript编写,预示着未来的Web开发将更加高效、可靠。
53 4
|
2月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
44 2
|
2月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
32 1
|
2月前
|
JavaScript 前端开发
JS中的构造函数的含义和用法
构造函数是JavaScript中用于创建新对象的特殊函数,通常首字母大写。通过`new`关键字调用构造函数,可以初始化具有相同属性和方法的对象实例,从而实现代码复用。例如,定义一个`Person`构造函数,可以通过传入不同的参数创建多个`Person`对象,每个对象都有自己的属性值。此外,构造函数还可以包含方法,使每个实例都能执行特定的操作。构造函数的静态属性仅能通过构造函数本身访问。ES6引入了`class`语法糖,简化了类的定义和实例化过程。
31 1
|
3月前
|
XML JavaScript 前端开发
JavaScript控制台:提升Web开发技能的秘密武器
作为Web开发人员,掌握JavaScript控制台中的各种方法至关重要。本文介绍了22种实用的console方法,从基本的log()到高级的profile()和memory,每种方法都配有示例和说明,帮助开发者更高效地调试和记录信息。通过了解这些工具,您可以优化代码、提高开发速度,减少错误,使编码过程更加顺畅愉快。
50 1
JavaScript控制台:提升Web开发技能的秘密武器
|
2月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
2月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
45 4
|
3月前
|
JavaScript 前端开发
JS try catch用法:异常处理
【10月更文挑战第12天】try/catch` 是 JavaScript 中非常重要的一个特性,它可以帮助我们更好地处理程序中的异常情况,提高程序的可靠性和稳定性。
40 1
|
2月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
36 1
JavaScript中的原型 保姆级文章一文搞懂