【问题标题】:Detecting POST response arrival after clicking with Puppeteer点击 Puppeteer 后检测 POST 响应到达
【发布时间】:2018-05-29 21:29:39
【问题描述】:

我正在尝试从表格中捕获信息,但该表格有一个分页按钮(“下一个,上一个”)。当我单击下一个按钮时,不会发生导航;它只是创建一个返回新 HTML 表的 POST 请求。

当我单击导致 POST(不是导航)的下一个按钮时,我如何才能等待此 POST 完成,然后再尝试从下一页再次捕获数据?

也许我可以检测到表格元素的一些变化,但我不知道如何。

解决这个问题的最佳方法是什么?

现在我正在这样做:

while (await page.$(NEXT_BUTTON_SELECTOR) !== null) {
  await page.click(NEXT_BUTTON_SELECTOR);
  await page.waitFor(2 * 1000);
  pageTableArray = getData();
}

但我不相信这是一个好方法。

【问题讨论】:

标签: javascript node.js web-scraping puppeteer


【解决方案1】:

如果await page.click(NEXT_BUTTON_SELECTOR); 导致页面加载发生,那么脚本中接下来发生的任何事情都会丢失。要解决这个问题,您必须这样做:

page.click(NEXT_BUTTON_SELECTOR); // Notice no `await`
await page.waitForNavigation();

docs page here 中查看有关该 API 的更多信息!

【讨论】:

  • OP 指定不发生导航,所以waitForNavigation 无济于事。
【解决方案2】:

您可以使用事件requestfinished 来捕获数据。

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', req => {
    console.log('request:', req.url())
    req.continue();
});
page.on('requestfinished', (req) => {
    console.log('finished:', req.url())
});
page.on('requestfailed', (req) => {
    console.log('failed:', req.url())
})
await page.goto(url);
await page.click(selector);

【讨论】:

  • 这有助于让您在回调中访问响应,但在单击后,如果您想访问数据或至少等待触发单击的承诺链中的请求完成,请尝试 @987654322 @.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2013-07-17
  • 2021-04-02
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多