Puppeteer:打开页面,提取数据,关闭并继续

时间:2018-01-21 19:13:02

标签: javascript puppeteer

我正在抓取一个.NET站点,我需要执行的一个常见操作是:

  1. 设置表单,提交
  2. 打开包含结果数据的页面
  3. 从表中提取值
  4. 返回表格,用不同形式的参赛者重复
  5. 我可以看到如何打开页面,通过browser.on('targetcreated')等待它,然后提取数据,但是如何在使用下一组提交表单之前让前面的代码等待标签关闭参数?在提交下一个操作之前,必须先解析结果页面,因为它共享相同的URL。

    这可能是一个更普遍的JS问题。

    这是我当前的代码,用于检查是否需要打开页面然后单击链接。

     async function fetchAnalysis(page, eventBandId, x, y) {
         const ANALYSIS_TIMEOUT = 90000; // 90 seconds
         const xElem = await page.$(SELECTORS.event_band_analysis_x_axis);
         await xElem.type(x[1])
         const yElem = await page.$(SELECTORS.event_band_analysis_y_axis);
         await yElem.type(y[1])
         await page.click(SELECTORS.event_band_analysis_calculate);
         await page.waitForSelector(SELECTORS.spinner, { timeout:ANALYSIS_TIMEOUT, hidden: true });
    
         // check if grid is presented straightaway
         var dataTableSelector = null;
    
         if (await page.$(SELECTORS.event_band_immediate_grid) !== null) {
             console.log("Got data immediatly");
             await page.screenshot({ path: './screenshots/Analysis: '+x[1]+' VS '+y[1]+'.png' });
             var dataTableSelector = SELECTORS.event_band_immediate_grid;
         } else {
             console.log("Need to open page for data");
             // await page.waitForSelector(SELECTORS.event_band_open_data_page);
             await page.click(SELECTORS.event_band_open_data_page);
             console.log("Clicked");
             return;
         }
    
         const tableData = await utils.getTableDataAsJson(page, dataTableSelector);
         await db.query('INSERT INTO vs_coding.event_band_result ( event_band_id, x_axis, y_axis, json_data ) VALUES (?,?,?,?)', [ eventBandId, x[1], y[1], JSON.stringify    (tableData) ], function (error, results, fields) {
             if (error) throw error;
         });
         console.log("Saved");
     }
    

1 个答案:

答案 0 :(得分:0)

这是我打开页面,抓取数据然后继续的解决方案:不要使用on.('targetcreated')事件,而只是使用你面前的页面。

[..snip..]
            await fetchAnalysis(page, eventBandId, mode.name, x, y);
            resultPage = await browser.newPage();
            await utils.navigate(resultPage, 'analysisViewData.aspx');
            await captureTableData(eventBandId, mode, x, y, resultPage, SELECTORS.event_band_analysis_results_grid);
            await resultPage.close();