Skip to content

爬取京东上的商品数据进行数据处理,再进行建模分析商品最佳的销售价格

Notifications You must be signed in to change notification settings

1404040538/JD-Reptile

Repository files navigation

项目开始需要修改“滑块验证码实战.py”下的账号密码,请修改为你自己的京东账号密码

项目背景

随着互联网的不断兴起,电商产也正随之扩大。而对于较为高端的商品市场, 例如手机、电脑、相机等等,这些商品都有一个标准的价格。例如华为mate60 pro的官方价格为 8999起,而其他分销商在同一电商平台的价格也大多都在这一价格左右加减。而对于较为低端的商品市 场,例如洗漱用品、学习用品之类的商品市场的定价都是较为无序的,而不同的价格会很直接的影响其销量。 本项目指在为没有官方定价的市场提供一个较佳的价格指导,让电商商家可以快捷遍历的获得高销量商品的信息 ,并为电商商家提供销量预测的功能以帮助电商商家更好的 了解行业行情。

1.项目内容/系统设计 本项目指在为商家提供商品价格指导功能,需要为用户提供“高销量商品信息”和“商品商量预测”两大功能。所以程序可以设计为一个简单的GUI图形化界面,用户可以在这个图形界面上运行自己想要查询信息的功能。 首先用户可以输入商品的名称,然后系统就会开始查询该售卖商品的商家在京东上的价格和评论数量信息。因为在京东上只提供了评论数量,没有提供具体的销量,同时评论数量可以间接的反应商品的销量,所以可以选择评论数量作为商品是否畅销的依据。

image

然后用户可以输入该商品将会在京东设置的商品名称和价格,然后系统会根据上一步得出的排序信息以及被查询到商品的得分来为用户分析预测未来的销量(商品评论数量)。

image

对于本次项目所设置的两大模块需要对其细分。第一个模块需要获取京东商品的信息,所以需要对京东数据进行爬虫。接着我们需要对爬取到的数据进行分类处理,所以我们要对这些数据进行数学建模。而第二个模块会根据用户输入的信息进行预测,所以我们要对爬取到的数据进行机器学习以达到预测数据的效果。而最后我们再将这些功能整合到图形化界面中,为用户提供一个较为美观的使用界面。

2.技术选型与实现 按照之前的实现,首先我们要获取京东上的商品数据,所以我们首先开始爬虫代码的实现。这里我主要会采用到cv2、selenium和PIL这几个框架。 首先我们声明一个message的列表用于传递消息,然后我们开始实例化一个谷歌浏览器的对象并访问京东商城的登陆界面。

image

接下来我们需要获取到账号与密码的输入框以及登陆按钮进行登陆。在这里我的想法是应该有一个账号池,不需要用户登陆自己的账号进行商品信息的爬取。如果使用用户的账号去爬去商品信息那么就会对用户账号安全造成隐患,所以在这里会使用系统内部的账号进行商品信息的爬取。 注意在点击登陆后对当前网页URL地址进行检测,检测当前地址是否为京东商城首页。因为虽然账号多次登陆,但是短时间内滑块验证码验证只有在第一次登陆的时候才需要验证。所以做如下判断:如果当前界面为京东商城首页,则提示登陆成功,否则进行滑块验证。 然后我们开始对滑块验证码进行验证。首先我们需要下载滑块验证中的“背景图”与“滑块”,但是要注意到京东并没有直接将图片的src地址放在网页源代码中,取而代之的是该图片的base64的数据流。所以我们需要对这两个图片的base64数据流进行转码再将它以图片的形式存储到本地。接着我们就可以调用滑动函数对“滑块”进行滑动。

image

但是在进行滑动之前我们需要知道我们向右滑动的距离是多少,所以这里我们要调用cv2对背景图和滑块图进行灰色处理,并将它们进行比对获取他们之间的距离。

image

当我们获取到了滑动距离之后我们就可以开始着手准备让滑块滑动到我们想要的位置。 但是在这之前我们需要注意以下几点: 我们电脑显示器的显示比例是不一样的,以本环境电脑显示器为例,其显示缩放比为125%。因此我们显示器显示的图片分辨率大小与图片原本的分辨率大小不一致,所以在这里我们需要对滑动距离进行缩放。

image

2、我们下载到的图片和和在网页中显示的图片不一致,因为这个图片有透明的部分在网页中并没有显示出来,所以在滑动的时候我们需要向右多滑动一段距离。

image image

3、当我们对以上情况进行处理之后最后得到了一个正确的滑动距离,但是我们仍然不能单纯地直接滑动滑块。因为京东会检测鼠标滑动的轨迹,所以我们需要建立一个随机数组让鼠标滑动的时候向x轴和y轴的正负方向随机进行滑动。同时在滑动的时候需要短暂的睡眠达到停顿的效果,并且要将滑动的轨迹分成多段,每段以不同的速度滑动。

image

通过以上步骤我们就可以正确的完成滑块验证,但是cv2的识别率并非100%,只有75%左右的成功率。所以我们要加一个检测,检测当前页面是否进入到了京东商城首页,如果没有进入那么就刷新界面重新登陆。直接刷新界面登陆是为了防止一次登陆多次滑块验证失败而对账号产生不好的影响。

image

进入京东商城首页后我们就可以根据用户输入的商品名称访问到商品的详细页面。并让页面隐式的等待10秒让网页加载完全。

image

接着我们就可以对数据进行爬取。在这里我们需要注意到京东商品的展示是采用懒加载进行加载的,我们要不断下滑来访问更多的数据。

image

但是在我们下滑的时候会出现数据加载失败的情况,我们可能要多次点击重新加载的按钮后续的网页才有可能被加载出来。所以这里我们可以加入一个检测,判断“重新加载”这个提示是否在网页源代码中出现,如果出现,那么就不断点击,直到这个提示在网页源代码中消失。

image

然后我们需要将爬取到的网页内容写入到文件中,但是这里我们需要对数据进行额外的处理。数据中将会出现类似于“¥”、“万”、“千”这种数据,我们要对这种数据进行数据的转码,比如替换成空或者转为阿拉伯数字。

image

最后当我们爬取完本页数据,那么我们就要对页面进行跳转。但是在这里需要注意到京东页面底部的页面跳转是js的假代码,所以我决定采用修改URL达到跳转的效果。 但是这里需要注意到如果我们爬取过多的信息那么就会出现检测的网页,所以我们需要判断当前网页是否为京东的检测界面。因为这个检测界面一般只会出现到当我们爬取完1000多条数据后才会出现,所以如果出现检测界面我们可以选择结束爬取。

image image

最后我们可以定义一个手动结束查询的方法。

image

然后我们进行下一部分功能的实现。这一步我们完成“分类数据处理”模块的实现。 在本模块我的主要思想是既然我们已经拿到了商品信息的数据,那么我们就需要对这些商品数据进行打分,获取到排名前十的商品数据展示给用户。而这里我将采用层次分析法的思想来实现这一模块功能。 首先我们要知道我们需要用到什么数据。在这里我们要对商品进行打分,也就是说我们要根据商品的信息即评论数量以及价格进行打分。而从商家的视角出发,其商品的评论数量与商品价格肯定是也高越好。较高的商品价格可以为商家提供高额的利润,而较多的评论数量可以反应商家拥有大量的订单。所以这两个凭据都是正向的,接下来就是如何选定二者的权重。经过了解和讨论,我将商品价格和评论数量之间的权重比定义为四比六,而接下来我们只需要关系该权重是否能通过一致性检验。

image

通过检验之后我们要对数据进行归一化处理,但是在进行归一化处理之前我们还需要对数据进行处理。因为我们从京东上获取到的商品数据可能会存在空值,所以我们要先剔除这种数据,并将正确完好的数据加入到列表中为后面的操作提供数据。

image

然后我们需要将得到的结果进行归一化处理,然后再将归一化之后的商品价格和评论数量与其各自的权重进行求积再进行求和。

image

然后我们就可以将这些数据保存写入一个文件里面。

image

然后根据这里面的数据我们要对其得到的分数进行排序,选定排名为前十个。

image

最后我们将经过排序的数据存入到一个新的文件之中

image

这样我们就完成了层次分析法分类数据的模块,最后我们开始实现评论数量预测模块的编写。 而在这里我的思想是通过随机森林决策树来实现这一步骤,我想实现的是系统通过用户输入的信息即名字和价格来与市面上类似的商品进行比对分类以达到价格预测的效果。而这一功能可以参考到一些二手回收平台对二手手机成色进行的估价功能,就是机主可以选择输入自己手机的成色如屏幕是否有划痕、电池是否鼓包等等这些信息来获取到二手机的估价。也就是二手平台会根据用户输入参数的特征来得到该手机的估价。 虽然说我们看似参数有点少,但是当我们进行特征提取的时候我们会发现当我们对商品名字进行特征提取的时候往往会提取出大量的特征。因为在电商平台商家给商品起名字一般会把该商品的一部分信息也写到商品名字中,因为这样可以覆盖更多的关键字,当用户搜索的时候就会有更大的概率搜索到自己的商品。 故而接下来我们开始实现这一功能。首先我们需要获取到之前我们已经排序好了的信息数据,一开始我们需要对商品名字进行处理。因为商品名字是中文,所以我们要使用jieba库对商品名字进行切割。

image

此时我们已经获得了切割好了的商品名字信息还有商品价格,所以接下来我们需要对商品名字信息和商品价格进行特征提取。因为我们要获得该商品的整体特征信息,所以我们还需要用hstack来合并这两个特征信息的矩阵。

image

然后我们开始建立随机森林。首先我们要对数据进行训练集和测试集的划分,然后在加入交叉网格验证设置估计次数集与深度集,同时设置为每三个训练集一个测试集。

image

最后我们就可以定义一个传入需要预测数据的信息函数。同样在我们获取测试数据后要先把数据转换为合适的数据类型,然后还是要进行特征的提取,这一步与上述代码操作是一致的。然后我们需要将得到的特征数据传递到之前训练好了的模型里训练,最后将得到的结果输出出来。

image

最后这三个主要的模块就已经实现了,所以我们要把这三个模块集成到一个GUI图形化界面中。而在这里我们虽然写的代码比较多但是实现的功能无非就三个,所以我们只需要实现一个简单的图形化界面就可以满足我们的需求。 所以接下来我们需要对着三个功能依次实现在GUI界面中的定义。 首先对于数据爬取,我们需要定义一个输入框,一个“查询”按钮,一个“结束查询”按钮以及一个“退出系统按钮”

image

这里查询按钮调用consult函数,此函数可以获取到输入框的内容。然后开启一个新的线程去执行函数startup(),startup函数会调用之前实现的爬虫代码,然后将获取到输入框的内容传递到爬虫中的输入输入功能。这样就可以实现在GUI界面调用py文件。

image

注意到这里必须要开启一个线程去运行函数,因为当我们点击咨询的时候这个咨询的线程被会一直占用,这个时候整个图形化界面就会被卡死点击不了其他按钮。 然后我们实现分类数据在GUI界面的实现,这一步就比较简单,我们只需要定义一个文本输入框和一个“开始分类数据”的按钮。

image

这里当我点击开始分类数据按钮时会调用classify函数,而这个函数会执行之前实现的层次分析法完成的对全部商品信息进行评分,并且会将结果插入到这个文本框中。

image

最后就是对商品评论数量预测在图形化界面的实现,而对于这个功能我们需要两个输入框用于输入商品价格和商品名字,还有一个“开始预测”的按钮。

image

而当我点击开始预测按钮后,forest_start函数就会新开一个线程去调用back_forest函数,在将从输入框获取到的信息传递给之前实现的随机森林之中,最后再将结果返回到层次分析法的输入框中。

image

3.实验结果与分析

首先展示得到最终的结果GUI界面,然后我们输入想要搜索的商品名称点击搜索。

image

然后系统就会实例化一个浏览器实例并按照数据爬取时定义的逻辑开始运行。一开始就是访问京东的登陆界面输入账号密码后点击登陆。

image

然后进入滑块验证的验证,这里系统会下载背景图和滑块图片并得出滑动轨迹后进行滑动。

image

登陆成功后会检测是否来到京东商城首页,然后输入商品名称点击搜索。进入商品信息页面等待信息加载完成后不断下滑网页读取网页信息。

image

如果在爬取数据的时候遇到(检测到)加载失败提示就会不断点击这个提示,因为在通常情况下需要点击多次才能加载到后面的信息。

image

当达到预定的读取页数后就会提示读取完成。而这时候我们来到后台就可以看到读取到信息,当然该文本不提供给用户观看。

image

然后我们点击分类数据按钮就可以查看到排名前十商品的得分以及其他信息。

image

最后我们输入需要预测的商品信息点击开始预测,然后我们就可以在文本框中查看到我们预计的评论数量。

image

About

爬取京东上的商品数据进行数据处理,再进行建模分析商品最佳的销售价格

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages