抓取网站的多层内容的最佳方法是什么?

时间:2019-08-15 15:02:57

标签: node.js asynchronous web-scraping promise return

我对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");

0 个答案:

没有答案
相关问题