Files
2026-07-13 13:23:39 +08:00

54 lines
1.8 KiB
JavaScript

import { Actor } from 'apify';
import { CheerioCrawler, Dataset } from '@crawlee/cheerio';
const mainOptions = {
exit: Actor.isAtHome(),
storage:
process.env.STORAGE_IMPLEMENTATION === 'LOCAL'
? new (await import('@apify/storage-local')).ApifyStorageLocal()
: undefined,
};
await Actor.main(async () => {
const crawler = new CheerioCrawler({
maxRequestsPerCrawl: 10,
autoscaledPoolOptions: { desiredConcurrency: 2 },
async requestHandler({ $, request }) {
const {
url,
userData: { label },
} = request;
if (label === 'START') {
const links = $('a.card')
.toArray()
.map((item) => $(item).attr('href'));
for (const link of links) {
const actorDetailUrl = `https://crawlee.dev${link}`;
await crawler.addRequests([
{
url: actorDetailUrl,
userData: { label: 'DETAIL' },
},
]);
}
} else if (label === 'DETAIL') {
const uniqueIdentifier = url.split('/').slice(-2).join('/');
const title = $('.markdown h1').text();
const firstParagraph = $('.markdown > p').text();
const modifiedDate = $('.theme-last-updated time').attr('datetime');
await Dataset.pushData({
url,
uniqueIdentifier,
title,
firstParagraph,
modifiedDate,
});
}
},
});
await crawler.run([{ url: 'https://crawlee.dev/js/docs/examples', userData: { label: 'START' } }]);
}, mainOptions);