目录
摘 要 I
Abstract II
1 绪论 4
1.1 背景及意义 4
1.1.1 背景 4
1.1.2 目标及意义 4
1.2 应用现状 4
1.3 数据模型及主要板块 5
1.3.1数据模型建立 5
1.3.2 主要板块 5
1.4 主要方法及技术路线 6
1.4.1 主要方法 6
1.4.2技术路线 6
2开发环境及技术 7
2.1硬件设备 7
2.1.1 CPU及操作系统 7
2.1.2 其他 7
2.2软件及IDE 7
2.2.1 MySQL 7
2.2.2 IDE 8
2.3主要技术 8
2.3.1 MySQL 8
2.3.2 Python 9
3 可行性分析与模块设计 10
3.1 可行性分析 10
3.1.1 技术可行性分析 10
3.1.2 数据可获得性分析 10
3.2 各模块设计 10
3.2.1 数据获取方法 10
3.2.2 数据预处理设计 10
3.2.3 数据分析思路设计 12
4 系统实现与结论 13
4.1数据采集 13
4.1.1确定待采集数据 13
4.1.2确定采集对象及采集思路 13
4.2采集准备 14
4.3开始采集数据 14
4.3.1分析网页 14
4.3.2思考 19
4.4数据清洗与分析 20
4.4.1清洗过程简述 20
4.5 可视化与分析 20
4.5.1消费时段分析 21
4.5.2月消费与会员等级分析 23
4.5.3评论内容分析 25
5 设计过程中存在的问题和解决过程 27
5.1问题1描述 27
5.2解决办法 27
5.3问题2描述 27
5.4解决办法 28
6 总结 31
致 谢 32
参考文献 33
3 可行性分析与模块设计
3.1 可行性分析
3.1.1 技术可行性分析
本人掌握python、MySQL等数据处理技术,并且熟练使用MySQL数据库、pycharm集成开发环境,并且在互联网上比较容易获取找到相关技术文档,因此技术思路清晰。
3.1.2 数据可获得性分析
本文分析数据由京东云天池提供的京东平台母婴商品销售数据集Baby Goods Info Data,数据来源真实可靠而且可以轻松获取。
3.2 各模块设计
3.2.1 数据获取方法
数据集源自Baby Goods Info Data-数据集-京东云天池,是京东平台母婴商品的销售数据,包括:
表1购买商品表(sample)sam_tianchi_mum_baby_trade_history.csv,主要记录用户在京东平台购买商品的信息,包括商品详细信息与购买行为发生时的详细记录等内容。
表2婴儿信息表 (sample)sam_tianchi_mum_baby.csv,主要记录商品适用的用户信息与产生购买行为的用户的相关登记信息。
3.2.2 数据预处理设计
详细说明数据分析中需要的字段以及对数据进行关联、清洗等预处理内容。
例如:
将收集到的信息表导入MySQL数据库中进行存储与预处理,因分析内容涉及用户维度的分析,所以首先需关联商品购买信息表和婴儿信息表,并在表1中添加婴儿生日、婴儿性别、婴儿年龄字段,接下来只需要对表1进行清洗。
(1)选择子集
根据上面的分析思路,只需要用到以下字段:用户ID,商品二级分类,商品一级分类,商品属性,购买数量,购买时间,婴儿生日,婴儿性别,婴儿年龄,将不需要的字段隐藏以便分析。
(2)列重命名
原表字段都是英文,为了方便分析,改成中文。
(3)删除重复值
无重复数据。
(4)缺失值处理
商品属性字段存在缺失值,不过这次分析用不到该字段,可直接忽略。
(5)一致化处理
购买时间和婴儿生日字段都是非标准日期格式,需改成标准型。并且婴儿性别字段值是0和1,需将值更改成男和女。
(6)数据排序
按购买时间升序排序。
(7)异常值处理
a.购买数量超过100的全改成1,这次分析主要争对个人用户,考虑到存在一次买几十个商品的土豪,所以将分界线设为100。
b.婴儿年龄-1改为0,-2不做处理,28不做处理。存在负数是因为用户在婴儿出生前购买商品,-1表示提前一年内,可以改成0,-2表示提前2年,明显不合理,所以不做处理,分析用户相关内容时过滤。婴儿年龄28估计是用户误填了自己的年龄,同-2不做处理。
c.婴儿性别为2的不做处理,分析用户相关内容时过滤。
d.婴儿生日、婴儿性别、婴儿年龄字段的错误值(#N/A)不做处理。这是因为用户没有填写婴儿信息,只需在分析用户相关内容时过滤。
3.2.3 数据分析思路设计
电商平台总体分析可以从网站整体访问及订单销售两个大的维度来进行综合分析,对订单评论所含内容进行简单的分析,初步确定所需要抓取的内容。首先,在京东商城母婴信息界面的用户评价中含有昵称、会员等级、评价星级,评价内容、母婴品牌、购买时间等等。其中通过分析会员等级与购买的关系,可以给为不同会员提供不同的产品做参考。分析评价内容可以大概可以推断出消费者对该产品的态度、以及哪些回复关注度比较高等等。分析购买时间可以了解到消费者集中的购买时间段。这些分析对商品广告的精准投放以及为消费者提供更个性化的服务提供了重要参考。本文转载自http://www.biyezuopin.vip/onews.asp?id=16405
# -*- encoding: utf-8 -*-
from enum import Flag
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import time
import numpy as np
import requests
import json
import csv
import io
# 保存评论数据
def commentSave(list_comment):
'''
list_comment: 二维list,包含了多条用户评论信息
'''
file = io.open('data/JDComment_data.csv','w',encoding="utf-8",newline = '')
writer = csv.writer(file)
writer.writerow(['用户ID','评论内容','购买时间','点赞数','回复数','得分','评价时间','手机型号'])
for i in range(len(list_comment)):
writer.writerow(list_comment[i])
file.close()
print('存入成功')
def getCommentData(format_url,proc,i,maxPage):
'''
format_url: 格式化的字符串架子,在循环中给它添上参数
proc: 商品的productID,标识唯一的商品号
i: 商品的排序方式,例如全部商品、晒图、追评、好评等
maxPage: 商品的评论最大页数
'''
sig_comment = []
global list_comment
cur_page = 0
while cur_page < maxPage:
cur_page += 1
# url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv%s&score=%s&sortType=5&page=%s&pageSize=10&isShadowSku=0&fold=1'%(proc,i,cur_page)
url = format_url.format(proc,i,cur_page) # 给字符串添上参数
try:
response = requests.get(url=url, headers=headers, verify=False)
time.sleep(np.random.rand()*2)
jsonData = response.text
startLoc = jsonData.find('{')
#print(jsonData[::-1])//字符串逆序
jsonData = jsonData[startLoc:-2]
jsonData = json.loads(jsonData)
pageLen = len(jsonData['comments'])
print("当前第%s页"%cur_page)
for j in range(0,pageLen):
userId = jsonData['comments'][j]['id']#用户ID
content = jsonData['comments'][j]['content']#评论内容
boughtTime = jsonData['comments'][j]['referenceTime']#购买时间
voteCount = jsonData['comments'][j]['usefulVoteCount']#点赞数
replyCount = jsonData['comments'][j]['replyCount']#回复数目
starStep = jsonData['comments'][j]['score']#得分
creationTime = jsonData['comments'][j]['creationTime']#评价时间
referenceName = jsonData['comments'][j]['referenceName']#手机型号
sig_comment.append(userId)#每一行数据
sig_comment.append(content)
sig_comment.append(boughtTime)
sig_comment.append(voteCount)
sig_comment.append(replyCount)
sig_comment.append(starStep)
sig_comment.append(creationTime)
sig_comment.append(referenceName)
list_comment.append(sig_comment)
print(sig_comment)
sig_comment = []
except:
time.sleep(5)
cur_page -= 1
print('网络故障或者是网页出现了问题,五秒后重新连接')
if __name__ == "__main__":
global list_comment
ua=UserAgent()
format_url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&{0}&score={1}&sortType=5&page={2}&pageSize=10&isShadowSku=0&fold=1'
# 设置访问请求头
headers = {
'Accept': '*/*',
'Host':"club.jd.com",
"User-Agent":ua.random,
'Referer':"https://item.jd.com/",
'sec-ch-ua':"\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"",
'sec-ch-ua-mobile': '?0',
'Sec-Fetch-Dest': 'script',
'Sec-Fetch-Mode':'no-cors',
'Sec-Fetch-Site':'same-site',
'cookie':'your cookies'
}
#手机四种颜色对应的产品id参数
productid = ['productId=100006795590','136061&productId=5089275','22778&productId=5475612','7021&productId=6784504']
list_comment = [[]]
sig_comment = []
for proc in productid:#遍历产品颜色
i = -1
while i < 7:#遍历排序方式
i += 1
if(i == 6):
continue
#先访问第0页获取最大页数,再进行循环遍历
url = format_url.format(proc,i,0)
print(url)
try:
response = requests.get(url=url, headers=headers, verify=False)
jsonData = response.text
startLoc = jsonData.find('{')
jsonData = jsonData[startLoc:-2]
jsonData = json.loads(jsonData)
print("最大页数%s"%jsonData['maxPage'])
getCommentData(format_url,proc,i,jsonData['maxPage'])#遍历每一页
except Exception as e:
i -= 1
print("the error is ",e)
print("wating---")
time.sleep(5)
#commentSave(list_comment)
print("爬取结束,开始存储-------")
commentSave(list_comment)