Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在服务器云端运行的特定网站上,木偶演员超时_Javascript_Node.js_Web Scraping_Google Cloud Platform_Puppeteer - Fatal编程技术网

Javascript 在服务器云端运行的特定网站上,木偶演员超时

Javascript 在服务器云端运行的特定网站上,木偶演员超时,javascript,node.js,web-scraping,google-cloud-platform,puppeteer,Javascript,Node.js,Web Scraping,Google Cloud Platform,Puppeteer,我制作了一个node.js web scraper代码,在我的计算机上运行良好,但是,当我部署到运行Debian的Google Cloud VM实例时,它会返回特定网站的超时错误。我为木偶演员尝试了很多不同的设置,但似乎都不起作用。我相信,当我从谷歌云服务器上运行时,我试图抓取的网站正在阻止我的代码,但当我从我的计算机上运行时,不会。刮削部分在我的电脑上工作得很好。Puppeter找到HTML标记并检索信息 const puppeteer = require('puppeteer'); cons

我制作了一个node.js web scraper代码,在我的计算机上运行良好,但是,当我部署到运行Debian的Google Cloud VM实例时,它会返回特定网站的超时错误。我为木偶演员尝试了很多不同的设置,但似乎都不起作用。我相信,当我从谷歌云服务器上运行时,我试图抓取的网站正在阻止我的代码,但当我从我的计算机上运行时,不会。刮削部分在我的电脑上工作得很好。Puppeter找到HTML标记并检索信息

const puppeteer = require('puppeteer');
const GoogleSpreadsheet = require('google-spreadsheet');
const { promisify } = require('util');
const credentials = require('./credentials.json');

async function main(){

    const scrapCopasa = await scrapCopasaFunction();

    console.log('Done!')

}



async function scrapCopasaFunction() {

    const browser = await puppeteer.launch({
        args: ['--no-sandbox'], 
    });
    const page = await browser.newPage();
    //await page.setDefaultNavigationTimeout(0);
    //await page.setViewport({width: 1366, height: 768});
    await page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36');
    await page.goto('http://www.copasa.com.br/wps/portal/internet/abastecimento-de-agua/nivel-dos-reservatorios');
    //await new Promise(resolve => setTimeout(resolve, 5000));
    
    let isUsernameNotFound = await page.evaluate(() => {
        if(document.getElementsByClassName('h2')[0]) {
            if(document.getElementsByTagName('h2')[0].textContent == "Sorry, this page isn't available.") {
                return true;
            }
        }
    });

    if(isUsernameNotFound) {
        console.log('Account not exists!');        
        await browser.close();
        return;
    }


    let reservoirLevelsCopasa = await page.evaluate(() => {
        const tds = Array.from(document.querySelectorAll('table tr td'))
        return tds.map(td => td.innerText)        
    });


    const riomanso = reservoirLevelsCopasa[13].replace(",",".").substring(0,5);
    const serraazul = reservoirLevelsCopasa[17].replace(",",".").substring(0,5);
    const vargemdasflores = reservoirLevelsCopasa[21].replace(",",".").substring(0,5);

    await browser.close();

    return[riomanso, serraazul, vargemdasflores];

}



main();
我得到的错误如下:

(node:6425) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded
    at /home/xxx/reservoirs/node_modules/puppeteer/lib/LifecycleWatcher.js:142:21
    at async FrameManager.navigateFrame (/home/xxx/reservoirs/node_modules/puppeteer/lib/FrameManager.js:94:17)
    at async Frame.goto (/home/xxx/reservoirs/node_modules/puppeteer/lib/FrameManager.js:406:12)
    at async Page.goto (/home/xxx/reservoirs/node_modules/puppeteer/lib/Page.js:674:12)
    at async scrapCopasaFunction (/home/xxx/reservoirs/reservatorios.js:129:5)
    at async main (/home/xxx/reservoirs/reservatorios.js:9:25)
  -- ASYNC --
    at Frame.<anonymous> (/home/xxx/reservoirs/node_modules/puppeteer/lib/helper.js:111:15)
    at Page.goto (/home/xxx/reservoirs/node_modules/puppeteer/lib/Page.js:674:49)
    at Page.<anonymous> (/home/xxx/reservoirs/node_modules/puppeteer/lib/helper.js:112:23)
    at scrapCopasaFunction (/home/xxx/reservoirs/reservatorios.js:129:16)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async main (/home/xxx/reservoirs/reservatorios.js:9:25)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:6425) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async f
unction without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled
 promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)
. (rejection id: 1)
(node:6425) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not ha
ndled will terminate the Node.js process with a non-zero exit code.

对于木偶演员来说,云的功能有点慢。有一次。对此,。如果可能的话,您可以为函数分配更多的CPU/ram。为chrome提供的CPU和RAM越多,速度就越快

您可以向goto添加超时,这是以毫秒为单位的最大导航时间,默认为30秒,超过0则禁用超时

await page.goto('http://www.copasa.com.br', { timeout: 60000 });
您还可以使用和设置导航超时,其优先级高于setDefaultTimeout

page.setDefaultNavigationTimeout(60000)

对于木偶演员来说,云的功能有点慢。有一次。对此,。如果可能的话,您可以为函数分配更多的CPU/ram。为chrome提供的CPU和RAM越多,速度就越快

您可以向goto添加超时,这是以毫秒为单位的最大导航时间,默认为30秒,超过0则禁用超时

await page.goto('http://www.copasa.com.br', { timeout: 60000 });
您还可以使用和设置导航超时,其优先级高于setDefaultTimeout

page.setDefaultNavigationTimeout(60000)

您提取的数据已经是HTML格式的,因此您可以通过HTTP请求获取HTML,并在Node.js脚本(而不是浏览器)中提取数据。这将更快,需要更少的资源。如果需要进行身份验证,可以发送POST请求并在下面的GET请求中重用cookie。例如

const cheerio=需要“cheerio” const got=需要“got” 常量URL=http://www.copasa.com.br/wps/portal/internet/abastecimento-de-agua/nivel-dos-reservatorios' 函数reportAndExit错误{ 控制台错误 进程exit1 } 异步函数主{ 常量头={ “用户代理”:“Mozilla/5.0 Macintosh;Intel Mac OS X 10_15_1 AppleWebKit/537.36 KHTML,如Gecko Chrome/79.0.3945.88 Safari/537.36” } const response=await gotURL,headers const$=cheerio.loadresponse.body const reservoirLevelsCopasa=$'conteudo-principal表:类型tr:nth的第一个类型n+3 td:nth-child4'.mapi,el=>parseFloat$el.text.replace',','.'。get console.logreservoirLevelsCopasa 回流储液罐 } main.catchreportAndExit 输出


您提取的数据已经是HTML格式的,因此您可以通过HTTP请求获取HTML,并在Node.js脚本(而不是浏览器)中提取数据。这将更快,需要更少的资源。如果需要进行身份验证,可以发送POST请求并在下面的GET请求中重用cookie。例如

const cheerio=需要“cheerio” const got=需要“got” 常量URL=http://www.copasa.com.br/wps/portal/internet/abastecimento-de-agua/nivel-dos-reservatorios' 函数reportAndExit错误{ 控制台错误 进程exit1 } 异步函数主{ 常量头={ “用户代理”:“Mozilla/5.0 Macintosh;Intel Mac OS X 10_15_1 AppleWebKit/537.36 KHTML,如Gecko Chrome/79.0.3945.88 Safari/537.36” } const response=await gotURL,headers const$=cheerio.loadresponse.body const reservoirLevelsCopasa=$'conteudo-principal表:类型tr:nth的第一个类型n+3 td:nth-child4'.mapi,el=>parseFloat$el.text.replace',','.'。get console.logreservoirLevelsCopasa 回流储液罐 } main.catchreportAndExit 输出


嗨,谢谢你的及时回复。我尝试添加GitHub链接中的所有标志,并将超时添加到“60000”,但它只是返回了一个更高超时的错误。node:17458 UnhandledPromiseRejectionWarning:TimeoutError:Navigation Timeout Extered:60000ms Extered我相信这与此网站有关,因为当我尝试其他网站时,它工作得非常好。问题提到的是谷歌云虚拟机,而不是云功能。您好,感谢您的及时回复。我尝试添加GitHub链接中的所有标志,并将超时添加到“60000”,但它只是返回了一个更高超时的错误。node:17458 UnhandledPromisejectionWarning:TimeoutError:Navigation Timeout Extered:60000ms Extered我认为这与此网站有关,因为当我尝试其他网站时,它工作得非常好。问题提到的是谷歌云虚拟机,而不是云功能。