本帖最后由 vombel 于 2022-12-6 05:15 编辑
前情提要:
puppeteer是一个谷歌官方的操作chrome的nodejs API库,可以在无浏览器界面的情况下的进行拿到DOM结构、执行js代码、模拟操作,
在nodejs环境下运行
代码中的下载方式是从浏览器页面文件结构中直接拿的,能用浏览器看到就能下。
要用网络请求图片链接方式下载,请使用其他下载模块
const puppeteer = require("puppeteer");
const downloadFile = require("./utils/download");
async function load() {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36");
//这段代码抄的不解释,好用就完了 可以直从页面的文件结构中下载图片
async function getResourceContent(page, url) {
const { content, base64Encoded } = await page._client.send(
"Page.getResourceContent",
{ frameId: String(page.mainFrame()._id), url }
);
return content;
}
for (let i = 1; i < 7139012; i++) {
//爬了某网站几千张就被封了...自行寻找单页大图 url规律的网页进行访问抓取
await page.goto(`https://xxxxxxx/posts/${i}`);
let targetImg = await page.$("#image");
if (targetImg) {
const url = await page.$eval("#image", (i) => i.src);
const content = await getResourceContent(page, url);
const contentBuffer = Buffer.from(content, "base64");
fs.writeFileSync(
`./image/${Date.now()}.jpg`,
contentBuffer,
"base64"
);
console.log(`下载第${i}张`);
}
await page.waitFor(1000);
}
//等待
console.log("结束了");
browser.close();
}
load();
|