Node.js 无头Chrome(木偶演员)在本地docker和远程docker(AWS EC2)中运行的不同行为

Node.js 无头Chrome(木偶演员)在本地docker和远程docker(AWS EC2)中运行的不同行为,node.js,google-chrome,cookies,puppeteer,headless,Node.js,Google Chrome,Cookies,Puppeteer,Headless,我正在尝试调试一个问题,该问题导致headless Chrome在本地环境和远程环境(如AWS或Heroku)上的行为不同。 应用程序尝试在LinkedIn上搜索公共可用的作业,无需验证(无需查看配置文件),url格式如下: 当我在本地环境中打开此url时,我没有问题,但当我尝试在远程计算机(如AWS EC2或Heroku Dyno)上执行相同操作时,LinkedIn会将我重定向到登录表单。为了调试这一差异,我构建了一个Docker映像(基于),以与本地Chrome/profile隔离: Doc

我正在尝试调试一个问题,该问题导致headless Chrome在本地环境和远程环境(如AWS或Heroku)上的行为不同。 应用程序尝试在LinkedIn上搜索公共可用的作业,无需验证(无需查看配置文件),url格式如下:

当我在本地环境中打开此url时,我没有问题,但当我尝试在远程计算机(如AWS EC2或Heroku Dyno)上执行相同操作时,LinkedIn会将我重定向到登录表单。为了调试这一差异,我构建了一个Docker映像(基于),以与本地Chrome/profile隔离:

Dockerfile

FROM buildkite/puppeteer

WORKDIR /app

COPY . .

RUN npm install

CMD node index.js

EXPOSE 9222
index.js

const puppeter=require(“puppeter额外”);
木偶师。使用(需要(“木偶师额外插件隐形”)();
const testpuppeter=async()=>{
console.log(“打开浏览器”);
const browser=wait puppeter.launch({
无头:是的,
slowMo:20,
args:[
'--远程调试地址=0.0.0.0',
“--远程调试端口=9222”,
“--单进程”,
“--lang=en GB”,
“--禁用开发人员shm使用”,
“没有沙箱”,
“--禁用setuid沙盒”,
“--代理服务器=”直接:/“,
“--代理绕过列表=*”,
“--禁用gpu”,
“--允许运行不安全的内容”,
“--启用自动化”,
],
});
console.log('打开页面…');
const page=wait browser.newPage();
console.log(“页面打开”);
常量url=”https://www.linkedin.com/jobs/search?keywords=Engineer&location=New+York&redirect=false&position=1&pageNum=0”;
log('打开url',url);
等待页面。转到(url{
waitUntil:'networkidle0',
});
log('Url open');
//page&等待page.close();
//浏览器&等待浏览器。关闭();
日志(“完成!保持页面打开以便远程检查…”);
};
(异步()=>{
等待测试木偶演员();
})();
可以找到用于此测试的docker映像。 我已使用以下命令在本地环境中运行映像:

docker运行-p 9222:9222 spinlud/Puppeter linkedin测试
然后从本地Chrome浏览器
chrome://inspect
应该可以检查应用程序的GUI(我故意在headless browser中打开页面):

正如您可以看到的,即使在本地docker中,页面也会在没有身份验证的情况下打开

我在AWSEC2(AmazonLinux2)上做了同样的测试。它需要是具有SSH访问权限的公共实例和入站规则,以允许通过端口9222进行通信(用于远程Chrome调试)。 我运行了相同的命令:

docker运行-p 9222:9222 spinlud/Puppeter linkedin测试
然后再次从本地Chrome浏览器
chrome://inspect
,一旦添加了EC2的远程公共IP,我就能够检查远程无头Chrome的GUI:

正如您这次看到的,LinkedIn需要身份验证。我们还可以看到cookies中的差异:

我无法理解本地和远程环境之间这种不同行为背后的原因。理论上,Docker应该提供隔离,在这两种环境中,无头浏览器应该在没有cookie和新的(空会话)的情况下启动。仍然存在差异,我不明白为什么


有人有什么线索吗?

你知道了吗?我认为原因在于AWS IP范围。与Linkedin处理Tor的方式相同。为了克服这个问题,您可以查看代理列表。同样,他们中的一些人也在Linkedin黑名单中。是的,这肯定与ip有关。这种情况也发生在Heroku和Travis CI机器上,它们都托管在AWS上。对于不需要刮刀的站点,其他刮刀作业可能存在问题。