为了获得北京餐饮行业最受好评的菜系分布、人均价格和地理位置等信息,通过八爪鱼对美团网上北京餐饮行业的数据进行爬取,爬取的商家为全城最受好评的前1000家店铺,并把数据存入了MySQL数据库。
一共获得原始数据1047条,需要对原始数据进行清洗,以便下一步分析。
数据清洗
原始数据字段如下:


store字段中有的店铺名加了前缀“食品安全”,统一将该前缀去掉。
price字段中只想保留价格数据,去掉“人均¥”的前缀,新建字段average_price int(255),从price字段中提取数字信息。
address字段中包含行政区、街道信息,新建字段area varchar(255),street varchar(255),将区域和街道分开存储。
number字段中只想保留数字信息,去掉前缀,新建字段num int(255),从number字段中提取数字信息,没有数字信息的设为null。
serial字段中有包含“北京”这一地域前缀,统一将该前缀去掉。
score字段中不仅有评分信息还包含了人均价格,新建字段ss float(255),提取分数。
异常及空值处理:因为美团商家设置的格式问题,有些店铺没有提供营业时间或地址等数据,会出现空值,当字段为空时,填充null。此外,爬出的数据会有重复,去除重复商铺。
处理过程
1. distinct之后发现采集到的数据有重复,首先要把重复的数据删掉。具体操作为建立一个新表,将现有表中非重复的数据填充进新表中。
INSERT INTO first_table_name (column1, column2, ... columnN)
SELECT column1, column2, ...columnN
FROM second_table_name
[WHERE condition];
2.去掉store、serial、price、address等字段的前缀
UPDATE tablename SET store = REPLACE(store,'前缀','');
UPDATE tablename SET serial = '新内容' WHERE serial = '旧内容';
3.新建字段average_price int(255),将price字段中数字字符串转换成数字。
ALTER TABLE tablename ADD average_price INT;
UPDATE tablename SET average_price = SUBSTRING_INDEX(price,'.',1)
4.提取行政区和街道信息
UPDATE tablename SET area = LEFT(address,3)
WHERE address LIKE '%平谷区%' or address LIKE '%海淀区%';
UPDATE tablename SET street = SUBSTRING_INDEX(address,area,-1);
UPDATE tablename SET street = address WHERE area IS NULL;
5.提取评分信息
UPDATE tablename SET ss = SUBSTRING_INDEX(score,'分',1);
6.提取点评数
UPDATE tablename SET num = SUBSTRING_INDEX(SUBSTRING_INDEX(number,'条',1),'序',-1) WHERE number LIKE '%条%';
7.删掉重复的商铺中评价为空的商家
#查询表中重复的商家
SELECT username,passwd FROM tablename WHERE username in ( SELECT username FROM tablename GROUP BY username HAVING count(username)>1);
建一个新表,将处理好的非重复字段填充进去
INSERT INTO abc(store,average_price,area,street,num,ss,food1,food2,food3,time)
SELECT store,average_price,area,street,num,ss,food1,food2,food3,time
FROM haoping
WHERE store IN (select store from haoping GROUP BY store having count(store)=1);
INSERT INTO abc(store,average_price,area,street,num,ss,food1,food2,food3,time)
SELECT store,average_price,area,street,num,ss,food1,food2,food3,time
FROM haoping
WHERE store IN (select store from haoping GROUP BY store having count(store)>1)
AND num is not null ;
至此,所有数据清洗完毕,获得979条有效记录。
