该买哪家二手手机呢?程序员爬取京东告诉你!

作者 | AJ Gordon

责编 | 李雪敬

出品 | CSDN(ID:CSDNnews)

当你手头有一件闲置的物品时,最好的办法不是放在家里积灰,而是拿到二手网站上进行拍卖,例如淘宝的闲鱼,京东的拍拍等等。有这方面经验的小伙伴都知道,这两个平台都会自动给出一个最佳的售价。假设我现在有一堆旧手机想二手转让,但又不知道定价多少合适时,最好的办法是上网查查相同配置的二手手机价格后,再进行定价。

京东平台上有专门的二手手机分类,因此选择它作为定价参考。为了方便进行分析,最省时的方法就是直接把数据都抓取到本地,再进行分析。下面一起看看如何用程序的方式获取我们想要的:

数据获取

由于京东的防爬措施,直接用requests去读取链接是不行的,我的抓取方式是这样的:

首先,获取详情页链接前均是采用selenium进行无界面访问。先获取各手机品牌的ID,再用手机品牌的ID构建二级链接,获取各手机品牌的总页码数Page。再用ID+Page构建三级链接,获取二手手机的详情页链接。最后用requests读取详情页链接,获取具体数据。

# 获取手机型号id
def get_mobile_model_id():# 浏览器设置option = webdriver.ChromeOptions()# 防拦截option.add_experimental_option('excludeSwitches', ['enable-automation'])# 不加载图片option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 无界面option.add_argument('--headless')option.add_argument('--disable-gpu')#browser = webdriver.Chrome(options=option)browser.get('https://list.jd.com/list.html?cat=13765%2C13767')#获取浏览器当前打开页面的页面源码数据page_text = browser.page_sourcebrowser.quit()# 获取手机型号IDsoup = BeautifulSoup(page_text,'lxml')model_type = soup.find_all('ul',{'class':'J_valueList clearfix'})[1].find_all('li')for i in model_type:# 手机型号名称# type = i.find('a').get_text()# 手机型号idtype_id = i.find('a')['href'].split('ev=')[-1].split('&cid2=')[0]redis_db.sadd('jd_mobile_model_id', type_id)

截止至2020年6月22日,总共抓取了2.2万件二手手机商品,27.7万条评论数据。总体上分为三个部分:商品基本信息,店铺评论信息和商品评论信息。

商品基本信息:商品ID,店铺ID,新旧程度,品牌,机型,颜色,内存和单价等等。

店铺评论信息:店铺ID,好评率,总评论数,默认好评数和好评数等等。

商品评论信息:商品ID,用户ID,打分,评论内容,评论时间和下单时间。


数据描述

接下来,对清洗后的数据进行描述性统计。

图1 日期与销售量的关系

根据历史买家下单时间,从图1可以看出每年的峰值都是出现在618,双11,双12这些电商节日,并且每年销售量同比增长了300%。

图2 时间与销售量的关系

根据历史买家下单时间,从图2可以看出每天的销量趋势,早上4:00 – 12:00一路飙升,下午12:00 – 16:00保持平缓,傍晚16:00 – 19:00有所下降,晚上19:00 – 22:00回到下午水平,22:00 – 4:00逐渐下降到最低点。

图3 颜色与销量的关系

根据图3可知,在售的二手手机颜色主要是金色,黑色和银色,而销售出去的颜色主要是金色,黑色和玫瑰金。虽然在售的红色手机也挺多的,但是销量却很低。

图4 价格与销量的关系

根据图4可知,在售的二手手机价格主要是2000元以下,5000元以上的二手手机也是有不少的。而销量最高的1000元以下的二手手机,价格越高,销量越低。

图5 品牌与销量的关系

从图5可以看出来,京东上的手机品牌有19个。苹果的产品数量和销售量远远超过了其它品牌的总和。国产品牌中主要卖的是华为、小米、OPPO和Vivo。其它牌子的机型产品数量少,销售量就也很少。

图6 各品牌机型销量TOP3

目前二手手机市场上的品牌主要有苹果,OPPO,Vivo,小米,华为和三星,所以可以了解一下每个品牌销量最好的前三名机型分别是什么。苹果主要是iphone 6s、iphone x和iphone 7。华为主要是mate20、p20和p20pro。

图7 差评词云图

图7是将评论信息中打分分数1和2的归为差评,然后利用jieba分词将文本内容截成若干个词,再用词云图展示。从这个差评词云图可以看出大多数用户对二手手机的不满主要是客服、屏幕和电池这三个原因。首先商家对买家的态度就是“买前是上帝,买后置之不理”,购买前会很热情地接待,但售后又变成另一副嘴脸。其次,原装屏幕和组装屏幕的利润差的是一副二手手机的价格,所以很多二手手机用的都是组装屏幕,效果自然没有新机好。最后,手机用久了就会出现电池老化的问题,耗电量特别快,这个也是部分人更换新手机的原因。


数据建模

经过前面的数据获取和数据描述之后,对二手手机已经大致了解。现在可以开始对这些二手手机数据进行建模,因为现在是需要进行定价,属于回归模型。

1) 导入库和数据

首先,导入需要用到的库和数据。

import pandas as pd
import numpy as np
from scipy.special import boxcox1p,inv_boxcox1p
from sklearn.preprocessing import MinMaxScaler,StandardScaler,RobustScaler
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.metrics import make_scorer
import seaborn as sns
import matplotlib.pyplot as plt
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False #负号显示def load_data():data = pd.read_csv('result.csv',dtype={'skuId':str})data = data[['skuId','old_new_degree', 'brand', 'model', 'color','version', 'Double_card_machine_type', 'Front_card_machine_type','Rear_camera_pixel','Battery_capacity', 'Running_memory','screen_size', 'price']].drop_duplicates('skuId')return data

2) 清洗数据

对部分字段进行缺失值填充,以及将类似的分类合并为同一个。

def clean_data(data):# 缺失值填充data['model'].fillna('Missing', inplace=True)data['color'].fillna('Missing', inplace=True)# 修改字段data['old_new_degree'] = data.apply(lambda x: str(x['old_new_degree']),axis=1)data['version'] = data.apply(lambda x:'0' if x['version']=='Missing' else str(x['version']),axis=1)data['Front_card_machine_type'] = data.apply(lambda x:'0' if x['Front_card_machine_type']=='Missing' else str(x['Front_card_machine_type'][:4].replace('万','')),axis=1)data['Rear_camera_pixel'] = data.apply(lambda x:'0' if x['Rear_camera_pixel']=='Missing' else str(x['Rear_camera_pixel'][:4].replace('万','')),axis=1)data['Battery_capacity'] = data.apply(lambda x:'0' if x['Battery_capacity']=='Missing' else str(x['Battery_capacity']),axis=1)data['Running_memory'] = data.apply(lambda x:'0' if x['Running_memory']=='Missing' else str(x['Running_memory'].replace('GB','')),axis=1)data['screen_size'] = data.apply(lambda x:'0' if x['screen_size']=='Missing' else str(x['screen_size'].replace('英寸','')),axis=1)return data

3) 离散变量-独热编码

离散变量分为有序和无序两种变量,例如手机的内存越高越好,属于有序离散变量。颜色属于无序离散变量。这里我都是用pandas自带的get_dummy()进行独热编码,sklearn也有一个独热编码OnehotEncoder(),两者的区别在于get_dummy()无法适用于新类别,并且每次都要重新执行,只适用于数据量小的模型。

def get_dummy(df):cols = ['version', 'Front_card_machine_type', 'Rear_camera_pixel', 'Battery_capacity', 'Running_memory','screen_size','old_new_degree', 'brand', 'model', 'color','Double_card_machine_type']dummy_cols = df[cols].copy()df = df.drop(cols,axis=1)dummy_cols = pd.get_dummies(dummy_cols,prefix=cols)df = pd.concat([df,dummy_cols],axis=1)return df

4) 拆分数据

将原始数据集拆分成两部分:训练集和测试集(后100条),由于回归模型要求标签满足正态分布,所以对训练集的标签进行boxcox1p正态变换,使其满足正态分布。

def cut_data(df):# 拆分数据all_rows = df.shape[0]## 训练集X_train = df[:all_rows-100]y_train = X_train['price'].copy()y_train = boxcox1p(y_train, 0)X_train = X_train.drop(['skuId','price'],axis=1)## 测试集X_test = df[all_rows-100:]y_test = X_test[['skuId','price']].copy()X_test = X_test.drop(['skuId','price'],axis=1)return X_train,y_train,X_test,y_test

5) 数据降维

由于独热编码后的特征会增加很多,所以需要进行降维。

def value_pca(X_train,X_test):pca = PCA(n_components=0.9)X_train = pca.fit_transform(X_train)X_test = pca.transform(X_test)#variance = pd.DataFrame(pca.explained_variance_ratio_)#np.cumsum(pca.explained_variance_ratio_)return X_train,X_test

6) 数据建模

将特征都处理好之后,就可以套用模型了,这里我用随机森林回归模型。并且用GridSearchCV()网格搜索,自定义RMSE作为其判断标准。最后用最佳参数进行预测,并用R2比较真实值和预测值的效果,R2越接近1效果越好,这次的模型R2值是0.912。

def model(X_train,y_train,X_test,y_test):# 设置自定义评分函数def my_custom_loss_func(y_true, y_pred):return np.sqrt(mean_squared_error(y_true, y_pred))rmse = make_scorer(my_custom_loss_func, greater_is_better=False) # 以_error结尾的函数,返回一个最小值,越小越好;如果使用make_scorer来创建scorer时,将greater_is_better设为False# 设置自定义参数rfr_param_test = {'n_estimators': [10,20,30,40,50,60],'max_depth': [5,6,7,8,9,10]}# 进行网格搜索grid_search = GridSearchCV(estimator=RandomForestRegressor(), param_grid=rfr_param_test, cv=5, scoring=rmse)grid_search.fit(X_train,y_train)print(grid_search.best_params_) # 预测结果rft_model = grid_search.best_estimator_rft_model.fit(X_train, y_train)y_pred = rft_model.predict(X_test)y_pred = inv_boxcox1p(y_pred, 0)# 输出R2值R2 = r2_score(y_test['price'], y_pred)print('R2:{}'.format(R2))# 输出结果result = pd.DataFrame({'skuID':y_test['skuID'],'price_old':y_test['price'],'price_pred':y_pred})result.to_csv('Regress_result.csv',index=False,encoding='utf_8_sig')return result

总结


通过上述分析,我发现目前二手手机市场上,最热卖的是iphone,虽然国产机近几年的知名度越来越高,但是店家或者消费者都更倾向于iphone。此外,二手手机的价格越低,销量就会越高。但便宜所带来的弊端就是店家的售后差,屏幕效果不佳,电池损耗快等等。当你有二手手机转让的需求时,用数据建模的方法,也能为你提供一个定价的标准。

更多阅读推荐

  • 下一代 IDE:Eclipse Che 究竟有什么奥秘?

  • 窃隐私、放高利贷,输入法的骚操作真不少!

  • 进入编译器后,一个函数经历了什么?

  • 程序员离职后收到原公司 2400 元,被告违反竞业协议赔 18 万

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务3000万制造企业 阿里云数字工厂诚邀合伙人

阿里云工业互联网平台(数字工厂)通过整合阿里云资源可提供从产品研发、生产制造、销售、物流仓储、能源管理等链路中所需要的全部应用。为大型制造企业提供工业大数据分析以实现更高层次的价值挖掘,赋能中小制造企业用云化工具以较低成本实现…

大厂面试录取通过率不到3%,我真是太太太难了......

对今年应届毕业生来说,这个毕业季太难了,今年应届生总人数 874 万多,再创历史新高,各大招聘单位不仅缩减了招聘岗位,还取消了线下春招。最近在后台看到不少吐槽,很多同学反映自己面试一面就挂,有…

springbot微服务打包docker镜像

1.新建springboot项目 2.打包项目 3.编写Dockerfile 4.构架镜像 5.发布运行 6.上传至私服 7.拉取私服镜像运行 1.新建springboot项目 通过idea创建一个项目,新建一个HelloController 并新增一个hello方法便与测试 package com.gblfy.hello.controller;import org.…

NUAA-云计算-考试

19级期末 问题 答案: md格式 自己想办法看 # 随堂测验#### 一、请简述GFS 的系统架构和特点。**1. 系统架构**- GFS将整个系统节点分为三类角色:- Client(客户端):Client是GFS提供给应用程序的访问接口,以库文件的…

启迪公交:DRDS助力城市公交系统智能化

公司介绍 启迪公交(北京)科技股份有限公司以下简称“启迪公交”,成立于2018年6月26日,是国内领先的智慧公交系统方案提供商和服务运营商。通过承接公交信息化和智慧化项目建设,应用最先进的互联网商业模式&#xff0c…

长沙营智:PolarDB助力长沙营智提速资讯搜索业务

公司介绍 长沙营智信息技术有限公司旗下易撰网,2017年10月份上线以来,基于数据挖掘技术为自媒体内容创客提供写作灵感、创作工具的写作连接,现已成为中国用户最多的内容创客的工具平台。 易撰是专业的新媒体大数据服务商,基于新…

云起云涌:PaaS 体系架构与运维系统上云实践

作者 | 刘鹏宇 中国农业银行研发中心责编 | 李雪敬出品 | CSDN云计算(ID:CSDNcloud)今年以来,远程办公、远程会议走进了大多数人的日常工作中,各类云产品相继被人们所熟悉,例如石墨云”OFFice”办公软件、…

阿里云李飞飞:传统数据库步履蹒跚,未来的机会在哪里?

在采访中李飞飞表示,随着计算和数据上云的趋势快速发展,传统数据库步履蹒跚,云原生数据库和数据仓库利用云原生技术最大化的发挥池化的计算和存储资源弹性将是未来。同时随着AI技术的不断深入使用,数据库也将会越来越智能化&#…

从零开始入门 K8s | K8s 安全之访问控制

作者 | 匡大虎 阿里巴巴技术专家 本文整理自《CNCF x Alibaba 云原生技术公开课》第 27 讲,点击直达课程页面。 关注“阿里巴巴云原生”公众号,回复关键词“入门”,即可下载从零入门 K8s 系列文章 PPT。 导读:访问控制是云原…

把人脑智能化后,能再创造出更强的人工智能吗?

近日,埃隆马斯克投资1 亿多美元的脑机接口初创公司Neuralink在现场发布会展示了新一代的脑机接口设备。脑机接口是什么?可能这个名词在我们日常生活中是不常见的。脑机接口是最前沿的研究领域,建立人(或动物)与外部的设…

阿里巴巴副总裁肖力:云原生安全下看企业新边界——身份管理

作者 | kirazhou 导读:在 10000 多公里之外的旧金山,网络安全盛会 RSAC2020 已经落下了帷幕。而身处杭州的肖力,正在谈起今年大会的主题——Human Element。2020 年,从“人”出发,这颗石子将在国内的安全市场池子里激起…

轻松搭建基于Serverless的Go应用(Gin、Beego 举例)

首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源&#xff…

超详细 | 21张图带你领略集合的线程不安全

来源 | 悟空聊架构本篇主要内容如下:本篇主要内容本篇所有示例代码已更新到 我的Github本篇文章已收纳到我的Java在线文档线程不安全之ArrayList集合框架有Map和Collection两大类,Collection下面有List、Set、Queue。List 下面有 ArrayList、Vector、Lin…

快速迁移Next.js应用到函数计算

首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源&#xff…

《我想进大厂》之 MYSQL 夺命连环13问

来源 | 科技缪缪想进大厂,mysql不会那可不行,来接受mysql面试挑战吧,看看你能坚持到哪里?能说下 myisam 和 innodb 的区别吗?myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等&#xff0…

心动网络:PolarDB助力心动网络打造爆款手游

公司介绍 心动网络,国内极具知名度的游戏公司,中国互联网百强企业。旗下业务涉及游戏研发运营、动画制作、偶像娱乐等多个产业。公司创立于2002年,前身为中国最早的互联网分享网站之一的VeryCD。2009年起,公司开始打造心动网络的…

Vue文件在VsCode工具中红色波浪线的问题解决方法

在setting.json种添加 "vetur.validation.template": false, //vue文件取消波浪线

数云:PolarDB助力数云轻松应对双十一

公司介绍 我们杭州数云信息技术有限公司成立于2011年,伴随着电子商务、大数据应用和零售企业互联网化的趋势快速发展,目前已成为国内领先的数据化营销软件产品和服务提供商。我们致力于为消费品牌和零售品牌商提供整合软件产品、数据模型和专业服务的一…

点触科技:构建实时计算和数据仓库解决方案

公司介绍 厦门点触科技股份有限公司,新三板挂牌企业(股票代码:870702),成立于2013年,是一家以历史养成类游戏研发与发行为主,专业从事手机游戏的策划、研发制作、商业化运营的创新型发展公司。…

定位云原生数据中台,「智领云」获数千万元A轮融资

来源 | 智领云科技据消息,「智领云」获金沙江联合资本领投,线性资本跟投的数千万元A轮融资。本轮融资将主要用于市场拓展和产品线完善。此前,智领云在2019年5月获得线性资本千万级人民币Pre-A轮融资。智领云成立于2016年,是一家数…