再上一篇我們把第一頁的資料爬了下來
再這篇我們就把目前所有文章都抓下來吧
今天目標把所有資料做成有用的數據
我們先打開我們上次做好的程式碼
今天的問題點在於如何有規律要前往下一頁網站
這次鐵人賽的網址長這樣,是不是找不出如何前往下一頁?
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去排名
那這我們下一篇再教學吧:)
會否談及以下的題目?