>

선택하고 console.log() 하려고합니다  터미널에있는 웹 사이트의 모든 링크의 NodeList 그러나google.com,facebook.com,instagram.com과 같은 특정 웹 사이트에 액세스 할 수 없습니다.

요소가있다라는 것을 알고 있습니다. document.querySelectorAll('a') 를 사용하여 개별적으로로드되는 실제 Chromium 콘솔에 요소를 확실히 기록 할 수 있기 때문입니다. . 그러나 노드 터미널에서 링크를 추출하고 로그하려고 할 때

const links = await page.evaluate(() => document.querySelectorAll('a'))
console.log(links)

undefined 를 얻습니다

그러나 코드가 작동하는yahoo.com,linkedin.com과 같은 대부분의 웹 사이트에는 해당되지 않습니다. 여기 있습니다 :

const URL = 'https://instagram.com/';
const scrape = async () => {
    const browser = await puppeteer.launch({
        headless: false
    });
    const page = await browser.newPage();
    await page.setViewport({
        width: 1240,
        height: 680
    });
    await page.goto(URL, { waitUntil: 'domcontentloaded' });
    await page.waitFor(6000);
    const links = await page.evaluate(() => document.querySelectorAll('a'));
    console.log(links);
    await page.screenshot({
        path: 'ig.png'
    });
    await browser.close();
};

bypassBotDetectionSystem() 를 추가하려고했습니다.  이 기사 에서 제안한대로 작동하지 않습니다. 내가 말한 것처럼 Chromium에서 쉽게 탐색 할 수 있기 때문에 이것이 문제라고 생각하지 않습니다.

도움을 주셔서 감사합니다!

  • 답변 # 1

    DOM 를 반환하려고합니다.   page.evaluate 와 요소  함수가 page.evaluate 에 전달 된 경우이 방법은 불가능합니다.  직렬화 할 수없는 값을 반환 한 다음 page.evaluate   undefined 로 해결  귀하의 경우와 같이.

    ElementHandle 의 배열을 얻으려면 page. $$메소드를 대신 사용할 수 있습니다 .

    예 :

    const links = await page.$$('a'); // returns <Promise<Array<ElementHandle>>>
    
    

    그러나 속성의 모든 값을 얻으려면 (예 : href ) page. $$eval 메소드를 사용할 수 있으며 Array.from(document.querySelectorAll(selector)) 를 실행합니다.  페이지 내에서 pageFunction 의 첫 번째 인수로 전달합니다.

    예 :

    const hrefs = await page.$$eval('a', links => links.map(link => link.href));
    console.log(hrefs);
    
    

관련 자료

  • 이전 python - 이름은 같지만 파일 형식이 다른 다른 파일에서 확장자가없는 파일 찾기
  • 다음 inflate exception - "클래스 androidsupportv4widgetDrawerLayout 팽창 오류"수정 방법