用Python数据分析选购手机,双十一刚过你选对了嘛
文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者: shenzhongqiang
ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取
分析思路
爬取数据
第一步,我们先从京东商城爬取所有在售的手机数据。这里我们关心的主要是价格和配置信息,商品页面上的价格和配置信息像下面两张图所示
我们编写代码爬取所有手机的价格和配置信息,爬虫的核心代码如下
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个手机品牌。 这些品牌画成词云图是这样的
手机的配置主要有以下这些参数
-
是否双卡双待
-
机身材质
-
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款