使用 Puppeteer 快速上手 Node.js 爬虫

embedded/2024/12/20 7:33:50/

使用 Puppeteer 库通过自动化浏览器来访问百度图片搜索,并在搜索结果中下载图片。代码分为两部分:

  1. 自动化浏览器任务:使用 Puppeteer 浏览百度图片搜索并获取图片 URL。
  2. 图片下载:检查图片 URL 类型(base64 或 URL),并保存图片到本地。

如果无法通过npm安装:

确保 Puppeteer 的下载地址已经指向淘宝镜像
set PUPPETEER_DOWNLOAD_HOST=https://npmmirror.com/mirrors 

示例: 

javascript">import puppeteer from 'puppeteer';
import http from "http";
import https from "https";
import fs from "fs";
import {promisify} from 'util';
import qs from "querystring";
import {v4} from "uuid";(async () => {const browser = await puppeteer.launch({headless: false, // 打开浏览器browser: "chrome",slowMo: 250, // slow down by 250ms// executablePath:'', // 其它浏览器打开地址});const page = await browser.newPage();await page.goto('https://image.baidu.com/');console.log('goto: https://image.baidu.com/');await page.setViewport({width: 1920, height: 1080});let count = 0;while (count < 60) {try {await page.focus('[name="word"]');break;} catch (err) {count++;await page.reload();console.log('[name="word"] selector not found, try again');}}// 通过属性获取指定input,填入搜索框文字await page.keyboard.sendCharacter('卡皮巴拉');// 等于上面两条 page.focus page.keyboard.sendCharacter// await page.type('#kw', '卡皮巴拉', { delay: 100 });await page.click('.submit-btn_ZmEXZ');// await page.reload();page.on('load', async () => {console.log('page loaded!');await page.waitForSelector('.main_img');// evaluate 中会在浏览器端运行js代码。const src = await page.evaluate(() => {const images = document.querySelectorAll('.main_img');// 在puppeteer打开的浏览器查看console.log(images);// return images.map(img => img.src);return Array.prototype.map.call(images, img => img.src);});await Promise.all(src.map(src => {console.log(src);return downloadImage(src, './image/p1/');}));await page.screenshot({path: './screenshot.png',});await browser.close();});
})();const urlToImage = (url, dir, callback) => {const mod = /^https:/.test(url) ? https : http;const ext = qs.parse(url).f.split('?').shift().toLowerCase().replace('jpeg', 'jpg');const file = `${dir}${v4()}.${ext}`;return new Promise((resolve, reject) => {mod.get(url, res => {// 使用 fs.createWriteStream 创建文件流const writeStream = fs.createWriteStream(file);// 将响应数据流管道到文件写入流res.pipe(writeStream);// 在写入完成时调用回调writeStream.on('finish', () => {console.log(file);resolve();});});});
};const base64ToImage = async (base64, dir) => {try {const matches = base64.match(/^data:(.+?);base64,(.+)$/);const ext = matches[1].split('/')[1].replace('jpeg', 'jpg');const file = `${dir}${v4()}.${ext}`;await promisify(fs.writeFile)(file, matches[2], 'base64');} catch (err) {console.log(err);}
}async function downloadImage(src, dir) {if (/data:(.+?);base64,(.+)/.test(src)) {await base64ToImage(src, dir);} else if (src.startsWith('http')) {await urlToImage(src, dir);} else {console.log('[error] download fail, unsupported image type!', src);}
}


http://www.ppmy.cn/embedded/147217.html

相关文章

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…

使用支持向量机(SVM)实现二分类

前言: 支持向量机(Support Vector Machine,SVM)是一种监督式学习的机器学习算法,主要用于分类和回归分析。其基本思想是在特征空间中找到一个最优的超平面,将不同类别的数据点尽可能地分开。在分类问题中,这个超平面能够使两类数据点之间的间隔(Margin)最大化。 我认…

在 Linux 系统中,让 apt 使用 HTTP 代理

在 Linux 系统中&#xff0c;要让 apt 使用 HTTP 代理&#xff0c;有几种方法可以实现&#xff1a; ### 1. 临时设置代理 你可以通过设置环境变量来临时为 apt 命令设置代理。这种方法不需要修改任何配置文件&#xff0c;只需在命令行中设置环境变量即可。例如&#xff1a; …

新华三OSPF学习

OSPF-基配置演示 ospf dr-priority #修改竞选DR优先级 R1 [R1]interface g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [R1-GigabitEthernet0/0/0]interface g0/0/1 [R1-GigabitEthernet0/0/1]ip add 10.1.12.1 24 [R1-GigabitEthernet0/0/1]interface g0/0/2…

解释工厂模式

参考文献&#xff1a;C几种工厂模式和实现实例_工厂方法模式c实例-CSDN博客 什么是工厂模式 工厂模式是一种创建对象的设计模式&#xff0c;它提供了一种创建对象的方式&#xff0c;将对象的创建和使用分离 通过工厂模式&#xff0c;可以根据不同的条件创建不同类型的对象&a…

快消品 B2B 困境与破局:基于 2+1 链动模式与 S2B2C 商城小程序的思考

摘要&#xff1a;本文深入剖析了快消品 B2B 行业面临的困境&#xff0c;包括诸多平台的衰落以及在用户端、品牌商、中间商和零售小店多方面遭遇的阻碍&#xff0c;揭示其脱离 C 端用户、缺乏各方支持而陷入“姥姥不疼&#xff0c;舅舅不爱”的尴尬处境。在此基础上&#xff0c;…

uni-app创建微信小程序

UniApp 是一个基于 Vue.js 语法的跨平台开发框架&#xff0c;它允许开发者使用一套代码构建适用于 iOS 、 Android 、 Web 以及各种小程序和快应用的应用程序 一、环境搭建 安装使用教程&#xff1a;https://blog.csdn.net/YuanFudao/article/details/132384692 二、项目基本…

SpringBoot 整合 SQLite 数据库

1、SQLite 简介 SQLite 是一个很轻量的关系型数据库&#xff0c;不需要安装服务&#xff0c;数据存储在文件里。 2、引入pom依赖 <!-- SQLite --><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><v…