[英]Scraping multiple web pages with Cheerio
我正在學習使用Cheerio從網頁上抓取數據。 我已經知道如何從單個頁面獲取數據,但是現在我想弄清楚如何對多個頁面執行相同的操作。
我有兩個單獨的函數,兩個都一個。 在我的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}`);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.