用Python数据分析选购手机

简介:

9月13日发布的iPhone Xs算是手机界的大新闻了,新款iPhone的价格也再度刷新了手机定价的记录。看完发布会,相信很多人的心情是这样的 87c0edf5590a70596ca2e79c7c931803677f496e

强哥之前用的iPhone 6,最近准备换手机。经济形势严峻,换iPhone是换不起了,只能消费降级,投奔安卓阵营。

1500元的预算,连个二手的iPhone都买不了,但是在安卓机里却有不少选择。本文我们就来看看怎样用数据分析选购手机。

分析思路

思路很简单,上京东商城把所有手机的数据爬下来,然后根据配置、价格过滤出符合条件的手机,在过滤出来的手机里选择一部性价比最高的。画成流程图,大致是这样的

350562bb3dcdc0f847de60749c3b63e56472a1c3

爬取数据

第一步,我们先从京东商城爬取所有在售的手机数据。这里我们关心的主要是价格和配置信息,商品页面上的价格和配置信息像下面两张图所示

1cf4d5b4104228435901f6e648a2be41c31a8c2f

我们编写代码爬取所有手机的价格和配置信息,爬虫的核心代码如下

 

# 获取手机单品的价格
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 price
return 0

# 获取手机的配置信息
def get_item (skuid, url):
price = get_price(skuid)
r = requests.get(url, verify= False )
content = r.content
root = 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.text
elif text_node.tag == "dd" and "class" not in text_node.attrib:
v = text_node.text
params[k] = v
return params

# 获取一个页面中的所有手机信息
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)
continue
item = get_item(skuid, item_url)
# 结果存入MongoDB
db.items.insert(item)

需要注意的是,上面的get_price和get_item函数分别从两个url获取数据,这是因为配置信息可以直接从商品页面中解析得到,而价格信息需要从另外一个ajax请求里获得。爬下来的所有数据存入MongoDB。

过滤数据

爬下来的手机数据当中,信息完整的共有4700多条数据,这4700多部手机属于70个手机品牌。 这些品牌画成词云图是这样的

436794dab635c74183759b0f9e2348218cf1c9ce

手机的配置主要有以下这些参数

 ●  是否双卡双待
 ●  机身材质
 ●  CPU型号
 ●  内存大小
 ●  存储容量
 ●  电池容量
 ●  屏幕材质
 ●  屏幕大小
 ●  分辨率
 ●  摄像头

强哥平时用手机主要是看看书、刷刷知乎微信、买买东西,所以选购新手机的时候最关心的就是速度、容量、待机时间这几项,对摄像头、屏幕材质倒不是特别在乎。考虑以上因素,在对数据做过滤的时候,我设定了以下几个条件

 ●  CPU的品牌是高通
 ●  内存大小大于等于6GB
 ●  存储容量大于等于64GB
 ●  电池容量大于3000mAh
 ●  必须是双卡双待
 ●  价格在1500元以内

过滤数据的代码如下

 

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里读取数据,然后创建DataFrame,对DataFrame里的数据按照上面的条件作选择。代码的最后一行将筛选出来的手机打印出来,并按价格从低到高排序。

经过了这样一轮筛选后,我们得到了下面的38款手机

fcbe878b1c3c44d88d5f192bd5dc5a64a901158a

上面的几部手机配置都比较接近,但是网上对小米的评价普遍比较高,于是又在上面的列表里筛选出了所有的小米手机,得到下面7款

d69c058e5d6cde98251f28540451f216488e2574

这里就变成了红米Note5和小米6X的PK了。价格上,两者不差上下。配置方面,网上查到红米Note5的cpu是骁龙636的(上面的表格里缺少红米Note5的cpu型号),相比小米6X的骁龙660,636虽然性能上不如660,但更省电,而且考虑到红米Note5 4000毫安的超大容量电池,最后决定了购买红米Note 5这一款。作为一款千元机,骁龙636八核CPU、6G大内存、64G大存储、5.99英寸大视野全面屏、前置相机+后置双摄、超长的待机时间,这款手机大概算是千元机中的机皇了。


原文发布时间为:2018-10-8

本文作者:shenzhongqiang

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

相关文章
|
1月前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
1033 1
|
1月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
349 0
|
1月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
2月前
|
数据采集 数据可视化 数据挖掘
Python数据分析实战:Pandas处理结构化数据的核心技巧
在数据驱动时代,结构化数据是分析决策的基础。Python的Pandas库凭借其高效的数据结构和丰富的功能,成为处理结构化数据的利器。本文通过真实场景和代码示例,讲解Pandas的核心操作,包括数据加载、清洗、转换、分析与性能优化,帮助你从数据中提取有价值的洞察,提升数据处理效率。
169 3
|
1月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
3月前
|
机器学习/深度学习 新能源 调度
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
321 1
|
3月前
|
缓存 API 网络架构
淘宝item_search_similar - 搜索相似的商品API接口,用python返回数据
淘宝联盟开放平台中,可通过“物料优选接口”(taobao.tbk.dg.optimus.material)实现“搜索相似商品”功能。该接口支持根据商品 ID 获取相似推荐商品,并返回商品信息、价格、优惠等数据,适用于商品推荐、比价等场景。本文提供基于 Python 的实现示例,包含接口调用、数据解析及结果展示。使用时需配置淘宝联盟的 appkey、appsecret 和 adzone_id,并注意接口调用频率限制和使用规范。
|
2月前
|
存储 监控 API
Python实战:跨平台电商数据聚合系统的技术实现
本文介绍如何通过标准化API调用协议,实现淘宝、京东、拼多多等电商平台的商品数据自动化采集、清洗与存储。内容涵盖技术架构设计、Python代码示例及高阶应用(如价格监控系统),提供可直接落地的技术方案,帮助开发者解决多平台数据同步难题。
|
2月前
|
存储 JSON 算法
Python集合:高效处理无序唯一数据的利器
Python集合是一种高效的数据结构,具备自动去重、快速成员检测和无序性等特点,适用于数据去重、集合运算和性能优化等场景。本文通过实例详解其用法与技巧。
129 0
|
1月前
|
数据可视化 大数据 关系型数据库
基于python大数据技术的医疗数据分析与研究
在数字化时代,医疗数据呈爆炸式增长,涵盖患者信息、检查指标、生活方式等。大数据技术助力疾病预测、资源优化与智慧医疗发展,结合Python、MySQL与B/S架构,推动医疗系统高效实现。

推荐镜像

更多
下一篇
oss云网关配置