1 系统简介
1.1 系统背景
随着网络的迅速发展,互联网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。
通过平时浏览信息,发现很多数据我们感兴趣,但是数量庞大,我们如果需要分析这些数据,需要我们利用程序去做一个采集,实现数据的价值。当我们购买华为手机时,比较他们的价格,图片,好评数量,好评率等,以便于我们对华为手机进行数据的可视化分析,所以要利用爬虫技术。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
1.2 功能架构
功能的架构图如下如所示:
Python爬虫程序主要使用python语言进行数据的爬取,其中利用urllib.request进行url的访问,利用lxml进行标签的选择,利用json进行数据的整理,利用pymysql进行数据的存储。通过if、len()等语句对数据空值的判断,利用数据库查询当前是否存在此商品编号判断爬取是否为重复值。
Python Django web数据可视化程序,主要利用python作为服务端,web(html和js)作为前端界面进行数据可视化,通过js和form表单的提交的方式请求python服务端,进行查询和新增。通过ajax的方式请求python服务端进行数据的删除和修改。
功能的具体流程图如下图所示:
1.3 环境配置
操作系统 | Windows7 |
Python版本 | 3.8 |
Python库 | urllib.request lxml json pymysql Django Os Sys |
2 需求设计
爬取多页数据,数据清洗包括缺失值处理、重复值处理、异常值处理、数据离散化等处理,不存在缺失,异常值也要判断。数据存入数据库(不限)中。完成华为手机数据的增删改查和详情功能(管理员能够实现增删改查,普通用户只能查看数据),查询要求能做到模糊查询;完成用户的登录、注册、退出功能。
2.1 系统实体关系图
2.2 数据定义
Goods表
字段名 | 数据类型 | 默认值 | 是否允许为空 | 字段说明 |
id | int(50) | NULL | 否 | 自增主键 |
goodsId | varchar(255) | NULL | 否 | 京东商品id |
goodsName | varchar(255) | NULL | 是 | 商品名称 |
goodsWeight | varchar(255) | NULL | 是 | 商品毛重 |
produceName | varchar(255) | NULL | 是 | 商品产地 |
cpu | varchar(255) | NULL | 是 | CPU |
originPrice | decimal(10,2) | NULL | 是 | 商品原始价格 |
jdPrice | decimal(10,2) | NULL | 是 | 商品京东价格 |
jdPlusPrice | decimal(10,2) | NULL | 是 | 商品京东PLUS会员价格 |
commentCount | int(255) | 0 | 是 | 评论总数 |
goodCount | int(255) | 0 | 是 | 好评总数 |
generalCount | int(255) | 0 | 是 | 中评总数 |
poorCount | int(255) | 0 | 是 | 差评总数 |
videoCount | int(255) | 0 | 是 | 视频评论总数 |
showCount | int(255) | 0 | 是 | 贴图评论总数 |
poorRateShow | int(255) | 0 | 是 | 差评率 |
goodRateShow | int(255) | 0 | 是 | 好评率 |
img | varchar(255) | NULL | 是 | 图片 |
Comment表
字段名 | 数据类型 | 默认值 | 是否允许为空 | 字段说明 |
id | int(50) | NULL | 否 | 自增主键 |
goodsId | varchar(255) | NULL | 是 | 商品id |
comment | text | NULL | 是 | 评论 |
creationTime | datetime | NULL | 是 | 时间 |
User表
字段名 | 数据类型 | 默认值 | 是否允许为空 | 字段说明 |
id | int(11) | NULL | 否 | 用户id |
username | varchar(255) | NULL | 否 | 用户名 |
password | varchar(255) | NULL | 否 | 密码 |
type | varchar(255) | NULL | 否 | 用户类型 |
2.3 面向对象模型
数据访问层:对数据库操作(增删改查)
数据爬取层:对数据进行爬取
数据可视化:利用Django,以MVC的方式进行数据可视化
2.4 类图
3 详细设计
系统主要模块设计1
通过请求url获取标签中数据
1. req = urllib.request.Request(url=url, headers=getHeaders())
2. data = urllib.request.urlopen(req).read().decode("utf-8", "ignore")
3. id_pat = '<strong class="J_(.*?)" '
4. return re.compile(id_pat).findall(data)
系统主要模块设计2
在浏览器端F12中network中获得到商品价格的请求url。
1. urlPrice = "https://p.3.cn/prices/get?skuId=" + goodsId
利用此url的get进行价格的获取,goodsId为商品编号
系统主要模块设计3
利用 etree的lxml进行html页面标签的筛选
goodsParams = goodsHtml.xpath('//ul[@class="parameter2 p-parameter-list"]/li')
img = goodsHtml.xpath('//img[@id="spec-img"]')
其中goodsParams是华为手机的商品详情参数,img是华为手机的大图
系统主要模块设计4
实现对爬取数据的模糊查询,将查询数据放到context字典里给index.html前端,代码如下:
1. sql = "SELECT * FROM goods WHERE goodsName like " + str("'%" + goodsName + "%'")
2. # 获取游标
3. cursor = conn.cursor()
4. cursor.execute(sql)
5. # 使用fetchall()获取全部数据
6. results = cursor.fetchall()
7. # 关闭游标
8. cursor.close()
9. # 关闭连接
10. conn.close()
11. context = {}
12. context['phones'] = list(results)
13. return render(request, 'index.html', context)
然后利用web程序进行数据的展示,代码如下:
1. <table border="1" cellspacing="0" cellpadding="0">
2. <tr>
3. <td>自增主键</td>
4. <td>京东商品id</td>
5. <td width="30px">商品名称</td>
6. <td>图片</td>
7. <td>商品毛重</td>
8. <td>商品产地</td>
9. <td>CPU</td>
10. <td>商品原始价格</td>
11. <td>商品京东价格</td>
12. <td>商品京东PLUS会员价格</td>
13. <td>评论总数</td>
14. <td>好评总数</td>
15. <td>中评总数</td>
16. <td>差评总数</td>
17. <td>视频评论总数</td>
18. <td>贴图评论总数</td>
19. <td>差评率</td>
20. <td>好评率</td>
21. </tr>
22. {% for i in phones %}
23. <tr>
24. <td>{{ i.0 }}</td>
25. <td><a href="/comment/?goodsId={{ i.1 }}">{{ i.1 }}</a></td>
26. <td width="30px">{{ i.2 }}</td>
27. <td><img style="width: 50px;height: 50px"src="{{ i.17 }}"></td>
28. <td>{{ i.3 }}</td>
29. <td>{{ i.4 }}</td>
30. <td>{{ i.5 }}</td>
31. <td>{{ i.6 }}</td>
32. <td>{{ i.7 }}</td>
33. <td>{{ i.8 }}</td>
34. <td>{{ i.9 }}</td>
35. <td>{{ i.10 }}</td>
36. <td>{{ i.11 }}</td>
37. <td>{{ i.12 }}</td>
38. <td>{{ i.13 }}</td>
39. <td>{{ i.14 }}</td>
40. <td>{{ i.15 }}</td>
41. <td>{{ i.16 }}</td>
42.
43. </tr>
44. {% endfor %}
45. </table>
4 系统测试
4.1 测试目的
软件测试是整个项目开发过程中不可缺少的一部分。软件测试是指在系统正式投入使用前对其进行测试,看其是否能满足系统开发的要求。软件测试是保证软件质量的关键环节。软件测试需要建立测试用例。一个很好的测试用例是尽可能多地发现发明系统中的故障以及到目前为止还没有发现的故障。
4.2 测试方法
1.灰盒测试
白盒测试和黑盒测试并不总是分开的。白盒测试一般采用黑盒测试,黑盒测试一般采用白盒测试。灰盒试验是介于白盒试验和黑盒试验之间的试验。
2. 静态测试
一种不通过执行程序而进行测试的技术。它的关键功能是检查软件的表示和描述是否一致,没有冲突或者没有歧义。
3. 动态测试
包含了程序在受控的环境下使用特定的期望结果进行正式的运行。它显示了一个系统在检查状态下是正确还是不正确。
4.3 测试内容
本次测试主要采用白盒测试,进行了以下测试:
1、重复商品的爬取,将爬过一次的商品再爬一次
2、新增商品,输入商品编号1,商品名称1,商品价格1
3、模糊查询商品,输入mate30
4、删除商品,点击删除按钮
5、修改商品价格,输入商品编号和修改后的价格
4.4 测试结果
1、重复商品不在爬取
2、新增商品入库成功
3、新增1,1,1数据成功
4、查询到商品命中包含mate30的5个产品
5、修改价格成功