寫着玩的,不用再去天天看要買的商品是否降價,若是降價就發佈一條推文。html
#!/usr/bin/env python # coding: utf-8 import tweepy import requests import re import sys import datetime import json # 京東的編碼是gbk reload(sys) sys.setdefaultencoding('gbk') head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" } today = str(datetime.date.today()) myfavourite = { # 這裏的價格是我指望的價格,非商品實際價格 '789778':99.00, # 匯源100%橙汁200ml*24盒 '1169940':179.00 # 飛利浦(PHILIPS)HX6013/05標準型牙刷頭3支裝適用牙刷HX6730HX6761HX6511HX3216HX6972HX3130HX3120HX3110 } # 經過商品id號獲取商品名稱 def getproductname(productid): url = 'http://item.jd.com/' + productid + '.html' s = requests.session() r = s.get(url, headers=head) pattern_title = re.compile(ur"<h1>(.*?)</h1>") result_productname = re.findall(pattern_title, unicode(r.content)) return result_productname # 獲取商品詳細信息 def getproductdetails(productid): url = 'http://pe.3.cn/prices/pcpmgets?skuids=' + productid + '&origin=5&area=15_1213_3409' s = requests.session() r = s.get(url, headers=head).json() return r # p手機端實際價格 pcp電腦端實際價格 # [{u'p': u'168.00', u'pcp': u'188.00', u'm': u'398.00', u'id': u'1456371991'}] # 發佈推文 def posttwitter(content): consumer_key = 'f...j' consumer_secret = 'W...8' access_token = '4...j' access_token_secret = 'Q...M' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) if content: api.update_status(status=content) # 判斷價格漲跌 def detectprice(productid): productdetails = getproductdetails(productid)[0] # {u'p': u'168.00', u'pcp': u'188.00', u'm': u'398.00', u'id': u'1456371991'} result_twitter = '<<' + getproductname(productid)[0] + '>>' + u'降價了!當前手機端價格爲:' + productdetails['p'] log = {'date': today, 'id': productid, 'name': getproductname(productid)[0].encode('utf-8'), 'price': float(productdetails['p'])} result_log = json.dumps(log) if float(productdetails['p']) < myfavourite[productid]: # 若是今天的價格 低於 指望價 with open('log_' + productid + '.txt', "r") as logfile: logfile_content = logfile.readlines()[-1:] # 取最後一行數據,即昨天得價格 if float(productdetails['p']) < json.loads(logfile_content[0])['price']: # 若是今天的價格 低於 昨天的 with open('log_' + productid + '.txt', "a") as logfile: logfile.write(result_log + "\n") posttwitter(result_twitter) return u'推文已發佈!' else: # 若是今天的價格 高於或等於 昨天的 with open('log_' + productid + '.txt', "a") as logfile: logfile.write(result_log + "\n") return u"因爲今天的價格等於或高於昨天,故再也不發佈推文通知!" else: # 若是今天的價格 等於或高於 指望價 with open('log_' + productid + '.txt', "a") as logfile: logfile.write(result_log + "\n") return u"實際價格高於或等於您的預期!" # 調用函數 print detectprice('789778')
附上京東的幾個查詢接口:python
1. http://p.3.cn/prices/mgets?skuIds=J_1456371991
[{"id":"J_1456371991","p":"188.00","m":"398.00"}]express
2. http://c0.3.cn/stock?skuId=1456371991&cat=652,829,854&area=15_1213_3409_0&extraParam={"originid":"1"}
{"stock":{"rn":-1,"IsPurchase":false,"ArrivalDate":"","channel":1,"StockState":33,"PopType":0,"vd":null,"isJDexpress":"0","StockStateName":"現貨","Dti":null,"afsCode":1,"area":{"countyName":"江乾區","success":true,"townName":"","cityName":"杭州市","provinceName":"浙江"},"support":[],"Dc":[{"ordermin":0,"dcash":0,"dtype":1,"freihtType":1}],"dcashDesc":"","sidDely":"-1","rfg":0,"stockDesc":"<strong>有貨</strong>","pr":{"promiseResult":null,"resultCode":-55},"code":1,"skuState":1,"Ext":"fare:0,is7ToReturn:1","realSkuId":1456371991,"promiseResult":"","eir":[{"helpLink":"//help.jd.com/user/issue/103-983.html","showName":"貨到付款","iconType":0,"resultCode":1,"iconTip":"支持送貨上門後再收款,支持現金、POS機刷卡等方式","iconSrc":"貨到付款","picUrl":"http://static.360buyimg.com/item/assets/picon/fangzi.png","iconCode":"pop_PaymentCod"}],"ir":[]},"choseSuit":[]}json
3. http://pe.3.cn/prices/pcpmgets?skuids=1456371991&origin=5&area=15_1213_3409
[{"id":"1456371991","pcp":"188.00","p":"168.00","m":"398.00"}]api