代码之家  ›  专栏  ›  技术社区  ›  KAT

如何使用节点木偶绘制器从页面获取所有链接?

  •  0
  • KAT  · 技术社区  · 5 年前

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

    我运行了下面的链接,它似乎收集了大量的链接,但是在实际的站点检查中有一些链接,它没有收集。

    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数组中。更糟糕的是,这些链接会引出站点,这正是我想做的事情,否则我只能爬行一个站点。

    我的脚本只显示一些链接有什么原因吗?查询选择器是否太窄或拒绝某些链接?

    1 回复  |  直到 5 年前
        1
  •  0
  •   ewwink    5 年前

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