1import { launchPuppeteer } from '@crawlee/puppeteer';
2import { Actor } from 'apify';
3import prettyBytes from 'pretty-bytes';
4
5async function saveScreen(page, key = 'debug-screen.png') {
6 const screenshotBuffer = await page.screenshot({ fullPage: true });
7 await Actor.setValue(key, screenshotBuffer, { contentType: 'image/png' });
8};
9
10async function main() {
11 try {
12 const input = await Actor.getInput();
13 const browser = await launchPuppeteer();
14 const page = await browser.newPage();
15 if (input.abortRequests) {
16 await page.setRequestInterception(true);
17 page.on('request', (request) => {
18 const url = request.url();
19 const filters = [
20 'livefyre',
21 'moatad',
22 'analytics',
23 'controltag',
24 'chartbeat',
25 ];
26 const shouldAbort = filters.some((urlPart) => url.includes(urlPart));
27 if (shouldAbort) request.abort();
28 else request.continue();
29 });
30 }
31 const responses = [];
32 page.on('response', async(response) => {
33 const url = response.url();
34 let size = 0;
35 try {
36 const buffer = await response.buffer();
37 size = buffer.byteLength;
38 } catch (e) {
39
40 }
41 responses.push({
42 url: url,
43 type: response.request().resourceType(),
44 size,
45 });
46 });
47 const startedAt = Date.now();
48 console.log('Opening page', input.url);
49 await page.goto(input.url, { timeout: 5 * 60 * 1000, waitUntil: 'networkidle2' });
50 await saveScreen(page);
51
52 let totalSize = 0;
53 const byResourceType = {};
54 responses.forEach(({ type, size }) => {
55 if (!byResourceType[type]) byResourceType[type] = { count: 0, size: 0 };
56 byResourceType[type].count++;
57 byResourceType[type].size += size;
58 totalSize += size;
59 });
60
61 await Actor.pushData(responses);
62
63 console.log('Page finished loading after', Date.now() - startedAt, 'ms');
64 console.log(`Responses: ${responses.length} (${prettyBytes(totalSize)})`);
65 console.log('----------------');
66 console.log('By resource type');
67 Object.keys(byResourceType).forEach(type => {
68 const data = byResourceType[type];
69 console.log(`${type}: ${data.count} (${prettyBytes(data.size)})`);
70 });
71
72 await page.close();
73 await browser.close();
74 } catch (error) {
75 console.error(error.message);
76 }
77}
78
79await Actor.init();
80
81await main();
82
83
84await Actor.exit();