我正在尝试制作一个脚本:
- 从站点地图中获取所有网址
- 用 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);
});
我有以下问题:
- 结果数组的长度不是一个常数,每次我启动脚本时它都会变化,我猜这是因为当我显示它时它并没有完全解决,但我认为等待的重点是让我们保证在下一行承诺得到解决。
- 脚本的实际截屏动作部分有一半时间不起作用,我很确定我有未解决的承诺,但我没有循环异步函数的实际模式,现在它似乎在其他(线性和增量),但我得到了很多重复。
任何帮助表示赞赏。感谢您的时间