我正在为一个学校的网页制作一个网络爬行器.我导入了Puppeteer以获取客户端呈现的HTML文件.然而,我在开发过程中遇到了一些问题.

我的代码是:

const puppeteer = require("puppeteer");

async function scrapeData(url) {
  console.log("Target URL: ", url);

  const browser = await puppeteer.launch({ headless: "new" });

  try {
    const page = await browser.newPage();

    await page.goto(url);

    // wait for client-side loading
    await page.waitForSelector(".tit");

    // get texts from html. ignore this code.
    const titles = await page.$$eval(".tit a", (elements) => {
      return elements.map((element) => element.textContent);
    });

    console.log("before click");

    // click element which has ".tit" class.
    // that element have onclick event-listener (checked with chrome manually)
    // however, this code throws timeout exception from `page.waitForNavigation()`
    await Promise.all([page.waitForNavigation(), page.click(".tit")]);

    console.log("navigation success.");

    const newUrl = page.url();

    const result = {
      titles,
      newUrl,
    };

    return result;
  } finally {
    await browser.close();
  }
}

const targetUrl = "https://kau.ac.kr/web/pages/gc32172b.do";
scrapeData(targetUrl)
  .then((result) => {
    console.log("Scraped Titles:", result.titles);
    console.log("New URL after click:", result.newUrl);
  })
  .catch((error) => console.error("Error during scraping:", error));

我的代码摘要:

  1. puppeteer 师打开浏览器并移动到"https://kau.ac.kr/web/pages/gc32172b.do"."
  2. 等待渲染,然后单击该元素(具有'.tit'类).
  3. 当客户端单击'.tit'类元素时,浏览器将导航到新的URL.(没有其他选项,因为它会动态导航到新URL)
  4. 导航后,获取导航的URL并返回URL值.

顺便说一句,代码await Promise.all([page.waitForNavigation(), page.click(".tit")]);抛出超时异常.

我try 了什么:

  1. 在使用Chrome时,我在控制台中try 了这段代码.
const title = document.querySelector(".tit");
title.click();
// I checked this codes navigate browser
  1. 我通过Puppeteer的API手动设置超时,而不是waitForNavigation.然而,我无法获得新的URL.

这是否意味着page.click()次创建新页面和导航到新URL?

推荐答案

try 使用不受信任的点击,如my blog post中所述:

await Promise.all([
  page.waitForNavigation(),
  page.$eval(".tit a", el => el.click()),
]);

受信任的点击有page.click()个是复杂的,需要可见性,而且由于某些页面的行为,Puppeteer经常无法正确执行点击.

如果这不起作用,另一个技巧是从链接中抓取href,并使用page.goto()直接导航到它.在大多数情况下,当在抓取上下文中进行自动化时,没有必要像测试中那样模仿用户交互.通常有一种方法可以绕过繁琐的点击.在本例中,虽然链接上似乎没有href,但该策略可能在其他地方派上用场.

Javascript相关问答推荐

如何通过在提交时工作的函数显示dom元素?

使用TMS Web Core中的HTML模板中的参数调用过程

过滤对象数组并动态将属性放入新数组

如何在Javascript中的控制台上以一行形式打印循环的结果

如何使用JavaScript将文本插入空div

当运行d3示例代码时,没有显示任何内容

查找最长的子序列-无法重置数组

无法检测卡片重叠状态的问题

在HTML语言中调用外部JavaScript文件中的函数

使用auth.js保护API路由的Next.JS,FETCH()不起作用

自定义确认组件未在vue.js的v菜单内打开

在没有任何悬停或其他触发的情况下连续交换图像

Angel Auth Guard-用户只有在未登录时才能访问登录页面,只有在登录时才能访问其他页面

如何在Web项目中同步语音合成和文本 colored颜色 更改

如何使pdf.js上的文本呈现为可选?

使用Java脚本在div中创建新的span标记

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

检测带有委托的元素内部的点击,以及元素何时按其类名被选中

Playwright:ReferenceError:browserContext未定义