您如何从带有节点puppeteer的页面获取所有链接?

时间:2018-12-16 00:18:42

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

我正在尝试使用node构建一个Web搜寻器,并遇到了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数组中不存在。更糟糕的是,这些是引出网站的链接,是我想做的确切类型,否则,我只能抓取一个网站。

我的脚本仅显示某些链接是有原因的吗?是selectSelector太狭窄或拒绝某些链接?

1 个答案:

答案 0 :(得分:0)

该链接是由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>