爬蟲 爬爬價

Gary Liao
7 min readApr 4, 2021

--

身為一秒鐘幾十萬上下的平凡上班族,每天上班忙得要死,要買的東西總是忘記去查是否降價,心血來潮就寫了簡單的排程,自動去購物網站抓最新的價格回來。以MOMO為例:

由於只是一個簡單的需求,用Python寫隻簡單的程式打發就好了,我要抓的就是這690的折扣後價格,用瀏覽器檢視後,發現690這個數字就藏在這,而且這個格式只出現一次,簡單的regular expression解決:

import re
re.search(‘(?<=\<span\>)\d+(?=\</span\>)’, html)[0]

有了價格,還是要記錄一下商品名稱,同樣的招用不膩:

re.search('(?<=\<h3\>)[^<>]*(?=\</h3\>)', html)[0]

簡單用sqlite寫個DB存起來,整個範例如下:

#爬爬價
import time
import re
import requests
import sqlite3
# step 1.
# 建立資料庫,用來儲存商品資訊
try:
conn = sqlite3.connect('papaprice.db')
sql = """
CREATE TABLE momo (
i_code TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
price INTEGER NOT NULL,
date TEXT DEFAULT CURRENT_TIMESTAMP
);
"""
conn.execute(sql)
conn.commit()
except:
pass
finally:
if conn:
conn.close()
# step 2.
# 建立簡單的寫入功能
def record_price(i_code, name, price):
sql = """
INSERT OR REPLACE INTO momo (i_code, name, price) VALUES (?,?,?)
"""
try:
conn = sqlite3.connect('papaprice.db')
conn.execute(sql, (i_code, name, price,) )
conn.commit()
conn.close()
return True
except:
if conn:
conn.close()
return False
# step.3
# 將要追蹤的商品的名稱&價格抓下來並寫入資料庫中
items = ['7490474', '8366451', '故意錯誤的商品編號'] # 要追蹤的商品清單# 簡單偽裝一下瀏覽器
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
headers = {'user-agent':user_agent}
url_template = 'https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code={}'
for i_code in items:
url = url_template.format(i_code)
SUCCESS = False
name = 'unknown'
price = None
try:
resp = requests.get(url, headers = headers, timeout = 10)
html = resp.text
name = re.search('(?<=\<h3\>)[^<>]+(?=\</h3\>)', html)[0]
price = re.search('(?<=\<span\>)\d+(?=\</span\>)', html)[0]
SUCCESS = record_price(i_code, name, price)

except:
pass

finally:
print(SUCCESS, i_code, price, name)

time.sleep(3)

簡單用pandas 檢查一下爬回來的結果,不錯!還有押上最新日期:

最後有個重點,上面的範例,只抓兩個商品,如果你目標遠大,想要做完整的查比價功能,一定要用到Proxy服務去替換IP,否則一定會被封鎖!

免費Proxy我就不介紹了,上網Google一下都會有人教你怎麼找,但免錢的最貴,要浪費很多精力去處理例外,所以這裡介紹一款我用過非常穩定又便宜的付費Proxy服務(bright data):

https://brightdata.grsm.io/twforthewin

它有很多不同的Proxy服務,這邊我不一一介紹,我們需要用在這裡的是它的動態住宅網路proxy,它能偽裝成像種花電信住家網路IP一樣,還能選擇國家,每次查詢,他都可以幫你自動換個IP,讓你的爬蟲看起來就像個普通使用者。

基本上,註冊完成後,開通服務需要先刷$1美金,確保信用卡可用,之後它會贈送$5美金的額度,就可以開始使用了;使用上他不會超收你現有的額度,也就是說額度用完就不會繼續讓你連線,算是一種保障;當然如果你事業做很大,不希望抓到一半停下來,也可以設定成用多少刷多少,這邊就先不討論。

剛剛提到的動態住宅網路proxy,藏在左側頁籤,選擇Zones,中間出現的res_totating (就是它),按下它的Edit,會出現一些細節設定:

https://brightdata.grsm.io/twforthewin

接下來就是重頭戲了,只要將Username & Password 嵌入下列程式碼,就可以指向你專用的Proxy,並且可以選擇一定要是台灣IP,台灣價值滿點

# 其實是一行程式碼
# 如果有了-country-tw的部分,就保證是台灣IP
proxies = {'https':f'https://{Username}-country-tw:{Password}@zproxy.lum-superproxy.io:22225'}

接下來使用這個proxy做查詢,對方看到的IP每次都會改變,我們用httpbin來測試這個結果:

可以看到,從httpbin看到的IP,每次都不一樣。我們拿第一筆IP來檢查來源,真的是在台灣,不豪小:

是不是很簡單?

--

--