> For the complete documentation index, see [llms.txt](https://water-1.gitbook.io/requests/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://water-1.gitbook.io/requests/an-li-pchome24h-pa-chong-sou-suo-gong-neng-duo-ye-sou-suo.md).

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

> 撰寫時的直播影片
>
> <https://youtu.be/emMJss6rJGE?t=4076>

### 本文請先參考 第一篇 &#x20;

[案例：pchome24h 商品爬蟲 - 搜索功能](/requests/an-li-pchome24h-pa-chong-sou-suo-gong-neng-duo-ye-sou-suo/an-li-pchome24h-shang-pin-pa-chong-sou-suo-gong-neng.md#wang-zhan-de-chuan-shu-jie-gou)

首先 根據上一篇的分析

```
原始網址：
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. 針對每個頁數來進行抓取
```

### 觀察 頁數顯示在哪裡

![](/files/-LpP1CtiP1l8EyAVNM6w)

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

### 針對JSON的資料處理

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

JSON相關的處理 請參考 [這裡 ](/requests/json-ge-shi-de-cao-zuo.md)

### 以下為範例程式碼

```
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()#關閉檔案

```

### 輸出結果

![](/files/-LpP71PBI29UIonZ6ERR)
