Гусеничный Cheerio работает медленно - PullRequest
0 голосов
/ 25 июня 2019

Я создал сканер для Yelp. это работает довольно хорошо, но это медленно. Сначала я загружаю страницу результатов, затем беру все URL-адреса списков, затем перехожу к каждому списку, собирая данные о компании.

Я новичок в JavaScript и привет, так что, возможно, я делаю что-то не так.

// Main function for scraping  
const getDetails = async (url) => {  
try    {
      // Getting the url 
    const response = await axios.get(url);
    const $ = cheerio.load(response.data);

        // Getting the Link of the listing
        $('div.businessName__373c0__1fTgn').map((i, element) =>
        {
            const $element = $(element);
            const $l = $element.find('h3').children('a').attr('href');
            const $listing = `https://www.yelp.com${$l}`;
            console.log(`found ${$listing}`);

            listings.push($listing);
        });

        //Finding the next page link and the cleaning it up
        const nextPageLink =$('.pagination-link-- 
        current__373c0__37ym9').parent().parent().parent().next('div').find('a').attr('href');
        const page = await 'https://www.yelp.com'+nextPageLink;
        console.log(chalk.cyan(`  Scraping: ${page}`));
        pageCounter++;

        // When the pageCounter and pageLimit are equal start scraping for company info
    if (pageCounter == pageLimit);
    {
        await scrapeDetailsPage(listings);
        return false;
    }

    // Passing in the next page link
    getDetails(page);
      } catch (error) {

     scrapeDetailsPage(listings);
    console.log(error);   } }


// Scrape details page 
const scrapeDetailsPage = async (listings) => 
{
    // Iterating through each listing link and scrapng the webpage
    for(var i = 0; i < listings.length; i++)
    {
        // Setting the listing array index to detailsLink
        const detailsLink = listings[i];

        // Scraping for Company details
        try 
        {
            const response = await axios.get(detailsLink);
            const $ = cheerio.load(response.data);

            const $name = $('.biz-page-title').text();
            const $category = $('.category-str-list').text().replace('\n','');
            const $phone = $('.biz-phone').text().replace('\n','');
            const $website = $('.biz-website').find('a').text().replace('\n','');
            const $websiteLink = $('.biz- website').find('a').attr('href');
            const $address = $('address').text().replace('\n','');

            console.log(`Getting ${$name} details`);

            // Record the Company Info into a JSON object
            data = 
            {
                name: $name,
                category: $category,
                phone: $phone,
                website:$website,
                address: $address,
            }

            details.push(data);

            // Export the results from details array to a JSON file
            if(listings.length - 1 === i) {
                exportResults(details);
                console.log(`There is ${details.length} records`);
                return false;
            }
        } catch (error) 
        {
            exportResults(details);
            return false;
        }
    } }

Потребовалось чуть более 5 минут, чтобы получить 150 результатов. Просто загрузка URL занимает много времени. Я видел, как другие скребки быстро пузырились.

...