1

我正在尝试制作一个脚本:

  1. 从站点地图中获取所有网址
  2. 用 puppeteer 截取它

我目前正在尝试了解如何异步编码,但我仍然无法为这个问题找到正确的编码模式。这是我目前拥有的代码:

// const spider = require('./spider');
const Promise = require('bluebird');
const puppeteer = require('puppeteer');
const SpiderConstructor = require('sitemapper');

async function crawl(url, timeout) {
  const results = await spider(url, timeout);
  await Promise.each(results, async (result, index) => {
    await screen(result, index);
  });
}

async function screen(result, index) {
  const browser = await puppeteer.launch();
  console.log('doing', index);
  const page = await browser.newPage();
  await page.goto(result);
  const path = await 'screenshots/' + index + page.title() + '.png';
  await page.screenshot({path});
  browser.close();
}

async function spider(url, timeout) {
  const spider = await new SpiderConstructor({
    url: url,
    timeout: timeout
  });
  const data = await spider.fetch();
  console.log(data.sites.length);
  return data.sites;
};

crawl('https://www.google.com/sitemap.xml', 15000)
  .catch(err => {
    console.error(err);
  });

我有以下问题:

  • 结果数组的长度不是一个常数,每次我启动脚本时它都会变化,我猜这是因为当我显示它时它并没有完全解决,但我认为等待的重点是让我们保证在下一行承诺得到解决。
  • 脚本的实际截屏动作部分有一半时间不起作用,我很确定我有未解决的承诺,但我没有循环异步函数的实际模式,现在它似乎在其他(线性和增量),但我得到了很多重复。

任何帮助表示赞赏。感谢您的时间

4

0 回答 0