iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
0

那我們就接著繼續把爬蟲完成


那我們找到每跟分類的頁面,跟我們已經可以完整的把資料拿下來了
就只需要做一些簡單的處理

那我們先再前面新增的類別做修改

class Category {
  name: string;
  href: string;
  posts: Array<Post>;
  constructor(name: string, href: string) {
    this.name = name;
    if (href.substr(0, 1) === "/") href = "https://www.cna.com.tw" + href;
    this.href = href;
    this.posts = [];
  }
  public addPost(post: Post) {
    this.posts.push(post);
  }
  public getPosts(): Array<Post> {
    return this.posts;
  }
}

再新增一個Post的類別

class Post {
  title: string;
  data: Date;
  href: string;
  constructor(title: string, date: Date, href: string) {
    this.title = title;
    this.data = date;
    this.href = href;
  }
}

接著我們同樣再getCategorySubPost的回圈裡繼續處理資料

//load網頁
let body = await page.content();
//傳給cheerio
let $ = await cheerio.load(body);
await $(
  "body div #scrollable div div div.wrapper div.centralContent div.statement ul#myMainList.mainList.imgModule li"
).each((i: number, el: any) => {
  let title = $(el)
    .find("a div.listInfo h2")
    .text();
  let date = $(el)
    .find("a div.listInfo div.date")
    .text();
  let href = $(el)
    .find("a")
    .attr("href");
  element.addPost(new Post(title, new Date(date), href));

再這個方法底下記得回傳data

return data;

這樣就完成了

資料長這樣

 {
    "name": "即時",
    "href": "https://www.cna.com.tw/list/aall.aspx",
    "posts": [
      {
        "title": "安倍訪中 謝長廷:密切注意發展",
        "data": "2018-10-25T13:48:00.000Z",
        "href": "https://www.cna.com.tw/news/aopl/201810250376.aspx"
      },
      {
        "title": "美不派高層參加進博會 中:美企參展數排第3",
        "data": "2018-10-25T13:47:00.000Z",
        "href": "https://www.cna.com.tw/news/acn/201810250375.aspx"
      },
      {
        "title": "機率1/6700萬 澳業餘高球員單回合兩度一桿進洞",
        "data": "2018-10-25T13:40:00.000Z",
        "href": "https://www.cna.com.tw/news/aspt/201810250374.aspx"
      },
      
    .......

上一篇
Day 24 爬蟲範例-中央社-每個子項(類lazy load)
系列文
Puppeteer 簡單快速建立自己的 Nodejs 爬蟲25

尚未有邦友留言

立即登入留言