中央社是我平實再看的新聞網站
裏面的新聞相較其他的,我覺得比較中立。
讓我們用之前的知識,直接開始吧。
先開啟一個專案吧
mkdir news && cd news && npm init -y && npm i puppeteer cheerio && touch app.js
這邊順便學習一下typescript
npm install -g typescript && tsc --init
安裝型別
npm i @types/puppeteer @types/cheerio --dev && code .
把你的路徑加入
tsc -p path/to/your/tsconfig.json
在package.json加入這行
"scripts": {
"start":"tsc && node app.js",
}
接著進入app.js,基本取得需要的套件並開啟測試
const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.goto('https://www.cna.com.tw/');
await page.waitForSelector('footer')
let body: string = await page.content()
await browser.close();
})();
接著下
npm run start
但會跑出這錯誤
我們去tsconfig.json並再lib放入es2015,因為Promise需要
"lib": ["es2015"]
再跑一次就成功了
今天的任務先把分類爬下來吧
const puppeteer = require("puppeteer");
const cheerio = require("cheerio");
//main function 主要的函數
(async () => {
const browser = await puppeteer.launch({
headless: true
});
const page = await browser.newPage();
await page.goto("https://www.cna.com.tw/");
await page.waitForSelector("footer");
let body: string = await page.content();
let data: Array<Object> = await getCategory(body);
saveToFile(data);
await browser.close();
})();
//負責抓類別的函數,這裡是async函數必須要回傳Promise
async function getCategory(body: string): Promise<Array<Object>>{
let $ = await cheerio.load(body);
let data: Array<Object> = [];
await $(
"div header div div div #pnProductNav #pnProductNavContents ul.main-menu li"
).each((i: number, el: any) => {
//抓取類別,這裡其實抓的到子類別的名子和網址。但我們先把他忽略
let name: string = $(el)
.find("a.first-level")
.text();
let herf: string = $(el)
.find("a.first-level")
.attr("href");
if (name === "" && herf === undefined) return;
data.push({
name: name,
href: herf
});
});
return data;
}
function saveToFile(data: Array<Object>) {
const fs = require("fs");
const content = JSON.stringify(data); //轉換成json格式
fs.writeFile("news.json", content, "utf8", function(err: Error) {
if (err) {
return console.log(err);
}
console.log("The file was saved!");
});
}