我对Node.js有点陌生,并试图使用包含多个信息的网站抓取网站,然后将其导出。
第一层具有类型列表,第二层具有电影列表,第三层具有电影信息。 我相信我应该对每种类型的影片进行某种循环,然后对类别循环中的电影(?)进行相同的循环,以依次遍历每种类型,然后对电影进行循环。
我正在使用cloudcracraper和cheerio抓取网站。
下面的代码仅用于刮擦一种类型的所有电影(不是电影信息。电影信息的深度要高1层),但这并不是真正的自动化,需要我针对每种类型进行刮擦。
实现此目标的最佳方法是什么?
const cloudscraper = require('cloudscraper');
const cheerio = require('cheerio');
const sleep = require('sleep');
let pageCounter = 1;
const outputFile = 'data.json';
// Get the page amount for the genre first
const getMaxPages = async (url) => {
cloudscraper.get(url).then(function(html) {
const $ = cheerio.load(html);
let lastPageClass = $('.page.last');
var totalPages;
// If there is no last page, then there's only 1 page for said genre
if (!lastPageClass) {
totalPages = 1;
} else {
totalPages = lastPageClass.attr('href').split('&page=')[1];
}
// Start going through every page on said genre
getMovieList(url, totalPages);
})
}
const getMovieList = async (url, totalpages) => {
cloudscraper.get(url).then(function(html) {
const $ = cheerio.load(html);
const pageLimit = totalpages;
// Collect link information for each movie
$('.video').map((i, el) => {
const count = resultCount++;
const code = $(el).find('.id').text();
const link = $(el).find('a').attr('href').split("?v=")[1];
const metadata = {
movieCode: code,
movieLink: link
}
parsedResults.push(metadata);
});
// Check if on last page. If last page, save to file. If not the last page, scrape the next page
if (pageCounter == pageLimit) {
exportResults(parsedResults);
return false;
} else {
nextPageLink = $('.page.next').attr('href');
pageCounter++
sleep.sleep(1);
getMovieList(nextPageLink, totalpages);
}
});
}
const exportResults = (parsedResults) => {
fs.writeFileSync(outputFile, JSON.stringify(parsedResults, null, 4), (err) => {
if (err) {
console.log(err);
}
});
}
getMaxPages("http://www.website.com/genre=x");