javascript - 如何用 puppeteer 抓取 src 图像?
问题描述
我需要弹出链接中的 src 图像。 https://www.tokopedia.com/pusatvalve/1-2-inch-ball-valve-sankyo-mojekerto 我试过这样
const popup = await page.$('div.css-hnnye.ew904gd0');
const maxLoop = await page.evaluate(() => {
let contain = document.querySelectorAll('div.css-1muhp5u.ejaoon00');
return contain.length;
});
let image1 = '';
let image2 = '';
let image3 = '';
let image4 = '';
let image5 = '';
if (0 <= Number(maxLoop)) {
image1 = await popup.evaluate( popup => {
popup.click()
let image = document.querySelector('img.css-udmgcf').src;
return image;
} );
}
await page.keyboard.press('Escape');
await page.keyboard.up('Escape');
await page.click('div.css-xwybk > div > div > div:nth-child(2) > div');
const popup2 = await page.$('div.css-hnnye.ew904gd0');
if (1 <= Number(maxLoop)) {
image2 = await popup2.evaluate( popup2 => {
popup2.click()
let image = document.querySelector('img.css-udmgcf').src;
return image;
} );
}
image1 !== '' ? item.image1 = image1 : '';
image2 !== '' ? item.image2 = image2 : '';
image3 !== '' ? item.image3 = image3 : '';
image4 !== '' ? item.image4 = image4 : '';
image5 !== '' ? item.image5 = image5 : '';
但结果总是一样的。结果
注意:我想获取格式 src .jpeg 在此处输入图像描述
解决方案
你可以尝试做这样的事情:
const puppeteer = require('puppeteer')
const PAGE_URL = ' ... ' // the page to scrape the images from
const browser = puppeteer.launch({
headless: true
});
(async function () {
const page = await (await browser).newPage()
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await page.setViewport({ width: 960, height: 768 });
await page.goto(PAGE_URL, {
timeout: 60000
})
const scrapedImages = await page.evaluate(async () => {
const asyncSleep = (ms) => new Promise((rs, _) => setTimeout(rs, ms))
const images = []
for (const eachThumbnail of document.querySelectorAll("div[data-testid='PDPImageThumbnail'] > div > img")) {
await eachThumbnail.click()
let imageSrc = document.querySelector("div[data-testid='PDPImageMain'] > div > div > img").src
while (images.includes(imageSrc) || imageSrc.startsWith('data:')) {
imageSrc = document.querySelector("div[data-testid='PDPImageMain'] > div > div > img").src;
await asyncSleep(1000)
}
images.push(imageSrc)
}
return images
})
console.log(scrapedImages)
})()
这里脚本使用data-testid
属性来选择元素,因为它与div.css-xwybk
其他类似的类名相比更稳定(我假设它会经常更改)。
另一件事是由于缩略图不是原始大小,脚本单击它们并等待原始图像呈现然后存储 url。(也避免使用 base64 图像 src,因为它们用于显示加载指示器)。
注意:在您对任何站点执行任何自动化操作之前,请确保您所做的事情没有被禁止或违反站点的政策。(这个答案是为了向您展示如何将 puppeteer 用于此目的,而不是鼓励您这样做)
推荐阅读
- java - 使用 IntStream 检查二维数组中的数组
- node.js - node-sqlite 插入在非空约束上失败,但数据在那里?
- c# - c# 最安全的方法检查一个类型是否在其接口中包含一个类型
- python-3.x - 求总和,使用 for 循环遍历两个字典,将键值相乘
- c# - 真的有一个有效的代码路径,这个函数不会返回一个值吗?
- c# - 无法使用 MRTK v2.0.0-RC1 构建
- mysql - mySQL:在插入查询中插入查询值
- python - 给定一个字典和一个序列在python中返回它的总数
- sql - SQL Server 注入触发器被忽略?
- css - 如何修复我的表格的标题,使它们不会滚动