案例: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