Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为同一URL提供不同页面的木偶演员无头vs有头_Javascript_Html_Node.js_Dom_Puppeteer - Fatal编程技术网

Javascript 为同一URL提供不同页面的木偶演员无头vs有头

Javascript 为同一URL提供不同页面的木偶演员无头vs有头,javascript,html,node.js,dom,puppeteer,Javascript,Html,Node.js,Dom,Puppeteer,我不太清楚为什么会发生这种情况,但我正试图从谷歌搜索结果中抓取结果,结果会在你向下滚动时动态加载。我试图通过向下滚动来模拟,但是当Puppeter在headless模式下运行时,它不会加载所有搜索结果,而当headless关闭时,它会返回正确数量的结果 我发现我要查找的信息存储在类为“bkWMgd”的div中,如您所见,总共有7个div: 木偶演员代码: (异步(搜索查询)=>{ const browser=wait puppeter.launch({ //无头:错 }); const pag

我不太清楚为什么会发生这种情况,但我正试图从谷歌搜索结果中抓取结果,结果会在你向下滚动时动态加载。我试图通过向下滚动来模拟,但是当Puppeter在headless模式下运行时,它不会加载所有搜索结果,而当headless关闭时,它会返回正确数量的结果

我发现我要查找的信息存储在类为“bkWMgd”的div中,如您所见,总共有7个div:

木偶演员代码:

(异步(搜索查询)=>{
const browser=wait puppeter.launch({
//无头:错
});
const page=wait browser.newPage();
等待页面。转到('https://google.com/search?q=“+searchQuery,{waitUntil:'networkidle2'});
//等待加载一个div类
wait page.waitForSelector('div[class=bkWMgd]');
//一直向下滚动
等待page.evaluate(()=>window.scrollTo(0,document.body.scrollHeight));
//计算类为“bkWMgd”的div的数量
const resp=wait page.evaluate(()=>document.queryselectoral('div[class=bkWMgd]').length);
控制台日志(resp);
等待page.screenshot({path:'example.png'});
等待浏览器关闭();
})(“猫”)
在headless mode console.logs
3
中运行此代码,并在headless mode关闭的情况下运行,输出正确的编号
7

以下是捕获的屏幕截图:

无头模式:

无头模式关闭:

出于某种原因,似乎输出了不同的结果。我尝试创建一个IngocnitoContext:

const context=wait browser.createIncognitoBrowserContext();
const page=wait context.newPage();
然而,它仍然会导致不同的结果,因此我只是想知道是否有一种方法可以确保无头和满头都能产生相同的结果。我感兴趣的结果是当headless关闭时产生的结果,Google(和其他网站)可能会根据您的用户代理和屏幕大小为您提供不同的内容。尝试显式设置它们,以便获得一致的结果:

设置窗口大小

const browser=wait puppeter.launch({
无头:是的,
args:[
“--窗口大小=19201080”,
“--user agent=“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/78.0.3904.108 Safari/537.36”
]
});
设置用户代理

wait page.setUserAgent('Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/78.0.3904.108 Safari/537.36');
完整示例

(异步(搜索查询)=>{
constuseragent='Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,比如Gecko)Chrome/78.0.3904.108 Safari/537.36';
const browser=wait puppeter.launch({
无头:是的,
args:[
“--窗口大小=19201080”,
`--用户代理=“{userAgent}”`
]
});
const page=wait browser.newPage();
等待页面。setUserAgent(userAgent);
等待页面。转到('https://google.com/search?q=“+searchQuery,{waitUntil:'networkidle2'});
//等待加载一个div类
wait page.waitForSelector('div[class=bkWMgd]');
//一直向下滚动
等待page.evaluate(()=>window.scrollTo(0,document.body.scrollHeight));
//计算类为“bkWMgd”的div的数量
const resp=wait page.evaluate(()=>document.queryselectoral('div[class=bkWMgd]').length);
控制台日志(resp);
等待page.screenshot({path:'example.png'});
等待浏览器关闭();
})(“猫”)
更新

我很惊讶设置用户代理不起作用。我已经更新了示例,通过
--user-agent
命令行开关指定了用户代理。尝试一下也没什么坏处


有一个名为的库可能会解决您的问题。您可能想试一试。

不幸的是,试一试是行不通的。谷歌似乎在观察浏览器的用户代理?在打印出浏览器的用户代理后,唯一的区别是,您使用的不是“Chrome”,而是“HeadlessChrome”。无论我们是否为页面设置了用户代理,浏览器的用户代理都保持不变,只在启动期间设置了headless。有办法吗?嗨,瓦卡萨巴西。我真的认为设置用户代理就可以了。也许给木偶师隐形一个尝试。我尝试过——用户代理,不幸的是,这也不起作用,但是木偶师隐形效果很好!