基于Python爬取京東雙十一商品價(jià)格曲線(xiàn)
一年一度的雙十一就快到了,各種砍價(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à)格折線(xiàn)圖,讓低價(jià)一目了然
抓取京東價(jià)格
從商品詳情的頁(yè)面中打開(kāi) F12 控制面板,找到包含 p.3 的鏈接,在旁邊的 preview 面板中可以看到當(dāng)前商品價(jià)格
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
把抓取的價(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()# 查詢(xún)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 scheduledef run_price_job(skuId): # 使用不占主線(xiàn)程的方式啟動(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 模塊繪制折線(xiàn)圖,直觀(guān)的查看每一天的價(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),讓錢(qián)包不再干癟。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Python如何批量生成和調(diào)用變量2. ASP.Net Core對(duì)USB攝像頭進(jìn)行截圖3. ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車(chē)4. Python 中如何使用 virtualenv 管理虛擬環(huán)境5. Python獲取B站粉絲數(shù)的示例代碼6. Python基于requests實(shí)現(xiàn)模擬上傳文件7. python利用opencv實(shí)現(xiàn)顏色檢測(cè)8. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題9. ASP.Net Core(C#)創(chuàng)建Web站點(diǎn)的實(shí)現(xiàn)10. 通過(guò)CSS數(shù)學(xué)函數(shù)實(shí)現(xiàn)動(dòng)畫(huà)特效
