爬取所需环境
selnium安装
- Win+R输入cmd敲回车进入到cmd窗口;
- 输入“pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple”或“pip install selenium”敲回车,等待,就安装好了(附加莫管:输入“pip uninstall matplotlib”进行matplotlib的卸载)。记得测试哈:
- 测试:安装好后,测试是否安装成功,命令行输入“python”进入python idel,输入“import selnium”运行,没有报错,即为安装成功:
- 附:安装其他所需库方法类似“pip3 install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple”
chromedriver.exe安装
1.百度搜索下载与本地安装Chrome对应版本,将其放到Chrome安装路径,在配置环境变量即可:
2.Path中新建一个,存入以下类似Chrome安装目录路径,保存即可:
爬取淘宝手机数据代码:
# 导入模块
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 = 0while 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 += 1print("数据爬取完毕!")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_indexplt.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) * 10000elif x.find("+") != -1:x = list(x)x.remove('+')x = ''.join(x)return int(x)else:return int(x)# 清洗出价格少于五百的耳机钢化膜等(假设小于五百的都是非法数据)
def data_jiage():# 如果price列的值<500d = 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_tendef 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//1000if 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名手机型号折线图
在售手机价格区间统计
手机参数信息词云图