【问题标题】:Javascript asynchronous web crawlerJavascript 异步网络爬虫
【发布时间】:2021-02-09 09:43:34
【问题描述】:

我有一个从 csv 文件中读取网站列表的异步函数。

async function readCSV(){
  const fileStream = fs.createReadStream('./topm.csv');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });


  for await (const line of rl) {
    var currentline=line.split(",");
    
    var res_server_http = await check_page("http://www."+currentline[1]) 
  }

}

每次我阅读网站时,我都会调用 check_page 函数来执行一些操作。 每次我有一个,我都会等待它的结束,然后再开始新的站点。

async function check_page(web_page){
     // do some operations....

}

到目前为止,它可以正常工作,但现在我必须将我的代码与网络爬虫集成。 在readCSV 函数内部,我必须为我阅读的每个站点调用它,并且对于每个我应该调用check_page 函数的站点。

现在我以这种方式编辑readCSV:

const fileStream = fs.createReadStream('./topm.csv');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });

for await (const line of rl) {
    var currentline=line.split(",");

    await (new Promise( resolve => {
      new Crawler().configure({depth: 2})
      .crawl(site, async (page) => {
          //console.log(page.url);
          var res_server_http = await check_page("http://www."+currentline[1])

          // Resolve here
          resolve();
      });
    }));
  
  }

我正在将此代码用于网络爬虫:https://www.npmjs.com/package/js-crawler

这个函数现在不起作用,因为它不是异步的。 如何更改我的代码?


现在我遇到了这个错误:

(node:907) UnhandledPromiseRejectionWarning: ReferenceError: site is not defined
at /Users/francesco/Desktop/tesi/crawler.js:55:14
at new Promise (<anonymous>)
at readCSV (/Users/francesco/Desktop/tesi/crawler.js:53:12)
at processTicksAndRejections (internal/process/task_queues.js:97:5)

(node:907) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:2) (节点:907)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

【问题讨论】:

标签: javascript node.js async-await web-crawler asynchronous-javascript


【解决方案1】:

添加Promise:

  for await (const line of rl) {
    var currentline=line.split(",");

    await (new Promise( resolve => {
      new Crawler().configure({depth: 2})
      .crawl(site, async (page) => {
          //console.log(page.url);
          var res_server_http = await check_page("http://www."+currentline[1])

          // Resolve here
          resolve();
      });
    }));
  }

【讨论】:

  • 我有同样的错误:SyntaxError: await is only valid in async function
  • 抱歉,刚刚修复
  • res_server_http 未使用。你打算怎么用?
  • 我们不知道这是您的错误。这是因为await 关键字只能在用async 声明的函数内使用。在您的原始代码中,用于crawl 的回调没有async 关键字,因此它不能await 来自check_page 的结果。
  • 暂时不用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多