iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
1
AI & Data

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

Day 5 擷取所有文章資料

再上一篇我們把第一頁的資料爬了下來
再這篇我們就把目前所有文章都抓下來吧

今天目標把所有資料做成有用的數據

我們先打開我們上次做好的程式碼
今天的問題點在於如何有規律要前往下一頁網站

這次鐵人賽的網址長這樣,是不是找不出如何前往下一頁?

https://ithelp.ithome.com.tw/ironman

我們再網頁上網下滑,先點到第二頁

再查看網址就變成這樣

https://ithelp.ithome.com.tw/ironman?page=2#ir-list

我們發現可以透過page去操作頁數了
讓我們開始修改程式碼吧
我們從這下面這行開始修改

const page = await browser.newPage();
//我們先把data拉出來,準備要儲存所有的資料
let data = []
//end = false時while迴圈會中斷
let end = true
//p = page我們從第1頁開始,最後一頁我們還不知道所以暫定為0
let p = 1, last_p = 0
while (end) {
    //用我們剛剛的網址修改一下讓 p 控制網頁url
    let url = 'https://ithelp.ithome.com.tw/ironman?page=' + p + '#ir-list'
    await page.goto(url);
    await page.waitForSelector('section')
    let body = await page.content()
    let $ = await cheerio.load(body)
    await $('div #ir-list div div ul.list-unstyled.ir-lists li.ir-list').each((i, el) => {
        let $2 = cheerio.load($(el).html())
        let tmp = {
            category: $2('div a div.group-badge__name').text().trim(),
            title: $2('h3.ir-list__title a').text().trim(),
            //再順便把作者抓下來
            author: $2('div.ir-list__info a span').text().trim(),
            //我們再進階處理把他處理成只剩數字
            views: $2('div.ir-list__info').text().trim().split('|')[1].trim().replace(' 次瀏覽', ''),
            herf: $2('h3.ir-list__title a').attr('href')
        }
        data.push(tmp)
    })
    //在這裡切換下一頁
    p++
    //接著我們再這裡搜尋最後一頁再那
    if (last_p === 0) {
        //先定義最大的頁數
        let largest_p = 1
        //一樣我們可以抓取網頁的元素找出最後一頁
        //抓取的地方就在上面圖片的地方
        await $('div #ir-list div div div.text-center.ir-index-page ul.pagination li a').each((i, el) => {
            let tmp = $(el).text()
            //我們可以測出最後一個元素為'下一頁'所以先排除掉
            if (tmp !== '下一頁') {
            //比較最大頁數 parseInt是把字串轉換成數字
                if (parseInt(tmp) > largest_p) largest_p = parseInt(tmp)
            }
        })
        last_p = largest_p
    }
    //如果頁數大於最後一頁就離開
    if (p > last_p) end = false
}

接著執行
過程需要一點時間,如果要觀看他如何跑網站可以把headless設定為false
完成後再local端就可以看到結果

接著我們可以進行簡單的資料分析
先把他透過category分組,透過views去排名

那這我們下一篇再教學吧:)


上一篇
Day 4 擷取 分類 儲存
下一篇
Day 6 鐵人賽文章資料分析(排名與人數)
系列文
Puppeteer 簡單快速建立自己的 Nodejs 爬蟲25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
marlin12
iT邦研究生 5 級 ‧ 2018-10-06 14:16:15

會否談及以下的題目?

  • 怎樣處理lazy load
  • 怎樣用puppeteer來做SSR
  • 如何應對網站反爬蟲防禦
  • 如何高效地爬大量數據
  • 反爬蟲的相關法例

我要留言

立即登入留言