我正在为一个页面构建一个 apify 演员,其中所有需要的 url 都存储在不同的 sitemap.xml 文件中。文件名是静态的,但不知道如何将几个 sitemap.xml 文件添加到 actor。
下面是带有 1 个 xml 文件的工作代码。不知何故需要在多个 url 上做一个 for-each,但由于它们大约有 600 个,最好是通过从 csv 中提取所有站点地图,然后为每个 url 抓取,然后抓取每个 url。
const Apify = require('apify');
const cheerio = require('cheerio');
const requestPromised = require('request-promise-native');
Apify.main(async () => {
const xml = await requestPromised({
url: 'https://www.website.com/sitemap1.xml’, // <- This part needs to accept input of about 600 sitemap.xml urls in total
headers: {
'User-Agent': 'curl/7.54.0'
}
});
// Parse sitemap and create RequestList from it
const $ = cheerio.load(xml);
const sources = [];
$('loc').each(function (val) {
const url = $(this).text().trim();
sources.push({
url,
headers: {
// NOTE: Otherwise the target doesn't allow to download the page!
'User-Agent': 'curl/7.54.0',
}
});
});
const requestList = new Apify.RequestList({
sources,
});
await requestList.initialize();
// Crawl each page from sitemap
const crawler = new Apify.CheerioCrawler({
requestList,
handlePageFunction: async ({ $, request }) => {
await Apify.pushData({
url: request.url
});
},
});
await crawler.run();
console.log('Done.');
});
每个 sitemap.xml 都有一个静态链接/名称,但它们的内容每天都在变化,站点地图中的 url 总数为 60-70.000,它是我最终需要获取的那些 url :-)