javascript - 如何使用 Node puppeteer 获取页面中的所有链接?

标签 javascript node.js web-scraping web-crawler puppeteer

我正在尝试使用 Node 构建一个网络爬虫,并发现了 puppeteer 包,它看起来非常适合我想要的东西。我的最终结果是收集页面中的所有链接、所有文本内容,然后是页面本身的屏幕截图。

我运行了以下命令,它似乎收集了大量链接,但是在实际检查该网站时,有一些链接没有收集。

const puppeteer = require('puppeteer');

module.exports = () => {
  (async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://pixabay.com/en/columbine-columbines-aquilegia-3379045/');
    await page.screenshot({ path: 'myscreenshot.png', fullPage: true });
    let text = await page.$eval('*', el => el.innerText.split(' '));
    text = text.map(string => {
      return string.replace(/[^\w\s]/gi, '');
    });

      let hrefs = await page.evaluate(() => {
          const links = Array.from(document.querySelectorAll('a'))
          return links.map(link => link.href);
      });
    console.log('done');

    await browser.close();
  })();
};

例如此链接:/go/?t=image-details-shutterstock&id=699165328 不在 href 数组中。更糟糕的是,这些是引出该网站的链接,这正是我想做的事情,否则我只能抓取一个网站。

我的脚本只显示部分链接是否有原因? querySelector 是否太窄或拒绝某些链接?

最佳答案

链接是由onclick事件生成的,例如保存在data-go属性中

<a data-go="image-details-shutterstock&amp;id=458320033">

只需要在前面添加 /go/?t= 即可获取

return links.map(link => link.href || link.getAttribute('data-go'));

还有菜单的空链接,例如

<a><i class="icon icon_menu_user"></i></a>

关于javascript - 如何使用 Node puppeteer 获取页面中的所有链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798375/

相关文章:

javascript - 生成两个数字之间的任意随机数的 Javascript 设备如何在数学上工作?

node.js - Node 环境中的行为

python-2.7 - 使用 scrapy 递归地抓取 phpBB 论坛

python - 提取非本地链接——美汤

Javascript:分配具有独特随机属性的新对象

javascript - http.post 从 angularJS 到 c# Web api 的简单对象为 null 或所有属性均为 null

javascript - HTML 按钮在页面其他内容之前加载

node.js - 是否可以使用 Morgan 记录错误消息?

javascript - 在 Angular 函数中访问 Get 变量

java - 如何只获取HTML页面的一部分?