用 Python 制作商品歷史價(jià)格查詢

文 |?某某白米飯
來(lái)源:Python 技術(shù)「ID: pythonall」

一年一度的雙十一就快到了,各種砍價(jià)、蓋樓、挖現(xiàn)金的口令將在未來(lái)一個(gè)月內(nèi)充斥朋友圈、微信群中。玩過(guò)多次雙十一活動(dòng)的小編表示一頓操作猛如虎,一看結(jié)果2毛5。浪費(fèi)時(shí)間不說(shuō)而且未必得到真正的優(yōu)惠,雙十一電商的“明降暗升”已經(jīng)是默認(rèn)的潛規(guī)則了。打破這種規(guī)則很簡(jiǎn)單,可以用 Python 寫(xiě)一個(gè)定時(shí)監(jiān)控商品價(jià)格的小工具。

思路
第一步抓取商品的價(jià)格存入 Python 自帶的 SQLite 數(shù)據(jù)庫(kù) 每天定時(shí)抓取商品價(jià)格 使用 pyecharts 模塊繪制價(jià)格折線圖,讓低價(jià)一目了然
抓取京東價(jià)格
從商品詳情的頁(yè)面中打開(kāi) F12 控制面板,找到包含 p.3 的鏈接,在旁邊的 preview 面板中可以看到當(dāng)前商品價(jià)格
def?get_jd_price(skuId):
????sku_detail_url?=?'http://item.jd.com/{}.html'
????sku_price_url?=?'https://p.3.cn/prices/get?type=1&skuid=J_{}'
????r?=?requests.get(sku_detail_url.format(skuId)).content
????soup?=?BeautifulSoup(r,?'html.parser',?from_encoding='utf-8')
????sku_name_div?=?soup.find('div',?class_="sku-name")
????if?not?sku_name_div:
????????print('您輸入的商品ID有誤!')
????????return
????else:
????????sku_name?=?sku_name_div.text.strip()
????r?=?requests.get(sku_price_url.format(skuId))
????price?=?json.loads(r.text)[0]['p']
????data?=?{
????????'sku_id':?skuId,
????????'sku_name':?sku_name,
????????'price':?price
????}
????return?data
把抓取的價(jià)格存入 sqlite 數(shù)據(jù)庫(kù),使用 PyCharm 的 Database 功能創(chuàng)建一個(gè) sqlite 數(shù)據(jù)庫(kù)


最終將數(shù)據(jù)插入到數(shù)據(jù)庫(kù)
#?新增
def?insert(data):
????conn?=?sqlite3.connect('price.db')
????c?=?conn.cursor()
????sql?=?'INSERT?INTO?price?(sku_id,sku_name,price)?VALUES?("{}",?"{}",?"{}")'.format(data.get("sku_id"),?data.get("sku_name"),?data.get('price')?)
????c.execute(sql)
????conn.commit()
????conn.close()
#?查詢
def?select(sku_id):
????conn?=?sqlite3.connect('price.db')
????c?=?conn.cursor()
????sql?=?'select?sku_id,?sku_name,?price,?time?from?price?where?sku_id?=?"{}"?order?by?time?asc'.format(sku_id)
????cursor?=?c.execute(sql)
????datas?=?[]
????for?row?in?cursor:
????????data?=?{
????????????'sku_id':?row[0],
????????????'sku_name':?row[1],
????????????'price':?row[2],
????????????'time':?row[3]
????????}
????????datas.append(data)
????conn.close()
????return?datas
示例結(jié)果

計(jì)劃任務(wù)
使用輕量級(jí)的 schedule 模塊每天早上 10 點(diǎn)抓取京東價(jià)格這一步驟
安裝 schedule 模塊
pip?install?schedule
def?run_price_job(skuId):
????#?使用不占主線程的方式啟動(dòng)?計(jì)劃任務(wù)
????def?run_continuously(interval=1):
????????cease_continuous_run?=?threading.Event()
????????class?ScheduleThread(threading.Thread):
????????????@classmethod
????????????def?run(cls):
????????????????while?not?cease_continuous_run.is_set():
????????????????????schedule.run_pending()
????????????????????time.sleep(interval)
????????continuous_thread?=?ScheduleThread()
????????continuous_thread.start()
????????return?cease_continuous_run
????
????#?每天10點(diǎn)運(yùn)行,get_jd_price:任務(wù)方法,skuId:任務(wù)方法的參數(shù)
????schedule.every().day.at("10:00").do(get_jd_price,?skuId=skuId)
????run_continuously()
查看歷史價(jià)格
使用 pytharts 模塊繪制折線圖,直觀的查看每一天的價(jià)格差異
datas?=?select(skuId)
def?line(datas):
????x_data?=?[]
????y_data?=?[]
????for?data?in?datas:
????????x_data.append(data.get('time'))
????????y_data.append(data.get('price'))
????(
????????Line()
????????.add_xaxis(x_data)
????????.add_yaxis(datas[0].get('sku_name'),?y_data,?is_connect_nones=True)
????????.render("商品歷史價(jià)格.html")
????)

總結(jié)
本文抓取了京東商城的價(jià)格,小伙伴們也可以修個(gè)腳本抓取淘寶的價(jià)格。使用 Python 解決生活中的小小痛點(diǎn),讓錢包不再干癟。
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺(jué)文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
