Yahoo! 購物中心商品價格爬蟲教學

Hsiao-Yu
FishTung
Published in
8 min readSep 11, 2018
“selective focus photography of spiderweb” by Nicolas Picard on Unsplash
⚠ 注意事項 ⚠
* 課程內容是本人的嘔心瀝血之作,若有引用請標明出處
* 本文最後編輯日期:2018/09/11

前言

此篇是整個網頁爬蟲教學的第一篇,是我擔任國立臺灣科技大學 Python 網頁爬蟲課程的第一個範例,在這篇中會以 Yahoo! 購物中心 Asus 手機作為本文重點,因為他的排版相當清晰簡單,適合作為第一次寫爬蟲練習所用。

後續的所有操作都會透過 Google Chrome 瀏覽器,請想跟著學的同學下載 Chrome 喔!

我們爬取的目標是頁面中每個商品的標題價格,接著會教各位如何觀察網頁以及撰寫 Python。

觀察網頁

我們要確定網頁中哪個部份是我們要的,才有辦法透過撰寫程式指定位置;因此我們會在瀏覽器中做下列步驟:

1. 點擊滑鼠右鍵

2. 對想觀察的物件點擊檢查,此範例對標題按滑鼠右鍵點擊檢查

3. 將滑鼠放在原始碼標注藍色底的位置,會發現網頁上香對應的位置也會標記著藍底

4. 此時藍底所包覆的位置不包含我們想要的價格,因此我們會用滑鼠在網頁原始碼向上滑動,找到藍底將我們要的資訊都包覆的原始碼

5. 點擊原始碼左邊的下三角符號將原始碼縮小觀察,會發現許多相似的原始碼

6. 滑鼠移到其他相似的原始碼上,能夠發現以相同的格式標記著其他商品資訊,因此確認找到的這些 tag 是要用在寫程式中的

開始寫 Python

觀察完網頁的排版後,我們開始撰寫 Python,在後續的課程中我們會大量的用到 requestsBeautifulSoup 這兩個套件,因此在程式的開頭請先 import 到程式裡

接著我習慣將網址另外定義為一個 url 變數,然後透過 requests 套件向 url 要回網頁原始碼,在透過 BeautifulSoup 解析網頁原始碼,透過 BeautifulSoup 是個很好的方法指定出網頁原始碼的哪個位置是我們想要的,請各位善加利用

在剛剛觀察的網頁原始碼中,我們可以發現到所需要的資訊都被 class = "item yui3-u srp-multi-image" 所包覆,因此可以透過 soup.find_all() 一次取得所有 class = "item yui3-u srp-multi-image" 的資訊,接著使用 for 迴圈將取得的資訊一個個處理,底下範例透過 .stripped_strings 將取得的資訊拆解成多個,因此使用 list() 將其包覆,最後使用 if 判斷如果 補貨中 不在 List 中才印出結果

執行結果:

['ASUS ZenFone Max Pro (6G/64G) ZB602KL智慧手...', '網路價', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G) 性能電...', '網路價', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G) 性能電...', '網路價', '$6,990']
['ASUS ZenFone Max Plus ZB570TL(3G/32G)5.7...', '網路價', '$5,450']
['ASUS ZenFone Max Pro ZB602KL(6G/64G)', '網路價', '$8,990']
['ASUS ZenFone Max Pro (3G/32G) ZB602KL智慧手...', '網路價', '$6,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G)智慧手機', '網路價', '$6,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G)智慧手機', '網路價', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G) 性能電...', '網路價', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G) 性能電...', '網路價', '$6,990']
['ASUS ZenFone Max Pro ZB602KL (3G/32G) 智慧...', '網路價', '$6,990']
['ASUS ZenFone Max Pro ZB602KL (6G/64G) 智慧...', '網路價', '$8,990']
['ASUS ZenFone Max M1 ZB555KL 2G/32G 5.5吋智...', '網路價', '$4,580']

做到這,執行的結果已經和我們要的差不多了!但並不完美,因為在 List 中含有我們沒必要存入資料庫的 '網路價' ,因此接下來我們要將雜訊剔除乾淨,才可作為存入資料庫所使用!

在這邊我們可以善用 pop 的技巧,詳細可以參考我的 Python 資料型態基礎教學,裡面有一些簡單的 List 操作教學

從上面執行結果來看,'網路價' 都很整齊的在 List 的第 2 個位置,因此可以在迴圈中刪除第 2 個位置儲存的物件來處理,因此程式碼增加一行 values.pop(1) 就可以將不要的 '網路價' 拿掉,完整程式碼如下:

執行結果:

['ASUS ZenFone Max Pro (6G/64G) ZB602KL智慧手...', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G) 性能電...', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G) 性能電...', '$6,990']
['ASUS ZenFone Max Plus ZB570TL(3G/32G)5.7...', '$5,450']
['ASUS ZenFone Max Pro ZB602KL(6G/64G)', '$8,990']
['ASUS ZenFone Max Pro (3G/32G) ZB602KL智慧手...', '$6,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G)智慧手機', '$6,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G)智慧手機', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(6G/64G) 性能電...', '$8,990']
['ASUS ZenFone Max Pro ZB602KL(3G/32G) 性能電...', '$6,990']
['ASUS ZenFone Max Pro ZB602KL (3G/32G) 智慧...', '$6,990']
['ASUS ZenFone Max Pro ZB602KL (6G/64G) 智慧...', '$8,990']
['ASUS ZenFone Max M1 ZB555KL 2G/32G 5.5吋智...', '$4,580']

後續存到資料庫的方法會另開一篇解說!連結在下方:

到這邊,Yahoo! 購物中心商品及價格已經透過撰寫 Python 爬蟲抓取下來囉!
教學到這邊告一段落,如果喜歡我的文章,歡迎透過街口支付請我一杯咖啡☕️

--

--