如何用 Python 选出好用又便宜的手机?

2023-11-22 00:30

本文主要是介绍如何用 Python 选出好用又便宜的手机?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=gif

640?wx_fmt=jpeg

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

640?wx_fmt=png

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

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


640?wx_fmt=png

分析思路


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

640?wx_fmt=png


640?wx_fmt=png

爬取数据


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

640?wx_fmt=png

640?wx_fmt=png

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

 

# 获取手机单品的价格
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'jQueryd+((.*))', 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。


640?wx_fmt=png

过滤数据


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

640?wx_fmt=jpeg

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

  • 是否双卡双待;

  • 机身材质;

  • 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款手机:

640?wx_fmt=png

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

640?wx_fmt=png

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

作者:强哥,资深Python程序员,先后供职于Morgan Stanley和ebay,擅长爬虫、Web开发、数据分析。

本文系作者投稿,不代表CSDN立场。

微信改版了,

想快速看到CSDN的热乎文章,

赶快把CSDN公众号设为星标吧,

打开公众号,点击“设为星标”就可以啦!

640?wx_fmt=png


征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

推荐阅读:

640?wx_fmt=gif

640?wx_fmt=gif

这篇关于如何用 Python 选出好用又便宜的手机?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/406180

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

详解python pycharm与cmd中制表符不一样

《详解pythonpycharm与cmd中制表符不一样》本文主要介绍了pythonpycharm与cmd中制表符不一样,这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽... 这个问题通常是因为PyCharm和命令行(CMD)使用的制表符(tab)的宽度不同导致的。在PyChar