项目背景
随着互联网的不断兴起,电商产业也正随之扩大。而对于较为高端的商品市场,
例如手机、电脑、相机等等,这些商品都有一个标准的价格。例如华为mate60 pro的官方价格为
8999起,而其他分销商在同一电商平台的价格也大多都在这一价格左右加减。而对于较为低端的商品市
场,例如洗漱用品、学习用品之类的商品市场的定价都是较为无序的,而不同的价格会很直接的影响其销量。
本项目旨在为没有官方定价的市场提供一个较佳的价格指导,让电商商家可以快捷遍历地获得高销量商品的信息
,并为电商商家提供销量预测的功能以帮助电商商家更好地了解行业行情。
1. 项目内容/系统设计
本项目旨在为商家提供商品价格指导功能,需要为用户提供“高销量商品信息”和“商品销量预测”两大功能。所以程序可以设计为一个简单的GUI图形化界面,用户可以在这个图形界面上运行自己想要查询信息的功能。
首先用户可以输入商品的名称,然后系统就会开始查询该售卖商品的商家在京东上的价格和评论数量信息。因为在京东上只提供了评论数量,没有提供具体的销量,同时评论数量可以间接地反映商品的销量,所以可以选择评论数量作为商品是否畅销的依据。

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

对于本次项目所设置的两大模块需要对其细分。第一个模块需要获取京东商品的信息,所以需要对京东数据进行爬虫。接着我们需要对爬取到的数据进行分类处理,所以我们要对这些数据进行数学建模。而第二个模块会根据用户输入的信息进行预测,所以我们要对爬取到的数据进行机器学习以达到预测数据的效果。而最后我们再将这些功能整合到图形化界面中,为用户提供一个较为美观的使用界面。
2.技术选型与实现
按照之前的实现,首先我们要获取京东上的商品数据,所以我们首先开始爬虫代码的实现。这里我主要会采用到cv2、selenium和PIL这几个框架。
首先我们声明一个message的列表用于传递消息,然后我们开始实例化一个谷歌浏览器的对象并访问京东商城的登陆界面。
接下来我们需要获取到账号与密码的输入框以及登陆按钮进行登陆。在这里我的想法是应该有一个账号池,不需要用户登陆自己的账号进行商品信息的爬取。如果使用用户的账号去爬取商品信息那么就会对用户账号安全造成隐患,所以在这里会使用系统内部的账号进行商品信息的爬取。
注意在点击登陆后对当前网页URL地址进行检测,检测当前地址是否为京东商城首页。因为虽然账号多次登陆,但是短时间内滑块验证码验证只有在第一次登陆的时候才需要验证。所以做如下判断:如果当前界面为京东商城首页,则提示登陆成功,否则进行滑块验证。
然后我们开始对滑块验证码进行验证。首先我们需要下载滑块验证中的“背景图”与“滑块”,但是要注意到京东并没有直接将图片的src地址放在网页源代码中,取而代之的是该图片的base64的数据流。所以我们需要对这两个图片的base64数据流进行转码再将它以图片的形式存储到本地。接着我们就可以调用滑动函数对“滑块”进行滑动。

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

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

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


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

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

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

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

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

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

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