Puppeteer page.evaluate 在解析网站时随机停止工作
Pupateer page.evaluate randomly stopped work when parsing website
大约 3 周前,我为选项警报创建了一个 webparser,一切顺利,截至今天,我检查了它,由于某种原因它返回空值,我想也许网站重新设计了,但没有什么不同,我在过去的几个小时里一直在尝试许多修复,所以希望我能得到一些帮助,下面是我用来对网站进行 parising 的代码:
const browser = await puppeteer.launch({
args: ['--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process',
'--disable-gpu'],
dumpio: true,
headless: true
});
const page = await browser.newPage();
await page.goto(process.env.ALERTS_PARSER_WEBSITE);
// page.on("console", msg => console.log("PAGE LOG:", msg));
const data = await page.evaluate(() =>
Array.from(document.querySelectorAll("table > tbody > tr"), (row) =>
Array.from(row.querySelectorAll("th, td"), (cell) => cell.innerText)
)
);
然后我将数据映射到我自己的数组中并传回我的前端,我试图从中解析的网站是 Bar Chart Unusual Options Activity。您可以在那里检查该站点,看看查询选择器应该可以工作,我真的是在这方面的最后一站,所以非常感谢任何帮助。
不确定是什么原因,但我设法仅使用 puppeteer.launch({ headless: false });
和
获取数据
page.setDefaultTimeout(300_000);
// ...
await page.waitForSelector("table > tbody > tr");
(最后一个可能只在像我这样的慢速机器上需要)。
也许站点开始使用一些针对无头模式的保护。
P.S。当我尝试在无头模式下获取页面截图时,我立即得到:
P.P.S。目前看来解决方案很简单。由于 response.request().redirectChain()
为空,站点仅在第一个请求中检查用户代理 header。所以这似乎解决了无头模式的问题(可以通过比较两种模式下的 await browser.userAgent()
值来推断差异):
await page.setUserAgent((await browser.userAgent()).replace('HeadlessChrome', 'Chrome'));
await page.goto('https://www.barchart.com/options/unusual-activity/stocks?orderBy=tradeTime&orderDir=desc');
大约 3 周前,我为选项警报创建了一个 webparser,一切顺利,截至今天,我检查了它,由于某种原因它返回空值,我想也许网站重新设计了,但没有什么不同,我在过去的几个小时里一直在尝试许多修复,所以希望我能得到一些帮助,下面是我用来对网站进行 parising 的代码:
const browser = await puppeteer.launch({
args: ['--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--no-first-run',
'--no-zygote',
'--single-process',
'--disable-gpu'],
dumpio: true,
headless: true
});
const page = await browser.newPage();
await page.goto(process.env.ALERTS_PARSER_WEBSITE);
// page.on("console", msg => console.log("PAGE LOG:", msg));
const data = await page.evaluate(() =>
Array.from(document.querySelectorAll("table > tbody > tr"), (row) =>
Array.from(row.querySelectorAll("th, td"), (cell) => cell.innerText)
)
);
然后我将数据映射到我自己的数组中并传回我的前端,我试图从中解析的网站是 Bar Chart Unusual Options Activity。您可以在那里检查该站点,看看查询选择器应该可以工作,我真的是在这方面的最后一站,所以非常感谢任何帮助。
不确定是什么原因,但我设法仅使用 puppeteer.launch({ headless: false });
和
page.setDefaultTimeout(300_000);
// ...
await page.waitForSelector("table > tbody > tr");
(最后一个可能只在像我这样的慢速机器上需要)。
也许站点开始使用一些针对无头模式的保护。
P.S。当我尝试在无头模式下获取页面截图时,我立即得到:
P.P.S。目前看来解决方案很简单。由于 response.request().redirectChain()
为空,站点仅在第一个请求中检查用户代理 header。所以这似乎解决了无头模式的问题(可以通过比较两种模式下的 await browser.userAgent()
值来推断差异):
await page.setUserAgent((await browser.userAgent()).replace('HeadlessChrome', 'Chrome'));
await page.goto('https://www.barchart.com/options/unusual-activity/stocks?orderBy=tradeTime&orderDir=desc');