用数据分析选购手机
作者 | shenzhongqiang??
來(lái)源 |? Python與數(shù)據(jù)分析
9月13日發(fā)布的iPhone Xs算是手機(jī)界的大新聞了,新款iPhone的價(jià)格也再度刷新了手機(jī)定價(jià)的記錄。看完發(fā)布會(huì),相信很多人的心情是這樣的
強(qiáng)哥之前用的iPhone 6,最近準(zhǔn)備換手機(jī)。經(jīng)濟(jì)形勢(shì)嚴(yán)峻,換iPhone是換不起了,只能消費(fèi)降級(jí),投奔安卓陣營(yíng)。
1500元的預(yù)算,連個(gè)二手的iPhone都買(mǎi)不了,但是在安卓機(jī)里卻有不少選擇。本文我們就來(lái)看看怎樣用數(shù)據(jù)分析選購(gòu)手機(jī)。
分析思路
思路很簡(jiǎn)單,上京東商城把所有手機(jī)的數(shù)據(jù)爬下來(lái),然后根據(jù)配置、價(jià)格過(guò)濾出符合條件的手機(jī),在過(guò)濾出來(lái)的手機(jī)里選擇一部性價(jià)比最高的。畫(huà)成流程圖,大致是這樣的
爬取數(shù)據(jù)
第一步,我們先從京東商城爬取所有在售的手機(jī)數(shù)據(jù)。這里我們關(guān)心的主要是價(jià)格和配置信息,商品頁(yè)面上的價(jià)格和配置信息像下面兩張圖所示
我們編寫(xiě)代碼爬取所有手機(jī)的價(jià)格和配置信息,爬蟲(chóng)的核心代碼如下
# 獲取手機(jī)單品的價(jià)格 def get_price(skuid):url = "https://c0.3.cn/stock?skuId=" + str(skuid) + "&area=1_72_4137_0&venderId=1000004123&cat=9987,653,655&buyNum=1&choseSuitSkuIds=&extraParam={%22originid%22:%221%22}&ch=1&fqsp=0&pduid=15379228074621272760279&pdpin=&detailedAdd=null&callback=jQuery3285040"r = requests.get(url, verify=False)content = r.content.decode('GBK')matched = re.search(r'jQuery\d+\((.*)\)', content, re.M)if matched:data = json.loads(matched.group(1))price = float(data["stock"]["jdPrice"]["p"])return pricereturn 0# 獲取手機(jī)的配置信息 def get_item(skuid, url):price = get_price(skuid)r = requests.get(url, verify=False)content = r.contentroot = etree.HTML(content)nodes = root.xpath('.//div[@class="Ptable"]/div[@class="Ptable-item"]')params = {"price": price, "skuid": skuid}for node in nodes:text_nodes = node.xpath('./dl')[0]k = ""v = ""for text_node in text_nodes:if text_node.tag == "dt":k = text_node.textelif text_node.tag == "dd" and "class" not in text_node.attrib:v = text_node.textparams[k] = vreturn params# 獲取一個(gè)頁(yè)面中的所有手機(jī)信息 def get_cellphone(page):url = "https://list.jd.com/list.html?cat=9987,653,655&page={}&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=4#J_main".format(page)r = requests.get(url, verify=False)content = r.content.decode("utf-8")root = etree.HTML(content)cell_nodes = root.xpath('.//div[@class="p-img"]/a')client = pymongo.MongoClient()db = client[DB]for node in cell_nodes:item_url = fix_url(node.attrib["href"])matched = re.search('item.jd.com/(\d+)\.html', item_url)skuid = int(matched.group(1))saved = db.items.find({"skuid": skuid}).count()if saved > 0:print(saved)continueitem = get_item(skuid, item_url)# 結(jié)果存入MongoDBdb.items.insert(item)需要注意的是,上面的get_price和get_item函數(shù)分別從兩個(gè)url獲取數(shù)據(jù),這是因?yàn)榕渲眯畔⒖梢灾苯訌纳唐讽?yè)面中解析得到,而價(jià)格信息需要從另外一個(gè)ajax請(qǐng)求里獲得。爬下來(lái)的所有數(shù)據(jù)存入MongoDB。
過(guò)濾數(shù)據(jù)
爬下來(lái)的手機(jī)數(shù)據(jù)當(dāng)中,信息完整的共有4700多條數(shù)據(jù),這4700多部手機(jī)屬于70個(gè)手機(jī)品牌。 這些品牌畫(huà)成詞云圖是這樣的
手機(jī)的配置主要有以下這些參數(shù)
是否雙卡雙待
機(jī)身材質(zhì)
CPU型號(hào)
內(nèi)存大小
存儲(chǔ)容量
電池容量
屏幕材質(zhì)
屏幕大小
分辨率
攝像頭
強(qiáng)哥平時(shí)用手機(jī)主要是看看書(shū)、刷刷知乎微信、買(mǎi)買(mǎi)東西,所以選購(gòu)新手機(jī)的時(shí)候最關(guān)心的就是速度、容量、待機(jī)時(shí)間這幾項(xiàng),對(duì)攝像頭、屏幕材質(zhì)倒不是特別在乎。考慮以上因素,在對(duì)數(shù)據(jù)做過(guò)濾的時(shí)候,我設(shè)定了以下幾個(gè)條件
CPU的品牌是高通
內(nèi)存大小大于等于6GB
存儲(chǔ)容量大于等于64GB
電池容量大于3000mAh
必須是雙卡雙待
價(jià)格在1500元以內(nèi)
過(guò)濾數(shù)據(jù)的代碼如下
client = pymongo.MongoClient() db = client[DB] items = db.items.find({}) result = preprocess(items) df = pd.DataFrame(result) df_res = df[df.cpu_brand=="驍龍(Snapdragon)"][df.battery_cap >= 3000][df.rom >= 64][df.ram >= 6][df.dual_sim == True][df.price<=1500] print(df_res[["brand", "model", "color", "cpu_brand", "cpu_freq", "cpu_core", "cpu_model", "rom", "ram", "battery_cap", "price"]].sort_values(by="price"))首先從MongoDB里讀取數(shù)據(jù),然后創(chuàng)建DataFrame,對(duì)DataFrame里的數(shù)據(jù)按照上面的條件作選擇。代碼的最后一行將篩選出來(lái)的手機(jī)打印出來(lái),并按價(jià)格從低到高排序。
經(jīng)過(guò)了這樣一輪篩選后,我們得到了下面的38款手機(jī)
上面的幾部手機(jī)配置都比較接近,但是網(wǎng)上對(duì)小米的評(píng)價(jià)普遍比較高,于是又在上面的列表里篩選出了所有的小米手機(jī),得到下面7款
這里就變成了紅米Note5和小米6X的PK了。價(jià)格上,兩者不差上下。配置方面,網(wǎng)上查到紅米Note5的cpu是驍龍636的(上面的表格里缺少紅米Note5的cpu型號(hào)),相比小米6X的驍龍660,636雖然性能上不如660,但更省電,而且考慮到紅米Note5 4000毫安的超大容量電池,最后決定了購(gòu)買(mǎi)紅米Note 5這一款。作為一款千元機(jī),驍龍636八核CPU、6G大內(nèi)存、64G大存儲(chǔ)、5.99英寸大視野全面屏、前置相機(jī)+后置雙攝、超長(zhǎng)的待機(jī)時(shí)間,這款手機(jī)大概算是千元機(jī)中的機(jī)皇了。
所有代碼已上傳github,公眾號(hào)后臺(tái)回復(fù)“手機(jī)”可獲取地址。
◆?◆?◆ ?◆?◆
數(shù)據(jù)森麟 長(zhǎng)按二維碼關(guān)注我們
猜你喜歡
●?
●?
●?
數(shù)據(jù)森麟公眾號(hào)的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒(méi)有加入的小伙伴可以通過(guò)掃描下方管理員二維碼,讓管理員幫忙拉進(jìn)群,期待大家的加入。
管理員二維碼:
總結(jié)
- 上一篇: 小学三年级计算机导学案,小学三年级下册科
- 下一篇: 没有什么秘密的学习方法