淘宝-笔记本电脑-数据分析

梁松*

Python,爬虫,pyecharts,numpy,webdriver,jupyter,jieba

项目描述

python利用webdriver,jupyter,numpy,pyecharts,jieba等包,实现网络数据的爬取,处理,并绘制成图表的功能

上传时间

2021.07.21

浏览人数

1591人
梁松*
天津市河东区
Hot:10743

爬虫部分:大部分网站有机器人检测功能,因此本程序仍需要手动扫码登录(扫码期间有10s延时),其余功能则有webdriver模拟自动运行

代码:

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException
import time
from openpyxl import load_workbook, Workbook
import os
class Excel:
   """
       WorkBook 工作簿
       Sheet 表格
       Row 行
       Column 列
       Cell 单元格
       !!!注意:用Python脚本操作Excel文件时,当前文件不可为占用状态!!!
   """

   def __init__(self, file_path):

       self.path = file_path
       if not os.path.exists(self.path):
           w = Workbook()
           w.save(self.path)
       self.wb = load_workbook(self.path)

   # data = ["学员编号","姓名","年龄","性别"]
   def write_head(self, data, sheet_idx=0):
       if not isinstance(data, list) and not isinstance(data, tuple):
           raise TypeError("'data'参数(表头)必须为list/tuple类型")
       if not data:
           raise ValueError("'data'参数(表头)不可为空")

       all_sheet = self.wb.sheetnames
       crt_sheet_name = all_sheet[sheet_idx]
       sheet = self.wb[crt_sheet_name]
       for x in range(len(data)):
           sheet.cell(row=1, column=x + 1, value=data[x])
       self.wb.save(self.path)

   def add_data(self, data, sheet_idx=0):
       all_names = self.wb.sheetnames  # 获取到所有表格的名字
       name = all_names[sheet_idx]  # 获取到指定索引的表格名
       sheet = self.wb[name]  # 通过表格名选中表格
       m_row = sheet.max_row  # 找到当前表格最后一行的行数
       for i in range(len(data)):
           sheet.cell(row=m_row + 1, column=i + 1, value=data[i])  # 再通过行列选中一个单元格并赋值
       self.wb.save(self.path)  # 每一次修改工作簿之后必须保存


def get_list_by_class_name(class_name):  # 提供class名以获取对应数据,并返回list
   req_list = []
   for a in range(45):
       try:
           all_elements = wd.find_elements_by_class_name(class_name)
           for b in range(len(all_elements)):
               one_ele = all_elements[b].text
               req_list.append(one_ele)
           return req_list
       except StaleElementReferenceException as e:
           print(e)
           return []


if __name__ == '__main__':

   url = "https://login.taobao.com/member/login.jhtml"  # 用selenium中的webdriver对目标网页进行数据获取
   wd = webdriver.Chrome()
   wd.maximize_window()  # 全屏
   wd.get(url)
   wd.find_element_by_class_name("icon-qrcode").click()
   time.sleep(10)
   wd.find_element_by_id("J_SiteNavHome").click()
   time.sleep(2)
   wd.find_element_by_id("q").send_keys("笔记本电脑")  # 输入关键字进行搜索
   wd.find_element_by_class_name("btn-search").click()
   time.sleep(2)
   title_list = get_list_by_class_name("row-2")  # 在目标网页获取对应class内的内容
   price_list = get_list_by_class_name("g_price-highlight")
   deal_list = get_list_by_class_name("deal-cnt")
   location_list = []
   for a in range(45):
       try:
           row3 = wd.find_elements_by_class_name("row-3")
           for l in range(len(row3)):
               location = row3[l].find_element_by_class_name("location").text
               location_list.append(location)
       except StaleElementReferenceException as e:
           print(e)
   time.sleep(5)
   # 数据获取完毕退出webdriver
   wd.quit()  
   e = Excel("../excel_files/pet.xlsx")  # 将所得数据导入Excel,用于做后续处理
   head_data = ["标题", "价格", "成交量", "发货地"]
   e.write_head(head_data)
   for i in range(len(location_list)):
       one_list = [title_list[i], price_list[i], deal_list[i], location_list[i]]
       e.add_data(one_list)      

数据处理部分:

import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.charts import Map
from pyecharts.faker import Faker
from pyecharts.charts import Pie
import jieba
from pyecharts.charts import WordCloud
import jieba.analyse

pd1 = pd.read_excel("computer/conputer.xlsx")  # 导入Excel
pd1.index = [i for i in range(1,3002)]   # 修改默认索引值
pd1 = pd1.fillna(value="暂无")   # 将部分数据中的NaN值用"暂无"进行填充

pd2 = pd1["发货地"]     # 获取并处理"发货地"列的数据,转为list
new_pd_location = []
for i in range(1,3002):
    new_loc = pd2[i].split(" ")[0]
    new_pd_location.append(new_loc)
pd1["发货地"] = new_pd_location
pd_price = pd1["价格"]   # 获取并处理"价格"列的数据,转为list
new_pd_price = []
for i in range(1, 3002):
    pd_price[i]
    new_price = pd_price[i][1:]
    new_pd_price.append(new_price)
pd1["价格"] = new_pd_price
pd3 = pd1["成交量"]    # 获取并处理"成交量"列的数据,转为list
new_pd_deal = []
for i in range(1, 3002):
    pd4 = pd3[i].split("人")[0]
    if pd4.find("万") != -1:
        pd4 = int(float(pd4.split("万")[0])*10000)
        new_pd_deal.append(pd4)
    elif pd4.endswith("+"):
        pd4 = int(pd4.split("+")[0])
        new_pd_deal.append(pd4)
    elif pd4 == "暂无":
        pd4 = 0
        new_pd_deal.append(pd4)
    else:
        new_pd_deal.append(int(pd4))

pd1["成交量"] = new_pd_deal
pd_deal_sort = pd1.sort_values(by=["成交量"],ascending=False)   # 按照成交量由大到小排序
data_deal = pd_deal_sort.iloc[0:10]  # 处理用于做图的数据
x_data = data_deal["价格"]
category = x_data.tolist()
y_data = data_deal["成交量"]
red_bar = y_data.tolist()

# 制作柱状图
( 
    Bar(init_opts=opts.InitOpts(width="1300px", height="700px"))
    .add_xaxis(xaxis_data=category )
    .add_yaxis(
        series_name="成交排行榜", y_axis=red_bar, label_opts=opts.LabelOpts(is_show=True)
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="成交量"),
        xaxis_opts=opts.AxisOpts(splitline_opts=opts.SplitLineOpts(is_show=False)),
        yaxis_opts=opts.AxisOpts(
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=False),
        ),
    )
    .render("成交量.html")
)  

location_data = pd1["发货地"]  # 整理发货地数据格式
location_data = location_data.value_counts().to_dict()

#制作发货地地图
c = (
    Map()
    .add("发货地分布图", [list(z) for z in zip(Faker.provinces, location_data.values())], "china")
    .set_global_opts(title_opts=opts.TitleOpts(title="发货地分布图"))
    .render("发货地分布图.html")
)

price_list = pd1["价格"].tolist()  # 处理价格,设定价格区间为4分,并对区间内售价进行计数
int_list = []
for i in range(len(price_list)):
    int_price = int(price_list[i].split(".")[0])
    int_list.append(int_price)
a = np.array(int_list)
max_list = max(int_list)
max_list
min_list = min(int_list)
min_list
area = np.linspace(min_list,max_list,5)
count1 = a[a<=area[1]].tolist()
count1 = len(count1)
count2 = a[(area[1]<a) & (a<=area[2])].tolist()
count2 = len(count2)
count3 = a[(area[2]<a) & (a<=area[3])].tolist()
count3 = len(count3)
count4 = a[(area[3]<a) & (a<=area[4])].tolist()
count4 = len(count4)
count = [count1,count2,count3,count4]
area1 = [[area[0],area[1]],[area[1],area[2]],[area[2],area[3]],[area[3],area[4]]]

# 制作价格区间饼图
c = (
    Pie()
    .add("", [list(z) for z in zip(area, count)])
    .set_global_opts(title_opts=opts.TitleOpts(title="价格区间"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    .render("价格区间.html")
)

title = pd1["标题"] # 标题进行分字,剔除无意义的字段,并制成云图
title = title.tolist()
keywords = []
for j in range(len(title)):
    ky = jieba.analyse.extract_tags(title[j], topK=20, withWeight=False, allowPOS=())
    nky = " " .join(ky)
    keywords.append(nky)
keywords
newkeywords = []
for k in range(len(keywords)):
    a = keywords[k].split(" ")
    for l in range(len(a)):
        one_keyword = a[l]
        newkeywords.append(one_keyword)
newkeywords
newkeywords = pd.Series(newkeywords)
c_keywords = newkeywords.value_counts()

# c_keywords = c_keywords.iloc[2:1802]
c_keywords = c_keywords.to_dict()
a1 = c_keywords.pop("官网")
a1 = c_keywords.pop("旗舰店")
a1 = c_keywords.pop("官方")
c_keywords
data = []
k_list = list(c_keywords.keys())
v_list  = list(c_keywords.values())
for m in range(151):
    a = (k_list[m],v_list[m])
    data.append(a)
data
(
    WordCloud()
    .add(series_name="热点分析", data_pair=data, word_size_range=[6, 66])
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
        ),
        tooltip_opts=opts.TooltipOpts(is_show=True),
    )
    .render("热点云图.html")
)

图:

淘宝-笔记本电脑-数据分析

梁松*

当前作品暂无评分

还未获得评语哦~
python python培训 天津python培训 python培训班 python培训多少钱 Django 天津python培训班 天津python培训 天津python培训机构。天津python培训学什么? python python培训 天津python培训 Mysql django Numpy flask anaconda 天津python培训 天津python培训班 python培训 python 天津python培训 天津python培训班 数据爬虫 爬虫技术 python爬虫 python 天津python培训 python培训 python PyCharm Eclipse + 天津python培训 python培训 python PyCharm Eclipse + PyDev python培训 天津python培训 python培训班 python培训多少钱 PyCharm Eclipse + PyDev visual studio 天津python培训 天津python培训班 PyCharm Eclipse + PyDev visual studio 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 python java web 天津python培训 天津python培训哪家好 天津python培训机构 天津python培训班 python java web前端 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训班 天津python培训机构 python java web 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python Java web 天津python培训 天津python培训学校 天津python培训机构 天津python培训班 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python Java web 天津python培训 天津python培训机构 天津python培训班 python培训 python java web 天津python培训 天津python培训机构 天津python培训学校 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训学校 python java web 天津python培训 天津python培训机构 python培训班 python java web 天津Java培训 天津Java培训班 Java培训 天津Java培训机构 python web java 天津python培训 天津python培训班 天津python培训机构 python java web 天津python培训 天津python培训班 python培训 天津python培训机构 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训机构 天津python培训学校 python web java 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训班
梁松*    10743 天津市河东区 设计师杨冰是女孩 1992.**.**
本网站已在中国版权保护中心登记了美术作品著作权与软件著作权违者将依法追究责任,特此声明! | Copyright©2013-2022,zhuzuoji.com | 诚筑说培训学校(天津)有限公司内容支持 | 京ICP备17020986号-5