【问题标题】:How to scrape JSON from puppeteer?如何从 puppeteer 中抓取 JSON?
【发布时间】:2018-01-29 22:54:03
【问题描述】:

我登录到一个站点,它提供了一个浏览器 cookie。

我转到一个 URL,它是一个 json 响应。

输入await page.goto('blahblahblah.json');后如何抓取页面 ?

【问题讨论】:

    标签: node.js scrape puppeteer


    【解决方案1】:

    另一种不提供intermittent issues 的方法是在正文可用时评估正文并将其作为 JSON 返回,例如

    const puppeteer = require('puppeteer'); 
    
    async function run() {
    
        const browser = await puppeteer.launch( {
            headless: false  //change to true in prod!
        }); 
    
        const page = await browser.newPage(); 
    
        await page.goto('https://raw.githubusercontent.com/GoogleChrome/puppeteer/master/package.json');
    
       //I would leave this here as a fail safe
        await page.content(); 
    
        innerText = await page.evaluate(() =>  {
            return JSON.parse(document.querySelector("body").innerText); 
        }); 
    
        console.log("innerText now contains the JSON");
        console.log(innerText);
    
        //I will leave this as an excercise for you to
        //  write out to FS...
    
        await browser.close(); 
    
    };
    
    run(); 
    

    【讨论】:

    • 你用变量'content'做什么?
    • 没有什么特别的外观 :) 必须从测试代码中遗留下来
    【解决方案2】:

    你可以拦截网络响应,像这样:

    const puppeteer = require('puppeteer');
    const fs = require('fs');
    (async () => {
      const browser = await puppeteer.launch()
      const page = await browser.newPage()
      page.on('response', async response => {
        console.log('got response', response._url)
        const data = await response.buffer()
        fs.writeFileSync('/tmp/response.json', data)
      })
      await page.goto('https://raw.githubusercontent.com/GoogleChrome/puppeteer/master/package.json', {waitUntil: 'networkidle0'})
      await browser.close()
    })()
    

    【讨论】:

    • 我收到 ` (node:6503) UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):错误:协议错误(Network.getResponseBody):目标已关闭。 `
    • 嗯,我也偶尔会这样。添加{waitUntil: 'networkidle0'} 似乎有帮助 - 显然可以在整个响应正文加载之前到达browser.close()
    • 请注意,如果您想在代码中使用数据,可以使用await response.json()
    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2023-03-16
    • 2022-01-17
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多