首页 > 解决方案 > 如何修复错误:产生 ENAMETOOLONG puppeteer?

问题描述

我想使用puppeteer从电子商务网站解析有关新产品的信息。当我在 1-2 小时后运行我的代码取决于我运行的浏览器数量(如果我在 +-1 小时后运行 2 个浏览器)发生错误并且 puppeteer 浏览器不会产生单元,我重新启动我的代码执行。

错误:产生 ENAMETOOLONG

Error: spawn ENAMETOOLONG
      at ChildProcess.spawn (internal/child_process.js:407:11)
      at Object.spawn (child_process.js:553:9)
      at BrowserRunner.start (C:\Users\Administrator\Desktop\crawler-test\node_modules\puppeteer\lib\launcher\BrowserRunner.js:51:34)
      at ChromeLauncher.launch (C:\Users\Administrator\Desktop\crawler-test\node_modules\puppeteer\lib\Launcher.js:64:16)
      at async PuppeteerExtra.launch (C:\Users\Administrator\Desktop\crawler-test\node_modules\puppeteer-extra\dist\index.cjs.js:129:25)
      at async getDataRestock (C:\Users\Administrator\Desktop\crawler-test\test.js:122:21) {  
errno: 'ENAMETOOLONG',   
code: 'ENAMETOOLONG',  
syscall: 'spawn' }

这是一个示例代码:

const puppeteer = require('puppeteer-extra');
const pluginProxy = require('puppeteer-extra-plugin-proxy');

async function getData(urlNew, ...args, proxy) {
    puppeteer.use(pluginProxy({
        address: proxy,
        port: 1050,
        credentials: {
            username: 'okQLjn',
            password: 'vYTNDiJ24D',
        }
    }));
    const browser = await puppeteer.launch({  args: ['--disable-dev-shm-usage'], headless: false });
    const page = await browser.newPage();
    await page.setCookie(...cookies)
    try {
        await page.goto(urlNew, {
            waitUntil: 'networkidle0',
        });
        const data = await page.evaluate(({ ...args }) => {
           //do some parsing
            return prodsAndSizesAndHookProducts;
        }, { ...args });
        await page.close();
        await browser.close();
        return data;
    } catch (err) {
        console.log("ERROR new " + err + ' proxy: ' + proxy);
        await page.close();
        await browser.close();
        Parser(...args)
    }
}

function Parser(...args) {
    if (proxiesTempArr.length == 0) {
        proxiesTempArr.push(...proxies);
    }
    const proxy = proxiesTempArr.shift();
    getData(url, ...args, proxy)
        .then(result => {
            if (result != undefined) {
                const status = 'new product'
                for (let i = 0; i < result[1].length; i++) {
                    Discord.sendHook(...args);
                    Slack.sendHook(...args);
                }
                console.log(status)
                Parser(...args);
            }
        })
        .catch(err => {
            console.log(err + ' err new '  + new Date().toLocaleString());
            Parser(...args);
        })
}

Parser(...args)

运行时会出现一些警告,例如:

MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 targetcreated listeners added to [Browser]. Use emitter.setMaxListeners() to increase limit  
ERROR: The process with PID 1244 (child process of PID 7208) could not be terminated.  
Reason: There is no running instance of the task.

我知道警告很糟糕,但我认为它与错误无关。将不胜感激任何帮助和想法。

标签: javascriptnode.jspuppeteer

解决方案


推荐阅读