iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 23
1
AI & Data

Puppeteer 簡單快速建立自己的 Nodejs 爬蟲系列 第 23

Day 23 爬蟲範例-中央社(練習使用typescript)

中央社是我平實再看的新聞網站
裏面的新聞相較其他的,我覺得比較中立。
讓我們用之前的知識,直接開始吧。


中央社


先開啟一個專案吧

mkdir news && cd news && npm init -y && npm i puppeteer cheerio && touch app.js && code .

這邊順便學習一下typescript

npm install -g typescript && tsc --init

把你的路徑加入

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!");
  });
}


上一篇
Day 22 Puppeteer處理lazy load, SSR, 反爬蟲防禦, 高效地爬大量數據
下一篇
Day 24 爬蟲範例-中央社-每個子項(類lazy load)
系列文
Puppeteer 簡單快速建立自己的 Nodejs 爬蟲25

尚未有邦友留言

立即登入留言