Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 使用ChereIO抓取多个网页_Javascript_Node.js_Web Scraping - Fatal编程技术网

Javascript 使用ChereIO抓取多个网页

Javascript 使用ChereIO抓取多个网页,javascript,node.js,web-scraping,Javascript,Node.js,Web Scraping,我正在学习使用Cheerio从网页中获取数据。我已经知道如何从一个页面获取数据,但现在我正试图找出如何对多个页面进行同样的操作 我有两个独立的函数,一个用于两个url。在我的index.js中,我使用如下函数: const express = require('express'); const scraper = require('./scraper'); const fs = require('fs'); const app = express(); app.get('/search/:ti

我正在学习使用Cheerio从网页中获取数据。我已经知道如何从一个页面获取数据,但现在我正试图找出如何对多个页面进行同样的操作

我有两个独立的函数,一个用于两个url。在我的index.js中,我使用如下函数:

const express = require('express');
const scraper = require('./scraper');
const fs = require('fs');
const app = express();
 app.get('/search/:title', (req, res) => {
  scraper.func1(req.params.title).then(cars => {
    res.json(cars);
    fs.writeFile(
      './json/cars.json',
      JSON.stringify(cars, null, 2), // optional params to format it 
nicely
       err =>
         err
          ? console.error('Data not written!', err)
          : console.log('Data written!')
    );
  });
  scraper.func2(req.params.title).then(cars => {
    res.json(cars);
    fs.writeFile(
      './json/cars2.json',
      JSON.stringify(cars, null, 2), // optional params to format it 
nicely
      err =>
        err
          ? console.error('Data2 not written!', err)
          : console.log('Data2 written!')
    );
  });
});
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Listening on ${port}`);
}); 

显然,这两个函数在这样链接时不起作用。分开来看,它们都很好用。所以我的问题是,我应该如何链接这两个函数以正确使用它们

为此,我将使用async/await语法,它将使代码更干净

我们将按顺序调用每个函数,然后组合响应并发送回客户端

const express = require('express');
const scraper = require('./scraper');
const fs = require('fs');
const app = express();

function writeJsonToFile(fileName, data) {
    fs.writeFile(fileName,
        JSON.stringify(data, null, 2), // optional params to format it nicely
        err =>
        err
            ? console.error('Data not written!', err)
            : console.log(`Data written to file: ${fileName}!`)
    );
}

app.get('/search/:title', async (req, res) => {

    try { 
        let cars1 = await scraper.func1(req.params.title);
        writeJsonToFile('./json/cars1.json', cars1);

        let cars2 = await scraper.func2(req.params.title);
        writeJsonToFile('./json/cars2.json', cars2);

        let combinedResponse = { cars1, cars2 };
        res.json(combinedResponse);

    } catch (err) {
        res.json({ error: `Something bad happened: ${err.message}` });
    }
})

const port = process.env.PORT || 3000;
    app.listen(port, () => {
    console.log(`Listening on ${port}`);
});