斷斷續續地在網路和書籍上學習有關 Python 的爬蟲技術,但隨著反爬蟲的技術也是越來越精進,所以想說藉由 「超新手也能用 Python 爬蟲打造貨比千家的比價網站」這門課來看看能否解決相關的疑惑。這篇來理解如何將全部的資料爬回來。
課程相關資訊
[連結]:https://hiskio.com/courses/527/lectures/30363/creations/133
本篇範圍:Chapter 2 ( 開啟第一個網頁爬蟲 – 自動化收集商品資料 )
請注意:本系列文章為個人對應課程的消化吸收後,所整理出來的內容。換言之,並不一定會包含全部的課程內容,也有可能會添加其他資源來說明。
筆記
1. 可以從搜尋的結果頁面下手
2. 從搜尋的結果中,利用 for … in 迴圈將東西印出來
3. 或者換另外一種思路,從搜尋的頁面取得網址,然後進行 for 迴圈。
4. 用 soup.select,可搭配 class^=abc 來挑出「以 abc 為開頭的 class」。這樣可以確保後面的亂數更動時,爬蟲程式依舊抓地到資料
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import sys import codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) import requests from bs4 import BeautifulSoup headers = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36' } rawRes = requests.get('https://tw.buy.yahoo.com/search/product?flt=%E5%93%81%E7%89%8C_Apple%2C%E8%9E%A2%E5%B9%95%E5%B0%BA%E5%AF%B8_5.4%E5%90%8B%2C%E8%9E%A2%E5%B9%95%E5%B0%BA%E5%AF%B8_6.1%E5%90%8B%2C%E8%9E%A2%E5%B9%95%E5%B0%BA%E5%AF%B8_6.7%E5%90%8B&p=iphone%2013&sort=-price', headers = headers) resText = rawRes.text soup = BeautifulSoup(resText,'html.parser') rawData = soup.findAll('li', class_=re.compile("^BaseGridItem__grid___")) products = [] for item in rawData: link = item.find('a')['href'] req = requests.get(link) res = req.text soup = BeautifulSoup(res,'html.parser') product = {} product['link'] = link product['name'] = soup.select('h1[class^="HeroInfo__title___"]')[0].text product['price'] = soup.select('div[class^="HeroInfo__mainPrice"]')[0].text product['discount'] = soup.select('a[class^="CreditCardAD"]')[0].span.text products.append(product) print(products) |