公共 LinkedIn 页面需要在 Puppeteer 中进行身份验证,但在 Chromium/Chrome 中手动粘贴 URL 时不需要进行身份验证

rev*_*evy 5 javascript google-chrome node.js headless-browser puppeteer

我试图使用Puppeteer在 Linkedin 上打开一个上市公司页面,但每次它都会重定向到身份验证表单。当我在 Chromium 或 Chrome 中手动粘贴 URL 时,不会发生这种情况。

这是代码:

const puppeteer = require("puppeteer");

(async () => {
    const url = "https://www.linkedin.com/company/google/";

    const browser = await puppeteer.launch({
        headless: false,
        args: [
            "--lang=en-GB",
            "--no-sandbox",
            "--disable-setuid-sandbox",
            "--disable-gpu",
            "--disable-dev-shm-usage",
        ],
        defaultViewport: null,
        pipe: true,
        slowMo: 30,
    });

    const page = await browser.newPage();

    await page.goto(url, {
        waitUntil: 'networkidle0',
    });

    await page.waitForSelector(".top-card-layout__entity-info-container", { timeout: 10000 });

    await page.close();
    await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

这是浏览器重定向的地方:

在此输入图像描述

https://www.linkedin.com/company/google/如果我在 Chromium 或 Chrome 中手动粘贴 URL,则不会发生这种情况。

到目前为止我已经尝试过:

  • 使用incognito浏览器上下文:
// [...]

const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();

// [...]
Run Code Online (Sandbox Code Playgroud)
const puppeteer = require("puppeteer-extra");
puppeteer.use(require("puppeteer-extra-plugin-stealth")());

// [...]
Run Code Online (Sandbox Code Playgroud)
const randomUserAgent = require("random-useragent");

// [...]

await page.setUserAgent(randomUserAgent.getRandom());

// [...]
Run Code Online (Sandbox Code Playgroud)

没有任何效果。还有什么我可以尝试的吗?

the*_*ton 3

原因

\n

这是由于微软对配置文件的极端保护。如果您能够以隐身模式访问公开资料,我认为是某些共享 cookie 造成的,但通常情况下,由于 AuthWall(在这种情况下会阻止您),您无法在不登录的情况下访问 LinkedIn 上的公开公司资料。对我来说,即使是在非隐身窗口中,也始终需要登录。

\n

数据专家 John Koala 的一些背景知识:

\n
\n

当微软收购 LinkedIn 时,他们投资了数十亿美元。\n他们也开始采取行动,很快他们就与抓取展开了斗争。\n像现在这样出名的公司,由于它\xe2\x80\x99的法庭诉讼,\xe2\x80\x9cHiQ Labs \xe2\x80\x9d利用LinkedIn数据赚取巨额利润。

\n

现在,LinkedIn 面临的问题是,公共抓取不构成法律犯罪,他们未能(像所有其他网站一样)阻止成熟的公共抓取。

\n

因此LinkedIn添加并加强了一个名为\xe2\x80\x9cAuthwall\xe2\x80\x9d的功能,这是一个非常敏感的抓取检测。它很少允许来自非授权帐户的任何公共视图,因此无法在没有帐户的情况下进行抓取。

\n

使用帐户进行抓取是一种违法行为,而且\xe2\x80\x99 的难度要大得多,因为需要维护帐户。\n此时 HiQ Labs 和所有其他抓取公司都倒闭了。\nHiQ 的利润下降了数百万美元在水槽边,他们在法庭上与 LinkedIn 展开了斗争。

\n

唯一剩下的公司是 \xe2\x80\x9cscraping.services\xe2\x80\x9c,未来几年将会发生的事情将会很有趣。

\n
\n

资料来源:John Koala,为什么 LinkedIn 不再允许我在不登录的情况下查看公开个人资料?在: 法定人数

\n

我确信整个前 puppeteer 团队现在在 Microsoft 工作这一事实也不会让欺骗 AuthWall 变得更容易(参见:即使使用 puppeteer-extra-plugin-stealth 也无法访问该页面)。

\n
\n

解决方案

\n

稳定访问 LinkedIn 页面的唯一方法是使用表单登录(或使用已登录且已具有有效会话 cookie 的 chrome 配置文件)。

\n

更新:由于使用现有帐户进行抓取违反了 LinkedIn 的用户协议:不建议这样做。我的上述解决方案仅适用于一次性访问(无论如何这都不是有效的场景)。所以最终的答案是:不可能用 puppeteer 访问这些配置文件。

\n