【问题标题】:HTML not extracted NODEJSHTML 未提取 NODEJS
【发布时间】:2020-07-14 03:17:34
【问题描述】:

我想使用 nodejspuppeteer

抓取 Twitter 推文

我不想创建开发者帐户等

以下代码在抓取代码中返回 null。但是当我在 twitter 网站上编写这段代码时,它给了我 HTML

var  html = document.querySelector('main nav').nextElementSibling;

代码

'use strict';
const puppeteer = require('puppeteer');

function run() {
return new Promise(async (resolve, reject) => {
        try {

        const browser = await puppeteer.launch({
        headless : false
        });

        const page = await browser.newPage();
        await page.setRequestInterception(true);

        // add header for the navigation requests
        page.on('request', request => {

            // Do nothing in case of non-navigation requests.
            if (!request.isNavigationRequest()) {
                request.continue();
                return;
            }

            // Add a new header for navigation request.
            const headers = request.headers();
            // headers['proxy'] = super_proxy;
            request.continue({ headers });
        });


        await page.goto("https://www.twitter.com/Udemy");

        await page.evaluate(`window.scrollTo(0, document.body.scrollHeight)`);
        await page.waitFor(5000);


        await page.waitFor('main nav');
        let urls = await page.evaluate(() => {
            let results = [];

            var parser = new DOMParser();
            var  html = document.querySelector('main nav').nextElementSibling;
            var $     = parser.parseFromString(html, 'text/html');
            var html  = document.querySelector('section > div > div > div');

            //Error return empty HTML --------------------- <<<<<<<<<<<<<
            return html;
        })
        browser.close();
        return resolve(urls);
    } catch (e) {
        return reject(e);
    }
})
}
run().then(console.log).catch(console.error);

我想要的结果

【问题讨论】:

    标签: node.js web-scraping puppeteer


    【解决方案1】:

    来自docs

    如果传递给 page.evaluate 的函数返回一个不可序列化的值,则 page.evaluate 解析为 undefined。

    here

    page.evaluate 和 page.evaluateHandle 的唯一区别是 page.evaluateHandle 返回页内对象 (JSHandle)。

    page.evaluate 替换为page.evaluateHandle

    let urls = await page.evaluateHandle(() => { ... return html })
    

    【讨论】:

    • 无法返回任何html
    • @Adam querySelector 返回元素而不是 html。如果需要元素的 html 字符串,则需要返回 html.outerHTML。阅读更多关于他们herehere
    猜你喜欢
    • 2014-08-14
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2015-10-15
    • 2017-11-23
    • 1970-01-01
    • 2019-06-08
    • 2015-07-27
    相关资源
    最近更新 更多