用python买手机
最近某同学一直碎碎念要买P20,我想说此时买似不太明智,但不知从何说起,恰逢放假,闲来无事,遂用python爬取淘宝、京东手机销售数据做个简单分析,本博客主要实现了以下功能
-
爬取淘宝上手机的月销售数据并存为excel表格
-
统计淘宝上不同品牌手机的月销量并以条形图形式展示
-
使用python代码打开浏览器搜索京东上手机数据并爬取
-
统计京东上不同手机品牌的评价量并以条形图形式展示
爬取淘宝数据
- URL
电脑浏览器打开淘宝,搜索手机,得到浏览器地址栏链接为https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20170905&stats_click=search_radio_all%3A1&js=1&imgfile=&q=%E6%89%8B%E6%9C%BA&suggest=0_1&_input_charset=utf-8&wq=u&suggest_query=u&source=suggest&p4ppushleft=5%2C48&s=48
经过测试,发现q=之后为关键词手机,s=之后为页数乘以48,48为每页显示的商品数量。因此写得URL函数如下:
def key_name( number ):
#获取页面的内容并返回
name = '手机'
URL_1 = "https://s.taobao.com/search?ie=utf8&initiative_id=staobaoz_20170905&stats_click=search_radio_all%3A1&js=1&imgfile=&q="
URL_2 = "&suggest=0_1&_input_charset=utf-8&wq=u&suggest_query=u&source=suggest&p4ppushleft=5%2C48&s="
URL = ( URL_1 + name + URL_2 + str(number))
#print(URL)
res = requests.get( URL )
return res.text
- 获取数据块
查看淘宝搜索手机后所在页面源代码如图
可以看到,我所需要的手机价格与月销量等数据在data:之后,header之前,因此使用正则表达式来获取数据块,获取数据块代码如下:
def find_date( text):
#根据整个页面的信息,获取商品的数据所在的HTML源码并放回
reg = r',"data":{"spus":\[({.+?)\]}},"header":'
reg = re.compile(reg)
info = re.findall(reg, text)
return info[0]
- 解析数据
获取到数据块之后,需要从数据块中解析需要的手机品牌、配置、价格、月销量等数据。需要注意的是,代码获取的价格和月销量为字符串形式,需要强制转换为int型再写入excel表格。
对于计算不同品牌手机的月销量问题,采用字符串查找方式,比如华为手机,在手机商品的标题中查找‘华为’、‘荣耀’关键词,如查找到,则该手机则认为是华为手机,月销量加在华为手机上。
代码如下:
def manipulation_data( info, sales_count, sheet ):
#解析获取的HTML源码,获取数据
Date = eval(info)
for d in Date:
T = " ".join([t['tag'] for t in d['tag_info']])
#print(d['title'] + '\t' + d['price'] + '\t' + d['importantKey'][0:len(d['importantKey'])-1] + '\t' + T)
#将数据写入对应的excel表格中
sheet.write(sales_count['line'],0,d['title'])
sheet.write(sales_count['line'],1,int(d['price']))
sheet.write(sales_count['line'],2,int(d['month_sales']))
sheet.write(sales_count['line'],3,T)
#统计不同品牌手机的月销售量
for key in sales_count.keys():
if str(d['title']).find('荣耀')>=0:
sales_count['华为']=sales_count['华为']+(int(d['month_sales']))
elif str(d['title']).find(str(key