用Python數據分析選購手機,雙十一剛過你選對了嘛

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html

做者: shenzhongqiangnode

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取ajax

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cefjson

分析思路

思路很簡單,上京東商城把全部手機的數據爬下來,而後根據配置、價格過濾出符合條件的手機,在過濾出來的手機裏選擇一部性價比最高的。畫成流程圖,大體是這樣的微信

在這裏插入圖片描述

爬取數據

第一步,咱們先從京東商城爬取全部在售的手機數據。這裏咱們關心的主要是價格和配置信息,商品頁面上的價格和配置信息像下面兩張圖所示 在這裏插入圖片描述 在這裏插入圖片描述網絡

咱們編寫代碼爬取全部手機的價格和配置信息,爬蟲的核心代碼以下函數

 1 # 獲取手機單品的價格
 2 def get_price(skuid):
 3     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"
 4     r = requests.get(url, verify=False)
 5     content = r.content.decode('GBK')
 6     matched = re.search(r'jQuery\d+\((.*)\)', content, re.M)
 7     if matched:
 8         data = json.loads(matched.group(1))
 9         price = float(data["stock"]["jdPrice"]["p"])
10         return price
11     return 0
12 13 # 獲取手機的配置信息
14 def get_item(skuid, url):
15     price = get_price(skuid)
16     r = requests.get(url, verify=False)
17     content = r.content
18     root = etree.HTML(content)
19     nodes = root.xpath('.//div[@class="Ptable"]/div[@class="Ptable-item"]')
20     params = {"price": price, "skuid": skuid}
21     for node in nodes:
22         text_nodes = node.xpath('./dl')[0]
23         k = ""
24         v = ""
25         for text_node in text_nodes:
26             if text_node.tag == "dt":
27                 k = text_node.text
28             elif text_node.tag == "dd" and "class" not in text_node.attrib:
29                 v = text_node.text
30                 params[k] = v
31     return params
32 33 # 獲取一個頁面中的全部手機信息
34 def get_cellphone(page):
35     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)
36     r = requests.get(url, verify=False)
37     content = r.content.decode("utf-8")
38     root = etree.HTML(content)
39     cell_nodes = root.xpath('.//div[@class="p-img"]/a')
40     client = pymongo.MongoClient()
41     db = client[DB]
42     for node in cell_nodes:
43         item_url = fix_url(node.attrib["href"])
44         matched = re.search('item.jd.com/(\d+)\.html', item_url)
45         skuid = int(matched.group(1))
46         saved = db.items.find({"skuid": skuid}).count()
47         if saved > 0:
48             print(saved)
49             continue
50         item = get_item(skuid, item_url)
51         # 結果存入MongoDB
52         db.items.insert(item)

 

須要注意的是,上面的get_price和get_item函數分別從兩個url獲取數據,這是由於配置信息能夠直接從商品頁面中解析獲得,而價格信息須要從另一個ajax請求裏得到。爬下來的全部數據存入MongoDB。性能

過濾數據

爬下來的手機數據當中,信息完整的共有4700多條數據,這4700多部手機屬於70個手機品牌。 這些品牌畫成詞雲圖是這樣的學習

在這裏插入圖片描述

手機的配置主要有如下這些參數ui

  • 是否雙卡雙待

  • 機身材質

  • CPU型號

  • 內存大小

  • 存儲容量

  • 電池容量

  • 屏幕材質

  • 屏幕大小

  • 分辨率

  • 攝像頭

平時用手機主要是看看書、刷刷知乎微信、買買東西,因此選購新手機的時候最關心的就是速度、容量、待機時間這幾項,對攝像頭、屏幕材質倒不是特別在意。考慮以上因素,在對數據作過濾的時候,我設定了如下幾個條件

  • CPU的品牌是高通

  • 內存大小大於等於6GB

  • 存儲容量大於等於64GB

  • 電池容量大於3000mAh

  • 必須是雙卡雙待

  • 價格在1500元之內

過濾數據的代碼以下

1 client = pymongo.MongoClient()
2 db = client[DB]
3 items = db.items.find({})
4 result = preprocess(items)
5 df = pd.DataFrame(result)
6 df_res = df[df.cpu_brand=="驍龍(Snapdragon)"][df.battery_cap >= 3000][df.rom >= 64][df.ram >= 6][df.dual_sim == True][df.price<=1500]
7 print(df_res[["brand", "model", "color", "cpu_brand", "cpu_freq", "cpu_core", "cpu_model", "rom", "ram", "battery_cap", "price"]].sort_values(by="price"))

 

首先從MongoDB裏讀取數據,而後建立DataFrame,對DataFrame裏的數據按照上面的條件做選擇。代碼的最後一行將篩選出來的手機打印出來,並按價格從低到高排序。

通過了這樣一輪篩選後,咱們獲得了下面的38款手機

在這裏插入圖片描述

上面的幾部手機配置都比較接近,可是網上對小米的評價廣泛比較高,因而又在上面的列表裏篩選出了全部的小米手機,獲得下面7款 在這裏插入圖片描述

這裏就變成了紅米Note5和小米6X的PK了。價格上,二者不差上下。配置方面,網上查到紅米Note5的cpu是驍龍636的(上面的表格裏缺乏紅米Note5的cpu型號),相比小米6X的驍龍660,636雖然性能上不如660,但更省電,並且考慮到紅米Note5 4000毫安的超大容量電池,最後決定了購買紅米Note 5這一款。做爲一款千元機,驍龍636八核CPU、6G大內存、64G大存儲、5.99英寸大視野全面屏、前置相機+後置雙攝、超長的待機時間,這款手機大概算是千元機中的機皇了。

相關文章
相關標籤/搜索