赞
踩
selnium安装
# 导入模块 from selenium import webdriver import time import csv import re # 搜索商品,获取商品页码 def search_product(key_word): key_word += "手机" # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name('btn-search').click() # 最大化窗口:为了方便我们扫码登录淘宝 browser.maximize_window() # 等待15秒,给足时间我们扫码登录 time.sleep(15) # 定位这个商品“页码”,获取到“共100页“这个文本 page_info = browser.find_element_by_xpath('//div[@class="total"]').text # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。 page = re.findall("(\d+)", page_info)[0] print(key_word + "有" + str(page) + "页信息,请问需要爬取多少页?") page = int(input("请输入需要爬取的页面: ")) return page # 获取商品信息数据 def get_data(): # 通过页面分析发现:所有的信息都在items节点下 items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq "]') for item in items: # 参数信息 pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text # 价格 pro_price = item.find_element_by_xpath('.//strong').text # 付款人数 buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text[:-3] # 保存到csv文件 with open('{}手机.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f: csv_writer = csv.writer(f, delimiter=',') csv_writer.writerow([pro_desc, pro_price, buy_num]) def main(): # 浏览器要获取的链接 browser.get('https://www.taobao.com/') # 要获取的关键字 page = search_product(key_word) print("开始爬取:") page_num = 0 while page != page_num: print("*" * 60) print("正在爬取第{}页".format(page_num + 1)) # 爬取页面 browser.get('https://s.taobao.com/search?q={}&s={}'.format(key_word, page_num * 44)) browser.implicitly_wait(15) get_data() page_num += 1 print("数据爬取完毕!") if __name__ == '__main__': key_word = input("请输入你要搜索的手机品牌:") browser = webdriver.Chrome() main()
import pandas as pd import matplotlib.pyplot as plt import jieba from imageio import imread from wordcloud import WordCloud # 项目 project = "华为手机" # 显示中文标签 plt.rcParams['font.sans-serif'] = ['SimHei'] # 这两行需要手动设置 plt.rcParams['axes.unicode_minus'] = False # 文件全路径+文件名 csv_file_name = '{}.csv'.format(project) # 获取文件中的内容 data = pd.read_csv(open(csv_file_name, encoding='utf-8'), header=None) # 设置列名 data.columns = ["desc", "price", "buynum"] # 可视化1:销量前5名手机型号折线图 # 分析:哪一型号手机销量最好 def huatu1(data_ten): x_values = data_ten["desc"] y_values = data_ten["buynum"] plt.plot(x_values, y_values, linewidth=4) plt.xlabel("手机型号", size='16') # 设置横坐标标签 plt.ylabel('销量', size='16') # 设置纵坐标标签 plt.title("销量前5名手机型号折线图", fontsize=20) # 保存图表并命名,bbox_inches='tight'表示将图表多余的空白区域裁减掉 plt.savefig("销量前5名手机型号折线图", bbox_inches='tight') plt.show() # 可视化2:销量前10名手机价格折线图 # 分析:找到在这前10类好销量中,价格最低的手机 def huatu2(data_ten): x_values = data_ten["desc"] y_values = data_ten["price"] plt.plot(x_values, y_values, linewidth=4) plt.xlabel("手机型号", size='16') # 设置横坐标标签 plt.ylabel('价格', size='16') # 设置纵坐标标签 plt.title("销量前5名手机价格柱状图", fontsize=20) # 保存图表并命名,bbox_inches='tight'表示将图表多余的空白区域裁减掉 plt.savefig("销量前5名手机价格柱状图", bbox_inches='tight') plt.show() # 可视化3:参数信息词云图 # 分析:发现市面上在售手机注重的信息参数 def huatu3(word_count): # 1、读取背景图片 back_picture = imread("backg.jpg") # 2、设置词云参数 wc = WordCloud(font_path="G:\\6Tipdm\\wordcloud\\simhei.ttf", background_color="white", max_words=2000, mask=back_picture, max_font_size=200, random_state=42 ) wc2 = wc.fit_words(word_count) # 3、绘制词云图 plt.figure(figsize=(16, 8)) plt.imshow(wc2) plt.axis("off") plt.show() wc.to_file("手机参数信息词云图.png") # 可视化4:不同价格区间手机饼图 # 分析:哪类价格区间的手机型号最多,推测出消费者最能接受的价格区间 def huatu4(data): plt.figure(figsize=(10, 5), dpi=200) x = data['level'] y = data.groupby('level').count().reset_index plt.hist(x,bins=12, color='green', align='mid') plt.title('在售手机价格区间统计') plt.xlabel('价格区间') plt.ylabel('手机型号数') plt.savefig('在售手机价格区间统计') plt.show() # 数据去重 def quchong(): # 去重之前的记录数 print("去重之前的记录数", data.shape) # 去重“详细信息”相同的记录,删除后出现的重复的值: data.drop_duplicates(subset=["desc"], inplace=True) # 去重之后的记录数 print("去重之后的记录数", data.shape) # 销量数据清洗,将数据清洗为int类型(1万+相应进行清洗) def xiaoliang(x): # find()方法检测字符串中是否包含子字符串”万“,不包含在指定范围内则返回-1 # print(type(x)) if x.find("万") != -1: x = x[0] return int(x) * 10000 elif x.find("+") != -1: x = list(x) x.remove('+') x = ''.join(x) return int(x) else: return int(x) # 清洗出价格少于五百的耳机钢化膜等(假设小于五百的都是非法数据) def data_jiage(): # 如果price列的值<500 d = data[data['price'] < 500] data1 = data.drop(d.index) # print(data1[data1['price'] < 500]) return data1 # 清洗出销量排行前五的信息,方便为后面可视化图提供数据 def data_cleansing(data): # 按照特定列的值进行排序 sort_data = data.sort_values('buynum', ascending=True) # 获取前五条数据 data_ten = sort_data.tail(5) # 输出每一条参数信息,设置手机型号 data_ten["desc"] = data_ten["desc"].apply(set_xinghao) # data_ten.to_csv('销量前五.csv') return data_ten def set_xinghao(x): # 打印型号,设置型号 print(x) x = input("型号为:") return x # 参数信息清洗,使用jieba库做词频统计,方便后面做词云图的数据 def canshu(data): # 将商品信息进行切分 data["desc_cut"] = data["desc"].apply(lambda x: jieba.lcut(x)) # 定义一个字符串,含有需要切割的字符,以逗号分隔 stop = "手机,&,【,】,?,/,+" # 以逗号切分 stop = stop.split(',') # 将包含在stop的字符切割 data["desc_cut"] = data["desc_cut"].apply(lambda x: [i for i in x if i not in stop]) # 存取词频数据 all_words = [] for i in data["desc_cut"]: for j in i: all_words.extend(i) word_count = pd.Series(all_words).value_counts() return word_count # 1000元为一个等级,呈现分区分布;于是创建价格等级字段,以便后续进行分析; def get_price_level(p): level=p//1000 if level==0: return '0~999' if level==1: return '1000~1999' if level==2: return '1999~2999' if level==3: return '2999~3999' if level==4: return '3999~4999' if level>=5: return '5000+' else: return '计算出错' def main(): # 1、数据清洗 # 数据去重 quchong() # 销量数据清洗 # data["buynum"] = data["buynum"].apply(xiaoliang) # 更改价格数据格式为float: data['price'].astype('float') # 删除非法价格(假设小于500为非法数据) data1 = data_jiage() # 增加价格区间数据 data1['level'] = data1['price'].apply(get_price_level) # 获取销量前五数据 data_ten = data_cleansing(data1) # 清洗出desc信息里的各种参数信息,获取参数词频数据 word_count = canshu(data1) # 2、可视化 huatu1(data_ten) huatu2(data_ten) huatu3(word_count) huatu4(data1) # 输出清洗后的数据 data1.to_csv('2.csv') if __name__ == '__main__': main()
销量前5名手机价格折线图
销量前5名手机型号折线图
在售手机价格区间统计
手机参数信息词云图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。