案例:pchome24h 爬蟲 - 搜索功能 多頁搜索

撰寫時的直播影片

https://youtu.be/emMJss6rJGE?t=4076

本文請先參考 第一篇

案例:pchome24h 商品爬蟲 - 搜索功能

首先 根據上一篇的分析

原始網址:
https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=%E8%97%8D%E8%8A%BD%E9%9F%B3%E9%9F%BF&page=1&sort=sale/dc
分析結果 
 使用的傳輸方法:GET
 請求的內容有 q , page , sort
 從英文直譯的猜測
 q = 查詢的關鍵字
 page = 第幾頁
 sort = 排序

開發邏輯

要做多頁搜索,最簡單的便是直接修改 page的參數為第幾頁
那麼問題就來了,頁面到底有幾頁?
所以我們的開發順序如下
1. 搜索結果到底有幾頁
2. 針對每個頁數來進行抓取

觀察 頁數顯示在哪裡

pchome 24h 將所有筆數、頁數 都統一輸出在 results 裡面 也就是我們上一篇爬的第一個網址
一般來講網站通常不會這麼大方…做為入門教學足以

針對JSON的資料處理

網頁傳輸資料,一般結構化的溝通 都會用json格式
json格式 一般長的就是像這樣 {"keyword":"value"}或是 這樣 [{"keyword":"value"}]
python 本身有提供完善的json格式 我們可以直接引用

JSON相關的處理 請參考 這裡

以下為範例程式碼

import requests #先引用requests
import time

#目標網址為:https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=關鍵字
#請求範例:https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=%E8%97%8D%E8%8A%BD%E9%9F%B3%E9%9F%BF&page=1&sort=sale/dc

#建構網址
keyword = "藍芽音響"
url = "https://ecshweb.pchome.com.tw/search/v3.3/all/results?q="+keyword+"&page=1&sort=sale/dc"

#嘗試請求
rs = requests.get(url=url)

#輸出結果
data = rs.text
print(data)

import json #引用json函式

json_data = json.loads(data)
page_max = json_data['totalPage'] #取得所有頁數

all_items = [] #先宣告一個 所有商品的保存陣列




for n in range(page_max): #針對頁數做一個迴圈
    page_num = n + 1 #因為 頁碼會從0開始計算
    if page_num > 20: #只爬到第20頁就停止,本次教學 不含換ip教學 所以先這樣
        break

    # 建構網址
    #將頁碼與字串合併,因為 頁數為 整數int型別,所以要括一個format來進行轉換
    url = "https://ecshweb.pchome.com.tw/search/v3.3/all/results?q=" + keyword + "&page="+format(page_num)+"&sort=sale/dc"
    # 嘗試請求
    rs = requests.get(url=url)
    # 輸出結果
    data = rs.text
    try:#做一個例外處理,如果出現錯誤可以避免卡住
        page_data = json.loads(data)#轉換json格式
        products = page_data['prods']#取得商品列表
        for pro in products:
            all_items.append(pro)#將商品保存進商品陣列
        # print(data)
        print("目前進度頁數 {}/{} 已保存:{}個商品".format(page_num,page_max,len(all_items)))#字串整合的應用
    except Exception as e: #輸出的錯誤名稱叫e
        print(e) #印出錯誤內容
        print(data) #印出這一頁所抓取的值

    time.sleep(1)#記得要休息一秒再抓取,不然會被封ip

#保存結果
all_items_json = json.dumps(all_items) #將資料轉為json格式字串
fp = open("result.txt",'w',encoding="utf-8")#建立檔案
fp.write(all_items_json)#寫入
fp.close()#關閉檔案

輸出結果

Last updated