撈取深網中的資料-蝦皮購物API

星期四 18 Jul 2019   even  
教學

前言

深層網路(Deep Web)是指無法被搜索引擎搜索到的網站內容。使用瀏覽器拜訪一個網站,除了一個主要的html檔之外,對方的伺服器同時會載入許多檔案讓這個網頁能正常運作,例如:圖片檔、css、javascript、json檔等,這些檔案也都會有各自的網址,但並不會被搜索引擎給包含到,也就屬於深層網路的部分。

當你要進行爬蟲時,務必要先檢查這些深層網路的檔案內容,有時候你想要的網頁資料通通都藏在這裡,讓你可以很簡便的抓取。

要如何查看這些檔案呢?很簡單,使用你的瀏覽器就可以了。

使用瀏覽器的檢查功能

我習慣使用firefox進行檢查,介面比較直觀,因此這裡會以firefox作為範例,但不論是哪種瀏覽器,邏輯是差不多的。

流程如下:

首先前往要檢查的網站,在任意地方按下右鍵,選擇檢查網站,此時你的瀏覽器視窗會被新冒出來的檢查視窗分割。

點選網路,按下重新整理(或F5),這時候就可以一一點選查看所右網頁讀取進來的檔案。

延續上一篇教學,我依然使用蝦皮購物網進行示範,操作流程示範影片如下:

要檢查什麼呢?

首先查看html這裡,這個主網頁是哪種請求方法?

這個網站的請求方法是GET。除了GET之外還會有POST的請求方法,這就必須使用不同的程式碼來進行爬蟲。而如果是POST的話,則需要再察看參數,在使用進行爬蟲時需要在額外輸入這些參數,這部分留到下一篇教學再仔細跟各位介紹。

這裡顯示參數的名稱為keyword,內容為switch主機,因為是以GET的方式請求,因此參數就直接在網址裡面。

接著檢查XHR,有些網站會以額外的方式將資料以json或xml的格式送進網頁中,如果你能直接獲取這些檔案,那就不用去處理解析網站原始碼的部分。

在XHR中有許多網址,逐一檢查,這裡很多網址都包含了api,很有可能就是用來傳輸資料給網頁。

例如這裡的網址就非常的可疑, https://shopee.tw/api/v2/search_items/?by=relevancy&keyword=switch%E4%B8%BB%E6%A9%9F&limit=50&newest=0&order=desc&page_type=search

,既提到api又寫到seach_items,很有可能資料都在這裡喔。

直接用瀏覽器前往這個網址,商品資料果然在這裡。

但是很多資料都是缺值,例如我們最在乎的商品價格。所以無法以api的方式查詢商品價格嗎?

我們在嘗試隨便前往任一商品的分頁檢查,看看有沒有類似的api來傳送商品價格。

https://shopee.tw/Nintendo-Switch%E4%B8%BB%E6%A9%9F-%E9%9B%BB%E5%85%89%E7%B4%85%E8%97%8D(%E5%8F%B0%E7%81%A3%E5%85%AC%E5%8F%B8%E8%B2%A8)-i.39500389.2495200573

找到一個很可疑的網址,這裡面會不會有商品價格呢?

https://shopee.tw/api/v2/item/get?itemid=2495200573&shopid=39500389

有!

看來我們可以利用這兩個api來進行爬蟲,抓取商品價格。

邏輯大概是這樣子的,在第一個api中輸入關鍵字,將裡面的itemid和shopid抓取出來,放到第二個api底下去查詢商品價格。

OK~我們可以開始寫程式以這條路徑爬取商品價格。

編寫程式

使用requests與json套件,json套件可以將json格式轉成python的dict,讓我們可以很簡單的讀取到內容。

import requests
import json

嘗試獲取第一個api的資訊,商品名稱、itemid、shopid:

一樣要使用User-Agent為Googlebot才可以喔,不然會被重新導向,抓不到任何資料。

url = 'https://shopee.tw/api/v2/search_items/?by=relevancy&keyword=switch&limit=50'

headers = {
        'User-Agent': 'Googlebot',
    }

r = requests.get(url,headers=headers)

api1_data = json.loads(r.text)

# 查看第8筆資料的內容:
print(api1_data['items'][8]['name'])
print(api1_data['items'][8]['itemid'])
print(api1_data['items'][8]['shopid'])

【NS】Nintendo Switch 主機【電光藍/電光紅】(台灣公司
1146332423
2167422

好,接著使用這組itemid和shopid來爬取這筆商品的價格。

itemid = api1_data['items'][8]['itemid']
shopid = api1_data['items'][8]['shopid']
url2 = f'https://shopee.tw/api/v2/item/get?itemid={itemid}&shopid={shopid}'

r = requests.get(url2,headers=headers)
api2_data = json.loads(r.text)
print(api2_data['item']['price'])

948000000

多出了五個零,沒關係,移掉就好。

OK~

我們可以很簡單的編寫爬蟲程式獲取商品價格,最後在把上面的程式改寫成好用函式吧~

import time
import requests
import json

def shopeeAPI_Scraper(keyword, n_items):

    url1 = f'https://shopee.tw/api/v2/search_items/?by=relevancy&keyword={keyword}&limit={n_items}'
    headers = {'User-Agent': 'Googlebot',}
    r = requests.get(url1,headers=headers)
    api1_data = json.loads(r.text)
    
    for i in range(n_items):
        itemid = api1_data['items'][i]['itemid']
        shopid = api1_data['items'][i]['shopid']
        
        url2 = f'https://shopee.tw/api/v2/item/get?itemid={itemid}&shopid={shopid}'
        r = requests.get(url2,headers=headers)
        api2_data = json.loads(r.text)
        output = api1_data['items'][i]['name'].ljust(50) +': ' + str(api2_data['item']['price']/100000)
        print(output)
        time.sleep(0.2)
    
    
    
shopeeAPI_Scraper(keyword = '溜冰鞋', n_items = 10)

【免運 再送您價值320元運動腰包】 溜冰鞋 成功 S0355 成人 平地花式溜冰鞋 成人溜冰鞋 無剎車: 2490.0
【免運 台灣出貨】【成功】 S0480 發光輪 兒童 伸縮 溜冰鞋組 (含頭盔、護具、背袋) 直排輪 溜冰鞋 : 1800.0
【RaReTek】兒童溜冰鞋 滑冰鞋 四輪旱冰鞋 兒童輪滑鞋 寶寶溜冰鞋 雙排輪 適合2~6歲初學者: 649.0
㊣溜冰鞋成人全閃光直排輪滑鞋成年男女生小孩單排旱冰鞋 : 784.0
㊣兒童溜冰鞋雙排輪滑鞋男女孩四輪滑冰鞋PU閃光成人旱冰 : 1052.0
【最後優惠】【成功】S0350 道路溜冰鞋 成人溜冰鞋 都市 直排輪 溜冰鞋 (3種尺寸、固定式 : 1920.0
台灣現貨成人雙排溜冰鞋兒童四輪直排旱冰輪滑男大童女學生休閒 : 4510.0
幼兒童溜冰鞋套裝1寶寶2小孩3小童4男5女6歲四輪滑旱冰 : 1138.0
白色高檔 成人雙排溜冰鞋 旱冰鞋 成年男女雙排輪 輪滑 : 1386.0
【免運 台灣出貨】 【成功】S0420 鋁合金 伸縮溜冰鞋組(含頭盔、護具、背袋) 直排 : 1920.0

結語

本章節介紹如何使用瀏覽器的檢查功能,告訴我們該怎麼爬這個網站,這也是進行爬蟲時最重要的步驟之一:觀察網站結構

先在這個步驟規劃好要怎麼爬,寫程式的時候才會輕鬆又愉快。不會像無頭蒼蠅一樣不知如何下手。

以蝦皮購物網為例,雖然直接解析網頁原始碼就可以獲得商品資訊,但是使用api的話就可以完全省去這段過程。另外,有些網站的網頁原始碼完全沒有目標資料,但藉由檢查的過程中,可以發現偷偷傳送資料的網址,就有辦法進行爬蟲。

感謝您耐心閱讀到最後,祝您有美好的一天,我們下回見~

python 網頁爬蟲教學
python網路爬蟲簡介
python網路爬蟲基本工具(1)
python網路爬蟲教學-實戰篇(1) 蘋果日報馬網
使用偽裝user-agent爬取蝦皮購物網
撈取深網中的資料-蝦皮購物API
以POST方式抓取資料-政府電子採購網
python網路爬蟲教學-Selenium基本操作
python網路爬蟲應用-facebook社團成員參與度分析

相關文章:

>