0

나는 nodejs와 놀 수있는 방법을 가지고 있습니다. 이제 우리는 헤드리스 크롬 브라우저를 사용할 수있게되었고 꽤 멋졌습니다!스크래핑을위한 헤드리스 크롬 nodejs 비동기 루프

일부 코드가 있는데 문제없이 1 개의 웹 사이트를 긁어 모으기 위해 노력하고 있습니다. 그러나 여러 번 긁어 내고 싶을 때 엉망진창처럼 보이고 비동기/대기와 관련이 있습니다.

내 루프가이 코드 하단에 있습니다. 아무도 제안 사항이 있습니까?

감사합니다.

const HeadlessChrome = require('simple-headless-chrome') 

const browser = new HeadlessChrome({ 
    headless: true, // If you turn this off, you can actually see the browser navigate with your instructions, 
}) 

async function navigateWebsite(urlToGoTo) { 
    try { 
    await browser.init() 

    const mainTab = await browser.newTab({ 
     privateTab: false 
    }) 

    await mainTab.inject('jquery') 

    let cookieName = 'li_at' 
    let cookieValue = 'cyzzzzzzzzz' 
    let cookieDomain = '.www.linkedin.com' 

    await mainTab.setCookie(cookieName, cookieValue, { 
     domain: cookieDomain 
    }) 

    // Navigate to a URL 
    await mainTab.goTo(urlToGoTo) 
    await mainTab.wait(2000); 

    // Get a HTML tag value based on class id 
    let businessName = await mainTab.evaluate(function (selector) { 
     const selectorHtml = document.querySelector(selector) 
     return selectorHtml.innerHTML 
    }, '.org-top-card-module__name'); 

    let industry = await mainTab.evaluate(function (selector) { 
     const selectorHtml = document.querySelector(selector) 
     return selectorHtml.innerHTML 
    }, '.company-industries'); 

    let followers = await mainTab.evaluate(function (selector) { 
     const selectorHtml = document.querySelector(selector) 
     return selectorHtml.innerHTML 
    }, '.org-top-card-module__followers-count'); 

    let details = { 
     businessName: cleanData(businessName), 
     industry: cleanData(industry), 
     followers: cleanData(followers) 
    } 

    console.log(details) 


    // Resize the viewport to full screen size (One use is to take full size screen shots) 
    await mainTab.resizeFullScreen() 

    // Take a screenshot 
    await mainTab.saveScreenshot() 

    // Close the browser 
    await browser.close() 

    } catch (err) { 
    console.log('ERROR!', err) 
    } 
} 

let websites = [] 

websites.push('https://www.linkedin.com/company/qrious-limited/') 
websites.push('https://www.linkedin.com/company/wentworth-consulting-nz-/') 
websites.push('https://www.linkedin.com/company/capita/') 

websites.forEach(function (i) { 
    navigateWebsite(i) 
}) 


function cleanData(a) { 
    return a.result.value.replace(/(\r\n|\n|\r)/gm, "").trim() 
} 

답변

1

navigateWebsite()은 비동기이지만 아직 기다리고 있지 않습니다. Promise.all()을 사용하여 웹 사이트 목록을 탐색 기능에 매핑하거나 각 결과가 await이되도록 할 수 있습니다.

Promise.all(websites.map(w => navigateWebsite(w))); 
// or 
for (let w of websites) { 
    await navigateWebsite(w); 
}