【Puppeteer】豆瓣爬虫示例

puppeteer爬取豆瓣电影信息 puppeteer爬取豆瓣电影信息 const puppeteer = require('puppeteer') const url = `https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=` const sleep = time =>{ new Promise(resolve=>{ //成功执行 ... 阅读详情

Puppeteer 豆瓣爬虫

Puppeteer是谷歌在Chrome Headless的基础之上,开发出来的无界面操作与js接口套装,详细的介绍可以看官网。

官网上有给出一些demo,比如打开网页并截取长图,模拟使用iPhone打开网页等等。不过利用Puppeteer实际上就是模拟用户与Chrome交互的特点,用来写爬虫是很方便的。下面我以豆瓣为例,写一个例子。

1、模块引用

虽说Puppeteer是谷歌针对Chrome设计的,但实际上Chromium核心的浏览器都可以使用,只需要指定启动位置即可,例如我使用新版Edge:

const fs = require('fs')
const cheerio = require('cheerio')
const puppeteer = require('puppeteer-core');

(async () => {
    // 初始化puppeteer
    const browser = await puppeteer.launch({
        executablePath: 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
        headless: true  //headless默认为true表示不启动GUI
    });
})()

注意这里引用的puppeteer-core,这个版本的module是不会自动下载Chrome的,比较适合不想使用Chrome开发的人,否则下载速度感人-_-

2、设置Header

这一步实际上就是做最基本的伪装,一般如果一个网站真的反爬虫,仅靠一个Header是不够的(通过短时间相同浏览器频繁访问可以识别为爬虫),不过豆瓣好像基本就没有相关措施,而且我们只是举个例子,就简单设置一下吧:

    // 获取page实例
    const page = await browser.newPage();

    // 将webdriver字段删除,防止反爬虫
    await page.evaluateOnNewDocument(() => {
        const newProto = navigator.__proto__;
        delete newProto.webdriver;
        navigator.__proto__ = newProto;
    })

    // 设置useragent,如果headless设置为true,则必做
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41');

3、分析页面

本次示例我们爬取的网站是豆瓣电影分类排行榜 ,网页的布局如下:
页面布局
我们的目标是获取页面内的每部电影的:电影名、演员名单、基本信息、评分信息。下面阅读网页源代码,找到HTML的结构信息

3.1 HTML结构

F12打开调式工具,然后选中一个影片定位到它的HTML元素位置:

HTML结构
顺着div块一层层往上缕,可以看到一个明晰的主线:.article —> .movie-list-panel pictext' —> .movie-info>,这是一部电影的结构顺序,实际上我们没必要写的太清晰,可以直接使用

let list = document.querySelectorAll('.article .movie-info')

就可以拿到全部电影的movie-info了。

3.2 筛选信息

上一步我们只是拿到了包含每部电影信息的“粗筛”,下面我们还要针对目标进行细筛。

使用js做爬虫的一个优点就是你可以直接看到每一步的返回结果,只需要使用浏览器自己的终端即可,比如我们看看上一步是不是确实拿到了每部电影的信息:

粗筛结果

嗯,进一步看看列表中每个元素包含了什么:

进一步查看
不难发现,我们要的信息刚好对应四个子节点(不得不说豆瓣的结构那是相当的规范),那分离出来就很容易了:

let res = []
for (let i = 0; i < list.length; i++) {
	res.push({
	movie_name: list[i].querySelector('.movie-name-text').textContent,
	movie_crew: list[i].querySelector('.movie-crew').textContent,
	movie_misc: list[i].querySelector('.movie-misc').textContent,
	movie_rating: list[i].querySelector('.rating_num').textContent
	})
}

在验证一下,确实拿到了哈:

精筛结果

3.3 动态页面

看到这按理说已经结束了,不过你要是这么爬可能结果只有20个左右,为什么呢?因为豆瓣它只有你向下滑动了才会加载更多影片啊!那么这里就需要我们模拟浏览器向下滑动的操作了,交给Puppteer,一切都简单:

    var content, $
    async function scrollPage() {
        content = await page.content()
        $ = cheerio.load(content)

        // 执行js代码(滚动)
        await page.evaluate(() => {
            // 渐进滚动,直接跳转可能不刷新内容
            window.scrollTo({ behavior: "smooth", top: document.body.scrollHeight });
        })
    }

这个函数可以将页面向下滚动一个屏宽,然后加载。你可以循环调用这个函数,就可以不断地往下滑了(当然你需要自己设置一个出口),或者修改滑动的宽度,一次性滑到足够的长度。

4、完整代码

const fs = require('fs')
const cheerio = require('cheerio')
const puppeteer = require('puppeteer-core');

(async () => {
    // 初始化puppeteer
    const browser = await puppeteer.launch({
        executablePath: 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
        headless: true  //headless默认为true表示不启动GUI
    });

    // 获取page实例
    const page = await browser.newPage();

    // 将webdriver字段删除,防止反爬虫
    await page.evaluateOnNewDocument(() => {
        const newProto = navigator.__proto__;
        delete newProto.webdriver;
        navigator.__proto__ = newProto;
    })

    // 设置useragent,如果headless设置为true,则必做
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41');

    // 在新标签中打开要爬取的网页
    url = 'https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action='
    await page.goto(url, { waitUntil: 'networkidle2' })

    // 使用evaluate方法在浏览器中执行传入函数(完全的浏览器环境,所以函数内可以直接使用window、document等所有对象和方法)
    var content, $
    async function scrollPage() {
        content = await page.content()
        $ = cheerio.load(content)

        // 执行js代码(滚动)
        await page.evaluate(() => {
            // 渐进滚动,直接跳转可能不刷新内容
            window.scrollTo({ behavior: "smooth", top: document.body.scrollHeight * 3 });
        })

        let res = await page.evaluate(() => {
            list = document.querySelectorAll('.article .movie-info')
            let res = []
            for (let i = 0; i < list.length; i++) {
                res.push({
                    movie_name: list[i].querySelector('.movie-name-text').textContent,
                    movie_crew: list[i].querySelector('.movie-crew').textContent,
                    movie_misc: list[i].querySelector('.movie-misc').textContent,
                    movie_rating: list[i].querySelector('.rating_num').textContent
                })
            }
            return res
        })

        return res
    }

    let list = await scrollPage()
    list = JSON.stringify(list)
    fs.writeFileSync('movie-info.json', list);

    await browser.close()
})()

最后爬取到的结果也很规范:

爬虫结果

5、结语

这只是简单使用了一下Puppeteer写了一个示例,实际上如果你熟练使用Scrapy、selenium这些python方法同样可以高效的写出爬虫(甚至更加方便自动化与管理)。但是Puppeteer对于初学者学习如何分析网页,了解JavaScript与HTML的关系很有帮助,另外写一些个人项目使用起来也很简单,不需要想太多。

python爬虫:基于pyppeteer的14个实战案例 `Pyppeteer` 是一个 Python 版的 Puppeteer,它提供了对 Chrome/Chromium 浏览器的高级控制,常用于网页自动化、爬虫、测试等场景。以下是一个基于 `Pyppeteer` 的实战示例,展示如何使用它来抓取动态网页数据。 阅读详情

相关推荐

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

Puppeteer 使用教程-基础篇(超详细、超全面)

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。本文涉及了Puppeteer常见常用的API样例,包括爬取图片、视频、cookies设置,字符输入等多方面知识,很全面哦。

~朴:shu的博客 3万+

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

Puppeteer修改请求Header过无头检测

【代码】Puppeteer修改请求Header过无头检测。

qq_31661311的博客 412

educoder 5-3Python 计算思维训练——地图模拟

任务描述 本关任务:利用 Python 实现动画观察近 30 天 4.5 级以上地震发生情况。 相关知识 为了完成本关任务,你需要掌握:1.如何用 Python 从网络获取所需数据;2.如何用 Python 绘制地图 从网络获取数据 URL 处理模块(库) 在这里插入代码片 import urllib.request as req 创建一个表示远程 url 的类文件对象 urllib.urlopen(" ") 如同本地文件一样读取内容 print data的输出结果: 摘取动画所需数据

Manonll的博客 2484

别再瞎选了!手把手教你根据车型等级,在CarSim里快速匹配最合适的动力学模型

本文详细介绍了如何在CarSim中根据车型等级快速匹配最合适的动力学模型,提升仿真效率。通过分析CarSim模型库与A/B/C/D级车标准的对应关系,提供四步精准定位方法和不同车型的特殊处理技巧,帮助工程师避免常见错误,显著缩短模型准备时间。

weixin_27015733的博客 261

Puppeteer核心用法详解:Cookie设置、Header限制与页面加载等待

摘要:Puppeteer核心功能详解,涵盖Cookie设置、Header限制和页面加载等待三大关键点。Cookie需通过setCookie()方法设置,注意域名和路径匹配;Header中User-Agent和Cookie需用专用方法设置;页面加载建议结合waitUntil选项、延时和readyState检查,确保动态内容完整加载。这些技巧对自动化测试和网页抓取至关重要。

修炼魔法中.... 1002

rk3568 rockit编译测试

编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。此处跳过系统,单领出来编译。rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。

zfenggo的博客 4195

【实战】1382- 一文拥有属于你的 puppeteer 爬虫应用

王志远,微医前端技术部。爱好吉他、健身、桌游,最最关键,资深大厂员工(kfc外卖小哥),trust me,好奇心使生命有趣起来!背景公司有日报,每天需要在公司的周报系统中填写并提交,日报内容很简单,业务层面把自己的提交记录整理下,然后加点其他如架构、团队等方面的产出就好;但每次都要【打开周报系统 - 登陆 - 复制粘贴 - 提交】,觉得很麻烦,之前了解过前端爬虫神器 pu...

pingan8787 2182

基于机器学习和深度学习的新能源功率预测研究综述--学术论文模式--个人梳理

本文是博主根据前人的研究成果总结的机器学习和深度学习等理论方法在新能源功率预测领域的相关研究内容要点,按照学术科技论文写作的模式进行的呈现,包括文章引用等也都做了详细的批注,花了很多时间和心血,一方面是对自己学习成果的一些总结,另一方面也希望对大家有用(尽量不要直接copy哦,转载请标注,如有不当请评论或私信指出哦可再生能源的间歇性给新型电力系统的运行带来了巨大挑战,准确地预测新能源出力对于电网的安全可靠运行尤为重要。

干吧滴! 6320

避坑指南:新手爬百度图片3个致命错,改完批量保存本地(亲测有效)

新手爬百度图片的核心是“绕开静态HTML,抓准API接口+处理反爬+提取原图”,改完本文提到的3个核心错,就能稳定批量保存高清图片。这套思路可复用在其他图片网站(如必应图片、360图片),只需修改API接口和参数即可。如果想进一步优化,可添加代理IP池、多线程下载(新手不建议,容易触发反爬)、图片去重等功能!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1585

node.js实现爬虫

Node.js实现爬虫 什么是爬虫?  网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。大多数爬虫都是按“发送请求”-“获取页面”-“解析页面”-"抽取并储存内容"这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。 所需要的模块 puppeteer,下载puppeteer模块,用于Node.js爬虫 mongoose,下载mongoo

认定的总要想办法去完成。 2123

YOLOv改进 | YOLOv11更换主干Backbone之MobileNetV2(轻量化主干网络结构--高效轻量移动模型)

本文提出将YOLOv11的主干网络替换为轻量化的MobileNetV2,以提升模型在移动端设备的部署效率。MobileNetV2通过倒残差结构和线性瓶颈层,显著减少了计算量和参数量(降至1M~3M),同时保持多尺度特征提取能力。实验表明,改进后的模型在移动设备上可实现20-30 FPS的实时检测,适用于手机APP、无人机和工业监控等场景。核心代码展示了倒残差块的实现,通过深度可分离卷积和通道扩展/压缩实现高效特征提取。

走向CTO的路上... 1458

node爬虫爬取豆瓣电影数据

简介 SuperAgent是一个轻量级、灵活的、易读的、低学习曲线的客户端请求代理模块,使用在NodeJS环境中。 请求 //可以调用request对象then()或者end()方法,或者使用await关键字,可以使用完整的urls,由于同城策略的原因,这需要服务实现跨域访问 var request = require('superagent') request .get('https://...

weixin_44927460的博客 1127

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用puppeteer爬取数据

使用puppeteer爬取数据使用教程环境安装简单使用截屏爬取网页数据 使用教程 Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。Puppeteer 默认以 headless 模式运行,但是可以通过修改配置文件运行“有头”模式。 环境安装 npm i puppeteer # or yarn add p...

Magnolia的博客 1132

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Vue基于网络爬虫的热门图书推荐系统 数据可视化分析系统_43g6pot8

Python语言Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,其设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Flask框架Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。

wx_bishe288的博客 910

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Puppeteer使用示例详解

PhantomJS曾经是无头浏览器里的王者,测试、爬虫等都在使用,随着GoogleChrome Headless的出现,PhantomJS的作者已经明确表示不在更新,而GoogleChrome Headless将会是未来爬虫的趋势,而测试将依然会使用Webdriver那套方案,GoogleChrome Headless可以利用WebDriver调用,也可以使用其集成的API――Puppeteer(操纵木偶的人),他的功能和他的名字一样强大,可以随意操控Chrome或Chromeium,缺点就是只有node的

wx1871428的博客 1571

使用Puppeteer撸一个爬虫

为什么80%的码农都做不了架构师?>>> ...

weixin_33909059的博客 264

从网页中提取结构化数据:Puppeteer和Cheerio的高级技巧

在本文中,我们将介绍两个常用的网页数据抓取工具:Puppeteer和Cheerio。Puppeteer是一个基于Node.js的无头浏览器库,它可以模拟浏览器的行为,如打开网页、点击元素、填写表单等。Cheerio是一个基于jQuery的HTML解析库,它可以方便地从HTML文档中提取数据,如选择器、属性、文本等。我们将结合这两个工具,展示如何从网页中提取结构化数据,并给出一些高级技巧,如使用代理IP、处理动态内容、优化性能等。

ip16yun的博客 903

puppeteer爬取豆瓣top250电影及详细信息

const puppeteer = require('puppeteer'); const fs = require('fs'); // 豆瓣top250电影 async function top250(i) { const browser = await puppeteer.launch({ headless: false, //关闭无头模式 defaultViewport: { width: 1200, hei

赵盛的博客 1343

node.js使用puppeteer无头浏览器爬取豆瓣电影

const puppeteer = require('puppeteer') const url = `https://movie.douban.com/tag/#/?sort=T&amp;amp;range=0,10&amp;amp;tags=` const sleep = time =&amp;gt;{ new Promise(resolve=&amp;gt;{ //成功执行 try{ setTime...

SquirrelPineal的博客 3521

puppeteer学习(三)——抓取“相关搜索”关键词&搜索豆瓣图书榜

抓取“相关搜索”关键词在puppeteer学习(二) 中介绍了自动访问百度网站的例子,在此基础上,下面的例子 抓取了相关搜索的关键词(百度下面有一个相关搜索的功能)。 代码如下:// 演示自动访问百度网站并抓取相关搜索关键词 const puppeteer = require('puppeteer');(async () => { const browser = await puppeteer

zrxJuly 4894

Node puppeteer 爬虫用法

puppeteer 中文文档 开始 // 设置国内源,否则下载puppeteer很慢 shell> npm config set registry http://registry.npm.taobao.org shell> npm init -y shell> npm i puppeteer@3.1.0 爬取豆瓣书籍列表 豆瓣读书 在这个页面输入javascript,然后爬取列表 案例特征:需要点击下一步才能获取数据 /* 1. 进入豆瓣读书首页,在输入框输入javascript,点

visitor009的博客 425

vue mysql webapp,Vue开发的电影预告webApp介绍__Vue.js__前端__数据库__七牛云

即将迎来的端午小假期,小伙伴们都准备好怎么度过了么????。我每次出去玩都避免不了去看场电影,这次借此机会向大家介绍下我开发的可以查看电影预告片的小项目,希望大家可以去测试,浏览一波即将上映的电影同时可以帮助我测试一下,指出不足,我都会虚心接受的呦!谢谢大家。项目演示地址效果图项目介绍前端是通过vue-cli进行构建项目,后端接口是使用Koa进行编写的。电影相关数据是使用puppeteer进行爬取并存在...

weixin_39950081的博客 308

Puppeteer使用示例

PhantomJS曾经是无头浏览器里的王者,测试、爬虫等都在使用,随着GoogleChrome Headless的出现,PhantomJS的作者已经明确表示不在更新,而GoogleChrome Headless将会是未来爬虫的趋势,而测试将依然会使用Webdriver那套方案,GoogleChrome Headless可以利用WebDriver调用,也可以使用其集成的API——Puppeteer(...

Tilyp的博客 8606

分享58个NodeJs爬虫源码总有一个是你想要的

仿简书nx+nodejs+nestjs6+express+mongodb+angular8+爬虫。基于nodejs的网络聊天室、爬虫,vue音乐播放器,及php后台开发的管理系统等项目。基于nodejs的zhihu爬虫,x-zse-96,支持文章,评论,图片下载到本地。nodejs爬虫,puppeteer爬虫,爬取汽车之家车型数据,爬省市区信息。NodeJS某东商品详情页爬虫:轮播图,详情图,价格,店铺信息,是否自营等。nodejs 爬虫,包括不限于微博,instagram,图片和视频。

weixin_47730343的博客 634
上一篇: 各种数据类型在内存中的存储内容
下一篇: Win10 免密登录Linux服务器
Morphlng
博客等级 码龄8年 1157粉丝 41原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值