Please enable Javascript to view the contents

简易 Playwright 爬虫,帮你实现壁纸自由

 ·  ☕ 2 分钟

vavebg.com

最近发现一个非常哇塞的壁纸网站:Vave BG - Unsplash but for background

vavebg

“Vave BG “是一个人工智能生成的图片项目,由 Gyoza 于 2023 年 10 月创建。目前,Vave BG 作为一个类似于 Unsplash 的图片库在运营,所有图片均由 Gyoza 使用各种人工智能工具精心制作而成,其中大部分图片目前是通过 Midjorney 生成的。

Vave BG 在 CC0 许可下运行,这是一项极为宽松的协议,允许他人以几乎任何目的自由下载、修改、分发甚至商业化 Vave BG 上的作品。这种自由延伸到艺术作品的使用,无需额外许可或承担经济责任。通过采用 CC0 许可,Vave BG 打开了无限创意探索和跨领域合作的大门,邀请个人无拘无束地参与、改编艺术作品,甚至从中获利。


非常 Nice 的壁纸网站,并且是AI生成的,免费无版权,可以自由使用。跟我的 魔力美少女 – 你的 AI 女孩!AI画图 | AIGC 有异曲同工之妙。

于是我用 Playwright 写了一个爬虫,把这个网站的壁纸全部下载下来,并且把相关的Prompt信息等元数据也保存下来。

vavebg

Playwright 爬虫

Playwright 是一个 Node.js 库,用于自动化 Chromium、WebKit 和 Firefox 浏览器。Playwright 旨在提供一个更快、更可靠和更精确的替代方案,与 Puppeteer 兼容。

安装 Playwright

  1. 安装 Playwright 支持的浏览器二进制文件
1
npx playwright install

你也可以单独安装某个浏览器的二进制文件,比如:单独安装 Chromium

1
npx playwright install chromium
  1. 安装 Playwright 的 Node.js 库
1
npm i playwright

实现原理

实现原理很简单,就是用 Playwright 打开网页,然后模拟鼠标滚动,把所有的壁纸都加载出来,然后获取所有的壁纸链接,再逐个打开壁纸详情页,获取壁纸的标题、描述、下载链接等信息,最后把壁纸下载下来。

完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// index.js
const fs = require('fs');
const https = require('https');
const playwright = require('playwright');

(async () => {
    // const browser = await playwright.chromium.launch({ headless: false });
    const browser = await playwright.chromium.launch();
    const context = await browser.newContext();
    const page = await context.newPage();
    
    await page.goto('https://vavebg.com/');

    function scrollToBottom(times) {
        if(times == 0) return;
        page.evaluate(() => {
            window.scrollBy(0, window.innerHeight);
        });
        page.waitForTimeout(1000);
        scrollToBottom(times - 1);
    }

    scrollToBottom(100);


    const links = await page.$$eval('a.framer-8q182g', (links) => {
        return links.map((a) => a.href);
    });

    for (const link of links) {
        console.log(link);
        await page.goto(link);
        const div = await page.$('div.framer-1fdy7hm');
        const title = await div.$eval('div.framer-1r7ny1t', (div) => div.textContent);
        if(fs.existsSync(title)) continue;
        const prompt = await div.$eval('div.framer-1ulmyg', (div) => div.textContent);
        const downloadLink = await div.$eval('div.framer-j8crh3-container a', (a) => a.href);
        fs.mkdirSync(title);
        fs.writeFileSync(`${title}/readme.md`, `# ${title}\n\n${prompt}\n\n![${title}](${downloadLink})\n\n[Download](${downloadLink})`);
        console.log(downloadLink);
        https.get(downloadLink, (res) => {
            res.pipe(fs.createWriteStream(`${title}/${title}.jpeg`));
        });
        await page.waitForTimeout(1000);
    }
    page.close();
    
    
})();

node index.js 即可。

打包下载

我把所有的壁纸打包下载了,放在了我的网盘上,有需要的可以下载。

链接:https://pan.baidu.com/s/1WALU6BcEZcFRNz9sMEsc6Q?pwd=1234
提取码:1234

分享

码中人
作者
码中人
Web Developer