有没有办法在 Playwright 或 Puppeteer 上同时打开多个选项卡来完成相同的任务?

Is there a way to open multiple tabs simultaneously on Playwright or Puppeteer to complete the same tasks?

我刚开始编码,我想知道是否有办法同时打开多个选项卡。目前,我的代码是这样的:

const puppeteer = require("puppeteer");

const rand_url = "https://www.google.com";

async function initBrowser() {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto(rand_url);
  await page.setViewport({
    width: 1200,
    height: 800,
  });

  return page;
}

async function login(page) {
  await page.goto("https://www.google.com");
  await page.waitFor(100);
  await page.type("input[id ='user_login'", "xxx");
  await page.waitFor(100);
  await page.type("input[id ='user_password'", "xxx");
}

这不是我的确切代码,替换为不同的别名,但你明白了。我想知道是否有人知道允许在多个实例上打开完全相同的浏览器的代码,仅替换相应的登录信息。当然,最好不要让我的 IP 也被禁止,所以如果有一种方法可以将代理应用于每个相应的“浏览器”/实例,那就完美了。

最后,我想知道剧作家或木偶演员在处理这些多重事件方面是否更胜一筹。我什至不知道这是否可能,但请赐教。我想了解更多。

有分析和代理选项;您可以将它们结合起来以实现您的目标:

Profile, https://playwright.dev/docs/api/class-browsertype#browser-type-launch-persistent-context

import { chromium } from 'playwright'
const userDataDir = /tmp/ + process.argv[2]
const browserContext = await chromium.launchPersistentContext(userDataDir)
// ...

Proxy, https://playwright.dev/docs/api/class-browsertype#browser-type-launch

import { chromium } from 'playwright'
const proxy = { /* secret */ }
const browser = await chromium.launch({
  proxy: { server: 'pre-context' }
})
const browserContext = await browser.newContext({
  proxy: {
    server: `http://${proxy.ip}:${proxy.port}`,
    username: proxy.username,
    password: proxy.password,
  }
})
// ...

您可以使用多个浏览器 window 作为不同 login/cookies。
为简单起见,您可以使用 Thomas Dondorf 的 puppeteer-cluster 模块。
这个模块可以让你的 puppeteer 一个接一个地启动和排队,这样你就可以用它来自动登录,甚至可以为下一次启动保存登录 cookie。
随意前往Github:https://github.com/thomasdondorf/puppeteer-cluster

const { Cluster } = require('puppeteer-cluster')

(async () => {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT,
    maxConcurrency: 2, // <= this is the number of
                       // parallel task running simultaneously
  })                   // You can change to the number of CPU
  const cpuNumber = require('os').cpus().length // for example

  await cluster.task(async ({ page, data: [username, password] }) => {
    await page.goto('https://www.example.com')
    await page.waitForTimeout(100)
    await page.type('input[id ="user_login"', username)
    await page.waitForTimeout(100)
    await page.type('input[id ="user_password"', password)
    const screen = await page.screenshot()
    // Store screenshot, Save Cookies, do something else
  });

     cluster.queue(['myFirstUsername', 'PassW0Rd1'])
     cluster.queue(['anotherUsername', 'Secr3tAgent!'])
  // cluster.queue([username, password])
  // username and password array passed into cluster task function 
  // many more pages/account

  await cluster.idle()
  await cluster.close()
})()

对于 Playwright,遗憾的是仍然不受上述模块的支持,
您可以使用浏览器池(集群)模块来自动化 Playwright 启动器。

对于代理使用,我推荐 Puppeteer 库作为传说中的库。

如果对您有帮助,请不要忘记选择我的答案。