问题描述
我正在尝试调试一个问题,该问题导致使用Puppeteer的无头Chrome在我的本地环境和远程环境(例如AWS或Heroku)上的行为有所不同。 该应用程序尝试在不进行身份验证的情况下搜索LinkedIn上的公共可用职位(无需查看个人资料),URL格式如下:https://www.linkedin.com/jobs/search?keywords=Engineer&location=New+York&redirect=false&position=1&pageNum=0
当我在本地环境中打开此URL时,我没有问题,但是当我尝试在诸如AWS EC2或Heroku Dyno之类的远程计算机上执行相同操作时,LinkedIn会将我重定向到登录表单。为了调试这种差异,我构建了一个Docker映像(基于this image)以与本地Chrome /配置文件隔离:
Dockerfile
FROM buildkite/puppeteer
workdir /app
copY . .
RUN npm install
CMD node index.js
EXPOSE 9222
index.js
const puppeteer = require("puppeteer-extra");
puppeteer.use(require("puppeteer-extra-plugin-stealth")());
const testPuppeteer = async () => {
console.log('opening browser');
const browser = await puppeteer.launch({
headless: true,slowMo: 20,args: [
'--remote-debugging-address=0.0.0.0','--remote-debugging-port=9222','--single-process','--lang=en-GB','--disable-dev-shm-usage','--no-sandBox','--disable-setuid-sandBox',"--proxy-server='direct://",'--proxy-bypass-list=*','--disable-gpu','--allow-running-insecure-content','--enable-automation',],});
console.log('opening page...');
const page = await browser.newPage();
console.log('Page open');
const url = "https://www.linkedin.com/jobs/search?keywords=Engineer&location=New+York&redirect=false&position=1&pageNum=0";
console.log('opening url',url);
await page.goto(url,{
waitUntil: 'networkidle0',});
console.log('Url open');
// page && await page.close();
// browser && await browser.close();
console.log("Done! Leaving page open for remote inspection...");
};
(async () => {
await testPuppeteer();
})();
此测试使用的docker映像可以找到here。 我已经使用以下命令在本地环境中运行了该映像:
docker run -p 9222:9222 spinlud/puppeteer-linkedin-test
然后从本地Chrome浏览器chrome://inspect
中可以检查应用程序的GUI(我故意在无头浏览器中打开页面):
您甚至可以在本地docker中看到该页面,无需身份验证即可打开。
我已经在AWS EC2(Amazon Linux 2)with Docker installed上进行了相同的测试。它必须是具有SSH访问权限和入站规则的公共实例,以允许通过端口9222进行通信(用于远程Chrome调试)。 我运行了相同的命令:
docker run -p 9222:9222 spinlud/puppeteer-linkedin-test
然后再次从本地Chrome浏览器chrome://inspect
,添加了EC2的远程公共IP,我也能够检查远程无头Chrome的GUI:
如您所见,这次LinkedIn要求进行身份验证。我们还可以看到Cookie的不同之处:
我不了解本地环境和远程环境之间这种不同行为背后的原因。从理论上讲,Docker应该提供隔离,并且在这两种环境中,无头浏览器都应该以没有cookie和全新(空会话)的方式启动。仍然有区别,我不知道为什么。
有人有任何线索吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)