代码是按照之前写的一个改的,那会写的很简陋,代码格式也很丑,因为我是要拿数据也不改那么多了,原来是用正则获取商品列表页数据的,现在html结构变了,懒得再写正则了,那会是真有耐心。
换成了xpath获取文档数据,稳定性更好了。
再有就是改了改截取品牌的方法,过滤了更多的无用字符。
有个可以更新的地方是没有获取是否断货。
import requests
import json
import re
import os
import codecs
import time
from lxml import etree
s = requests.Session()
s.headers = {
'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
def getgoodsbyxpath(url):
html_data = s.get(url).text
html_tree = etree.HTML(html_data)
for item_tree in html_tree.xpath('//ul[@id="result"]/li'):
yield {
#价格
'price':item_tree.xpath('div/div/p[@class="price"]/span/text()')[0],
#tag
'tag':'|'.join(item_tree.xpath('div/div/p[@class="saelsinfo"]/span/text()')),
#名称
'name':item_tree.xpath('div/a')[0].attrib.get('title'),
#评论数量
'comment':''.join(item_tree.xpath('div/div/p[@class="goodsinfo clearfix"]/a/text()')),
#国家
'country':''.join(item_tree.xpath('div/div/p[@class="goodsinfo clearfix"]/span/text()')),
#商家
'sp':''.join(item_tree.xpath('div/div/p[@class="selfflag"]/span/text()')),
#url
'url':item_tree.xpath('div/a')[0].attrib.get('href')
}
#获取分类url
def geturl(a,b,page):
return "https://www.kaola.com/category/{0}/{1}.html?pageNo={2}".format(a,b,page)
#存储所有数据
def save_csv(data,filename):
writestr=''
for i in data:
writestr += '"' + '","'.join(i) + '"' + "\n"
f=codecs.open(filename,'a','utf-8')
f.write(writestr)
f.close()
def formate_data(data, categoryName, categoryName_2, categoryName_3):
#获取商品品牌
brand = data['name']
#过滤无关字符
if brand.find('|') != -1:
brand = brand.split('|')
brand = brand[brand.__len__() - 1]
if brand.find('|') != -1:
brand = brand.split('|')
brand = brand[brand.__len__() - 1]
#去掉【】 分割
brand = re.sub('【+.*?】+|\[+.*?\]+|\(+.*?\)+|(+.*?)+|“.*?”|"|「+.*?」+|《.*?》', ' ', brand).strip().split(' ')
#如果分割空格之后只有一个数据,那么信息中没有品牌
if brand.__len__() > 1:
brand = brand[0].strip()
if brand.__len__() > 20:
brand = ''
else:
brand = ''
return (
#名称
data['name'].strip(),
#价格
data['price'],
#tag
data['tag'],
#国家
data['country'],
#商家
data['sp'],
#评论数量
data['comment'],
brand, #品牌
categoryName, #一级分类
categoryName_2, #二级分类
categoryName_3, #三级分类
#url
"https://www.kaola.com" + data['url'],
)
url = 'http://www.kaola.com/getFrontCategory.html'
r = requests.get(url)
category = r.json().get('frontCategoryList')
flag = False
#顶级分类
for i in category:
#顶级分类名称
categoryName = i['categoryName']
#二级分类
for o in i['childrenNodeList']:
#二级分类名称
categoryName_2 = o['categoryName']
categoryId_2 = o['categoryId']
#三级分类
for p in o['childrenNodeList']:
#三级分类名称
categoryName_3 = p['categoryName']
categoryId_3 = p['categoryId']
print()
print(categoryName, categoryName_2, categoryName_3)
if flag:
for l in range(1, 1000):
page_data = []
for goods_item in getgoodsbyxpath( geturl(categoryId_2, categoryId_3,l) ):
page_data.append(formate_data(goods_item, categoryName, categoryName_2, categoryName_3))
if page_data == []:
break
else:
print(l,end = ',')
save_csv(page_data, './kaola_180111_1129.csv')
# time.sleep(3)
#半路开始判定
if (categoryName == "服饰鞋包" and categoryName_2 == "女士箱包" and categoryName_3 == "手拿包"):
flag = True
2018-1-15 今天复习了一下透视表的用法,看看考拉都卖了点什么。
首先看一下各大分类的商品的数量、评论总数、平均单价(姑且认为评论数量是真实的):
可以看到考拉从服饰鞋包上挣未婚女人的钱,从母婴专区挣新晋妈妈的钱,从运动户外挣产后塑身妈妈的钱,2333333(女同胞不要打我)
但是看到了评论总数,可以发现这个榜单主要还是被可回购产品占据,主要是消耗品,买的护理品,化妆品,给宝宝的奶粉,还有保健品,觉得不错可以回购,而且亲朋回购概率比较高。消耗品还是挣钱啊
从平均售价看,鞋包,数码,运动撑起了一片天,比较意外的是运动户外竟然也加入高单价系列,说明现在崇尚健身的人越来越多了,需要买更好的装备来更好的运动
通过国家分类平均售价,我们发现单价最高的是芬兰,瑞士,意大利,我查了查芬兰和瑞士卖手表,意大利有Gucci,穷吊表示买不起买不起(删了几个特别低的国家)
通过国家分类的评论量发现,那些高单价的商品其实购买的人还是很少的,销量大头都让日本的美妆和护理产品占去了,还有澳大利亚的奶制品
4 条评论
二营长 快把我的98k拿上来!
→_→小哥哥吃鸡吗,来啊
膜拜了~
你的站可以的,东西很多啊