如何在 Puppeteer 中运行无头浏览器?

news2025/2/25 9:44:03

什么是无头浏览器?

我们都知道,用户界面(UI)是任何软件中最重要的部分。因此,“无头浏览器”的“无头”部分意味着它们确实缺少一个关键元素,即图形用户界面(GUI)。

这意味着浏览器本身可以在后台正常运行(联系目标网站、上传/下载文档、呈现信息等),但你看不到任何东西。

相反,软件测试工程师更喜欢使用像“命令行”这样的界面,其中命令作为文本行处理。

如何检测无头Chrome?

无头浏览器示例

  • Headlesschrome
  • Chromium
  • Firefox Headless
  • HTML Unit
  • Apple Safari (Webkit)
  • Zombie.JS
  • PhantomJS
  • Splash

为什么Puppeteer最适合网页抓取?

Puppeteer是Google开发的一个开源Node.js库,提供了控制无头Chrome或Chromium浏览器的高级API。以下7个优势说明了为什么开发人员更喜欢使用它进行网页抓取。

1. 无头Chrome自动化

Puppeteer操作无头版的Google Chrome,这意味着它可以在没有图形用户界面的情况下运行。这允许更快、更高效的抓取,因为它减少了与渲染完整浏览器窗口相关的开销。

2. JavaScript执行

许多现代网站严重依赖JavaScript动态加载内容。传统的抓取工具通常难以处理此类网站。然而,Puppeteer可以像真实浏览器一样执行JavaScript,确保所有动态内容完全加载并可供抓取。

3. 高质量API

Puppeteer提供了高质量的API,可以精确控制浏览器。这包括点击按钮、填写表单和在页面之间导航等操作,这些对于抓取复杂网站至关重要。

4. 自动截图

Puppeteer的一个功能是能够自动截图。这对于调试和验证内容是否正确加载非常有用,然后进行抓取。

5. 跨浏览器测试

Puppeteer支持跨浏览器测试,这意味着你可以在不同的浏览器(如Chrome和Firefox)上测试和抓取网站。这种灵活性确保你的抓取脚本稳健并能处理各种网络环境。

6. 社区和扩展

Puppeteer拥有强大的社区,并与TeamCity、Jenkins和TravisCI等其他工具有良好集成。这使得更容易找到支持和增强抓取任务的扩展。

7. 模拟真实用户交互

Puppeteer可以模拟真实用户交互,例如鼠标移动和键盘输入。这使得网站更难检测和阻止抓取活动,因为这些交互看起来更像是人类行为。

如何使用Puppeteer抓取网站?

现在,我将向你展示如何使用Nstbrowserles完成抓取!

让我们以抓取TikTok首页Explore页面上的视频链接地址为例具体说明:

你可能还喜欢: 如何使用Playwright抓取头像。

第一步 页面分析

我们需要:

  1. 进入TikTok首页。
  2. 打开控制台元素页面并定位Explore页面元素。此元素是具有data-e2e="nav-explore"属性的a链接元素标签。

点击上面的元素进入预览页面以进行进一步分析。

我们可以发现我们想要的目标数据属于具有data-e2e="explore-item-list"属性的列表元素下的一个div元素项。

每个视频元素由data-e2e="explore-item"表示,我们想要的视频链接是其下的div a链接标签的href属性值。

成功定位到我们需要的元素后,我们可以进入抓取过程:

第二步 使用Nstbrowserless,你必须预先安装并运行Docker。

# 拉取镜像
docker pull nstbrowser/browserless:0.0.1-beta
# 运行nstbrowserless
docker run -it -e TOKEN=xxx -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-beta

第三步 编码 (Python-Pyppeteer)

现在我们需要设置Nstbrowser为无头模式

import json
from urllib.parse import urlencode
from pyppeteer import launcher


async def main():
    config = {
        "once": True,
        "headless": True,  # 支持:true或false
        "autoClose": True,
        "args": ["--disable-gpu", "--no-sandbox"],  # 浏览器参数应为列表
        "fingerprint": {
            "name": 'tiktok_scraper',
            "platform": 'windows',  # 支持:windows, mac, linux
            "kernel": 'chromium',  # 仅支持:chromium
            "kernelMilestone": '120',
            "hardwareConcurrency": 8,  # 支持:2, 4, 8, 10, 12, 14, 16
            "deviceMemory": 8,  # 支持:2, 4, 8
        },
    }
    query = {
        'config': json.dumps(config)
    }
    browser = await launcher.connect(
        browserWSEndpoint=f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}"
    )
    page = await browser.newPage()
    await page.goto('chrome://version')
    await page.screenshot({'path': 'chrome_version.png'})
    await browser.close()


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

运行上述代码后,你可以在chrome://version页面上看到以下信息:

在内核启动命令中添加--headless参数表示内核以无头模式运行。

整体代码展示:

import json
from urllib.parse import urlencode
from pyppeteer import launcher


async def main():
    config = {
        "once": True,
        "headless": True,  # 支持:true或false
        "autoClose": True,
        "args": ["--disable-gpu", "--no-sandbox"],  # 浏览器参数应为列表
        "fingerprint": {
            "name": 'tiktok_scraper',
            "platform": 'windows',  # 支持:windows, mac, linux
            "kernel": 'chromium',  # 仅支持:chromium
            "kernelMilestone": '120',
            "hardwareConcurrency": 8,  # 支持:2, 4, 8, 10, 12, 14, 16
            "deviceMemory": 8,  # 支持:2, 4, 8
        },
        "proxy": "",  # 如果你无法浏览TikTok网站,请设置适当的代理
    }
    query = {
        'config': json.dumps(config)
    }
    browser = await launcher.connect(
        browserWSEndpoint=f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}"
    )
    try:
        # 创建新页面
        page = await browser.newPage()
        await page.goto("https://www.tiktok.com/")
        await page.waitForSelector('[data-e2e="nav-explore"]', {'timeout': 30000})
        explore_elem = await page.querySelector('[data-e2e="nav-explore"]')
        if explore_elem:
            await explore_elem.click()
            await page.waitForSelector('[data-e2e="explore-item-list"]', {'timeout': 30000})
            ul_element = await page.querySelector('[data-e2e="explore-item-list"]')
            if ul_element:
                li_elements = await ul_element.querySelectorAll('div')
                href

s = []
                for li in li_elements:
                    a_element = await li.querySelector('[data-e2e="explore-item"] div a')
                    if a_element:
                        href = await page.evaluate('(element) => element.getAttribute("href")', a_element)
                        if href:
                            print(href)
                            hrefs.append(href)
                            # TODO
    finally:
        await browser.close()


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

抓取结果:

到目前为止,我们已经完成了使用Nstbrowserless抓取TikTok视频链接的操作。获得链接后,你可以进一步完成你想要的操作,例如存储、下载视频或重定向播放。

无头Chrome总是好吗?

虽然无头浏览器在网页抓取和自动化中非常重要,但实际上它并非全都是优点。在使用之前请仔细考虑以下优缺点:

优点:

  1. 无头Chrome在从目标网站提取特定数据点(例如竞争对手产品定价)时更高效。
  2. 无头浏览器比常规浏览器更快——它们加载CSS和JavaScript的速度更快,并且不需要打开和渲染HTML。
  3. 无头浏览器为开发人员节省时间,例如在执行单元测试代码更改(移动和桌面)时,可以使用命令行完成。

缺点:

  1. 无头浏览器操作仅限于后台任务,这意味着它无法解决前端问题(例如生成GUI截图)。
  2. 无头浏览器提高了速度,但有时会有代价,例如调试问题变得更加困难。

重点总结

无头Chrome为网页抓取过程提供了许多好处,只需几行代码即可实现抓取和自动化。它最小化内存使用,完美处理JavaScript,并在无GUI环境中运行。

在本指南中,你学习了:

  1. 什么是无头浏览器?
  2. Puppeteer用于网页抓取的优势
  3. Puppeteer网页抓取的详细步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity渲染人物模型透明度问题

问题1:有独立的手和衣服的模型,但最终只渲染出来半透明衣服 问题2:透明度贴图是正确的但显示却不正确 这上面两个模型的问题都是因为人物模型是一个完整的,为啥有些地方可以正常显示,有些地方透明度却有问题。 其中…

AI大模型,程序员的下一个职业春天

前言 在后疫情时代的经济环境中,各行各业的就业形势变得异常严峻,互联网行业尤甚,裁员潮频发,程序员们的未来似乎笼罩在一层不确定的迷雾之中。曾经,程序员这个职业因其高薪而令人艳羡,但背后的艰辛与压力…

【STM32】LED闪烁LED流水灯蜂鸣器(江科大)

LED正极:外部长脚、内部较小 LED负极:外部短脚、内部较大 LED电路 限流电阻:保护LED,调节LED亮度(本实验用面包板为了方便,省去了限流电阻,设计电路时要加上) 左上图:低…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿,为避免一些安全隐患将这几台机器执行重装系统操作; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

Linux——远程连接服务器

sshd服务端 ssh客户端 ssh 服务配置 #ssh 服务安装包 openssh-server [rootserver1 ~] # vim /etc/ssh/sshd_config 17 . #Port 22 # 监听端口,默认监听 22 端口 【默认可修改】 18 . #AddressFamily any #IPV4 和 IPV6 协议家族用哪个, any 表示二者…

Python莫兰生死抑制放大进化图

🎯要点 🎯种群离散时间莫兰生死动态图解 | 🎯良好混合种群的固定概率 | 🎯数值求解生成埃尔多斯-雷尼图 | 🎯计算马尔可夫链的转移矩阵概率 | 🎯出生死亡动态和死亡出生动态概率无向随机图和有向随机图&am…

【数据结构】树和二叉树——Lesson1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

一个小问题导致,AI大模型集体翻车?

9.11大还是9.9大? 这两天大家都在说ChatGPT大模型翻车了 ! 这到底是怎么个事儿呢? 原来是最近有人想ChatGPT等大模型提了一个简单的问题: 9.11 大还是 9.9 大? 答案显而易见,然而众多大模型却给出了错误…

基于JAVA+SpringBoot+Vue的oa系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

【高性能服务器】poll模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 poll模型 关于sel…

算法-计数质数

题目: 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 思路: 使用埃式筛法 当n大于等于2时,如果当前遍历的数 i 是质数,那么从 i*i 开始,直到 n 为止,把 i 的倍数都标记为合数 代码&a…

一个关于STM32的DAC输出的遗忘点

众所周知熟练使用HAL库可以帮你解决不少stm32的开发难题,但是是谁让你陷入了这些难题,别问。 如上图所示,正常初始化这个模块后生成代码如下图所示; * DAC init function */ void MX_DAC_Init(void) {/* USER CODE BEGIN DAC_Ini…

【LabVIEW作业篇 - 3】:数组相加、for循环创建二位数组、数组练习(求最大最小值、平均值、中位数、提取范围内的数据、排序)

文章目录 数组相加for循环实现直接使用加函数 for循环创建二位数组数组练习 数组相加 要求:用两种方法实现两个数组相加 for循环实现 在前面板中分别创建两个数值类型的一维数组,并设置相应的值,然后在程序框图中创建一个for循环&#xff…

数据结构(Java):力扣牛客 二叉树面试OJ题(一)

👉 ​​​​​​目录 👈 1、题一:检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二:另一棵树的子树 2.1 思路分析 2.2 代码 3、题三:翻转二叉树 3.1 思路分析 3.2 代码 4、题四:判断树是否对称 …

小模型大突破!神经网络透视空间异质性,准确描述复杂地理现象

为推进 AI4S 的普适化,降低学术机构科研成果的传播壁垒,为更多行业学者、科技爱好者及产业单位提供交流平台,HyperAI超神经策划了「Meet AI4S」系列直播栏目, 邀请深耕 AI for Science 领域的科研人员或相关单位,以视频…

新时代多目标优化【数学建模】领域的极致探索——数学规划模型

目录 例1 1.问题重述 2.基本模型 变量定义: 目标函数: 约束条件: 3.模型分析与假设 4.模型求解 5.LINGO代码实现 6.结果解释 ​编辑 7.敏感性分析 8.结果解释 例2 奶制品的销售计划 1.问题重述 ​编辑 2.基本模型 3.模…

北京邮电大学,中央空调的分户计费系统

北京邮电大学 中央空调如何公平、公正、合理的收取费用,一直都是各建筑管理者的首要问题。北京邮电大学也面临着能源分配不公,学校管理者空调收费管理困难等问题。根据学校的具体情况,拓森为其制定了一套中央空调管理运营方案—无线中央空调…

jupyter学习笔记

简介 Jupyter Notebook是一个Web应用程序,它可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示。 安装使用 前提:必须安装python 先升级pip至最新版本 pip3 install --upgrade pip安装jupyter notebook pi…

springboot的简单应用

Mvc与三层架构 创建Spring项目 勾选web和mabais框架 配置yml文件,这里创建spring项目默认生成的是propertise文件,但是properties文件的格式看起来没有yml文件一目了然。yml文件配置数据库还有映射mapper层的xml文件以及设置日志级别,比如map…

刚起步的家庭海外仓:涉及到的全部业务优化流程

对于家庭海外仓来说,最难的阶段应该就是刚起步的时候。对业务流程不熟悉,也没有客户积累,本身的预算又十分有限。 在这个情况下应该注意什么,怎样才能顺利的开展业务?今天我们就针对这个问题详细的梳理了一下家庭海外…