1. 程式人生 > 實用技巧 >雙十一的商品價格“明降暗升”?看看每天的價格資料就知道了

雙十一的商品價格“明降暗升”?看看每天的價格資料就知道了

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於Python技術 ,作者派森醬

一年一度的雙十一就快到了,各種砍價、蓋樓、挖現金的口令將在未來一個月內充斥朋友圈、微信群中。玩過多次雙十一活動的小編表示一頓操作猛如虎,一看結果2毛5。浪費時間不說而且未必得到真正的優惠,雙十一電商的“明降暗升”已經是預設的潛規則了。打破這種規則很簡單,可以用 Python 寫一個定時監控商品價格的小工具。

思路

  1. 第一步抓取商品的價格存入 Python 自帶的 SQLite 資料庫
  2. 每天定時抓取商品價格
  3. 使用 pyecharts 模組繪製價格折線圖,讓低價一目瞭然

抓取京東價格

從商品詳情的頁面中開啟 F12 控制面板,找到包含 p.3 的連結,在旁邊的 preview 面板中可以看到當前商品價格

defget_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

把抓取的價格存入 sqlite 資料庫,使用 PyCharm 的 Database 功能建立一個 sqlite 資料庫

最終將資料插入到資料庫

# 新增
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

示例結果

計劃任務

使用輕量級的 schedule 模組每天早上 10 點抓取京東價格這一步驟

安裝 schedule 模組

pip install schedule
def run_price_job(skuId):

    # 使用不佔主執行緒的方式啟動 計劃任務
    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點執行,get_jd_price:任務方法,skuId:任務方法的引數
    schedule.every().day.at("10:00").do(get_jd_price, skuId=skuId)
    run_continuously()

檢視歷史價格

使用 pytharts 模組繪製折線圖,直觀的檢視每一天的價格差異

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("商品歷史價格.html")
    )

總結

本文抓取了京東商城的價格,小夥伴們也可以修個指令碼抓取淘寶的價格。使用 Python 解決生活中的小小痛點,讓錢包不再幹癟。