当前位置:   article > 正文

当当网Python图书数据分析_当当网数据分析

当当网数据分析
  1. 任务描述

【说明:可以从项目的背景、项目的具体内容、涉及到的相关技术、实施流程、项目的目标或意义进行描述】

1. 从当当网获取Python有关的图书的数据

2. 对数据进行存储、清洗、整理

3. 分析图书价格分布、出版社分布、评论数量前10的图书、评论词云统计

  1. 数据源(集)
    1. 数据来源

【说明:数据来源即数据获取的网站、URL;若是已有的数据集,要说明数据集的来源位置】

URL:http://search.dangdang.com/?key=Python&act=input&page_index=%d

    1. 数据描述

【说明:数据集中的数据描述,包括几个数据文件,具体数据项及数据类型,数据量等等】

    1.  数据源采集

【说明:2.3仅针对需要进行“数据采集”来获取的数据源,描述数据源获取的流程或算法】

利用Scrapy框架对当当网进行爬取

  1. 项目实施
    1. 实施技术介绍

【说明:项目具体实施的相关技术,例如对数据进行聚类分析,此部分对聚类算法理论进行基础论述】

    1. 实施方案设计

【说明1:具体的方案的实施,例如对数据进行聚类分析,从具体实现的角度去描述如何取做的,例如:如何进行数据表示,采用什么库或技术等等】

【说明2:根据项目的具体任务,设置3.2.1,3.2.2标题,分小节进行说明】

      1. 数据获取

对当当网Python图书数据进行爬取,并储存为csv文件

 

 

 

 

 

      1. 数据分析
        1. 图书价格分布

首先读取csv文件,将价格分为0-50,50-100,100以上三个档次

获取所有价格列表

 

代码如下:

import os

import csv

file = open(r'C:\Users\JackGIVENCHY\Desktop\dangdang.csv',encoding='utf-8')

fileReader = csv.reader(file)

filedata = list(fileReader)

data=[]

s1=[]

s2=[]

s3=[]

for i in filedata:

    t=i[1]

    data.append(''.join(t))

#print(data)

for j in range(1,14777):

    if float(data[j]) < 50.00:

        s1.append(data[j])

    elif float(data[j]) > 100.00:

        s3.append(data[j])

    else:

        s2.append(data[j])

print(len(s1))

print(len(s2))

print(len(s3))

对图书价格进行kmeans聚类如下所示:

由于图书价格是一维数据reshape后也无法作图

 

import csv

import matplotlib.pyplot as plt

import numpy as np

from sklearn.cluster import KMeans

file1 = open(r'C:\Users\JackGIVENCHY\Desktop\python书籍.csv',encoding='utf-8')

fileReaders = csv.reader(file1)

filedatas = list(fileReaders)

#print(filedatas)

g=[]

for i in filedata:

    t=i[1]

    g.append(''.join(t))

X=np.array(g[1:10]).reshape(-1, 1)

print(X)

km2 = KMeans(n_clusters=2).fit(X)

print("当k=2时聚类结果:", km2.labels_)

对结果使用echarts进行可视化

 

 

代码如下:

import pyecharts.options as opts

from pyecharts.charts import Pie

from pyecharts.globals import ThemeType

# 数据准备

x_data = ["大于50", "50-100", "大于100"]

y_data = [6602,6369,1805]

data_pair = [list(z) for z in zip(x_data, y_data)]

data_pair.sort(key=lambda x: x[1]) # 排序

c=(

   # 初始化

    Pie(init_opts=opts.InitOpts(

        width="900px",

        height="600px",

        theme=ThemeType.MACARONS))

    .add(

        series_name="访问来源",# 系列名称

        data_pair=data_pair, # 系列数据项,格式为 [(key1, value1), (key2, value2)]

        

        # 是否展示成南丁格尔图,通过半径区分数据大小,有'radius'和'area'两种模式。

        # radius:扇区圆心角展现数据的百分比,半径展现数据的大小

        # area:所有扇区圆心角相同,仅通过半径展现数据大小

        rosetype="radius",

        

        # 饼图的半径

        radius="55%",

        

        # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标

        # 默认设置成百分比,设置成百分比时第一项是相对于容器宽度,第二项是相对于容器高度

        center=["50%", "50%"],

        

        # 标签配置项

        label_opts=opts.LabelOpts(is_show=False, position="center"),

    )

    

    #全局配置项

    .set_global_opts(

        # 设置标题

        title_opts=opts.TitleOpts(

            title="dangdangtushu_money",

            pos_left="center",

            pos_top="20",

            title_textstyle_opts=opts.TextStyleOpts(color="#fff"),

        ),

        # 设置图例

        legend_opts=opts.LegendOpts(is_show=True),

    )

    

    # 系统配置项

    .set_series_opts(

        # 设置提示框

        tooltip_opts=opts.TooltipOpts(

            trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"

        ),

        label_opts=opts.LabelOpts(color="#3333FF"),

    )

    .render("dangdangtushu_money.html")

)

        1. 出版社分布

读取后用set函数进行去重处理,统计出版社出版书籍数量

 

代码如下:

data1=[]

for i in filedata:

    k=i[4]

    data1.append(''.join(k))

#print(data1)

publish_number = len(set(data1))

print(str(publish_number))

publish_data = list(set(data1))

dict = {}

for i in data1:

    dict[i] = dict.get(i,0) + 1

print(dict)

print(len(dict))

对出版社分布利用matplotlib.pyplot进行可视化分析

 

by_value = dict.items()

x=[]

y=[]

for d in by_value:

    x.append(d[0])

    y.append(d[1])

print(x,y)

 

import matplotlib.pyplot as plt

# 这两行代码解决 plt 中文显示的问题

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

pubs = x

book_number = y

plt.barh(pubs, book_number)  # 横放条形图函数 barh

plt.title('出版社出版图书数量')

plt.show()

#plt.savefig('chubanshe.jpg')

3.2.2.3 评论数量前10的图书

 

代码:

file1 = open(r'C:\Users\JackGIVENCHY\Desktop\python书籍.csv',encoding='utf-8')

fileReaders = csv.reader(file1)

filedatas = list(fileReaders)

#print(filedatas)

data3 = []

data4 = []

for i in filedatas:

    t = i[5]

    data3.append(''.join(t))

a = data3[1:10]

for i in filedatas:

    t = i[0]

    data4.append(''.join(t))

b = data4[1:10]

 

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

pubs = b

book_number = a

plt.barh(pubs, book_number)  # 横放条形图函数 barh

plt.title('当当Python图书评论前十')

plt.show()

3.2.2.4评论词云统计

1.找到目标的url

 

2.检查响应结果

  1. 分析翻页的URL规律

前三页url如下:

http://product.dangdang.com/index.php?r=comment/list&productId=28486010&categoryPath=01.54.06.19.00.00&mainProductId=28486010&mediumId=0&pageIndex=1&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=publish

http://product.dangdang.com/index.php?r=comment/list&productId=28486010&categoryPath=01.54.06.19.00.00&mainProductId=28486010&mediumId=0&pageIndex=2&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=publish

http://product.dangdang.com/index.php?r=comment/list&productId=28486010&categoryPath=01.54.06.19.00.00&mainProductId=28486010&mediumId=0&pageIndex=3&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=publish

不同页url的不同之处,在于参数pageindex。第一页对应1,第二页为2… … 而参数long_or_short=short对结果无影响,因此不做考虑。

 

实现代码:

import requests

import jsonpath

import re

import json

if __name__ == '__main__':

    # 输入要爬取的页数

    pages = int(input('请输入要爬取的页数:'))

    for i in range(pages):

        page = i + 1

        # 确认目标的url

        url = f'http://product.dangdang.com/index.php?r=comment/list&productId=28486010&categoryPath=01.54.06.19.00.00&mainProductId=28486010&mediumId=0&pageIndex={page}&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=cloth'

        # 构造请求头参数

        headers = {

            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36',

            'Referer':'http://product.dangdang.com/1412059069.html',

            'Cookie':'from=460-5-biaoti; order_follow_source=P-460-5-bi%7C%231%7C%23www.baidu.com%252Fother.php%253Fsc.060000jRtGgkBd47ECAxHUxBlqwLkfBJsl8lSLtmm9Zl27Qa_kZyOm2Qg_lyRgkRd4vKD9uWt%7C%230-%7C-; ddscreen=2; __permanent_id=20210304204636997189494350346254347; __visit_id=20210304204637001245338343220621735; __out_refer=1614861997%7C!%7Cwww.baidu.com%7C!%7C%25E5%25BD%2593%25E5%25BD%2593%25E7%25BD%2591; __ddc_15d_f=1614861997%7C!%7C_utm_brand_id%3D11106; dest_area=country_id%3D9000%26province_id%3D111%26city_id%3D0%26district_id%3D0%26town_id%3D0; pos_0_end=1614862009963; __ddc_1d=1614862062%7C!%7C_utm_brand_id%3D11106; __ddc_24h=1614862062%7C!%7C_utm_brand_id%3D11106; __ddc_15d=1614862062%7C!%7C_utm_brand_id%3D11106; pos_9_end=1614862078563; ad_ids=4343831%2C3554365%7C%233%2C2; secret_key=f097eea219c17c155499399cb471dd5a; pos_1_start=1614863547245; pos_1_end=1614863547264; __rpm=%7Cp_1412059069.029..1614863548625; __trace_id=20210304211706253212636290464425201'

        }

        # 发送请求,获取响应

        response = requests.get(url,headers=headers)

        # 响应类型为json类型

        py_data = response.json()

        # 解析数据,提取数据.

        html_data = jsonpath.jsonpath(py_data,'$..html')[0]

        # 通过正则表达式,提取html数据中的用户昵称和评论

        comment_list = re.findall(r'<div class="describe_detail">\s*<span>(.*?)</span>\s*</div>',html_data)

        nickname_list = re.findall(r'alt="(.*?)"',html_data)

        # 将数据放进字典

        for i in range(len(comment_list)):

            dict_ = {}

            dict_[nickname_list[i]] = comment_list[i]

            # 将字典转换成json格式

            json_data = json.dumps(dict_,ensure_ascii=False)+',\n'

            # 将数据保存到本地

            with open('当当网书籍评价.json','a',encoding='utf-8')as f:

                f.write(json_data)

储存为json文件

 

绘制词云图

 

实现代码:import matplotlib.pyplot as plt  # 数学绘图库

import jieba  # 分词库

import numpy as np

from wordcloud import WordCloud,ImageColorGenerator  # 词云库

text = open(r'C:\Users\JackGIVENCHY\Desktop\1.txt', "r",encoding='utf-8', errors='ignore').read()

# 2、结巴分词,默认精确模式。可以添加自定义词典userdict.txt,然后jieba.load_userdict(file_name) ,file_name为文件类对象或自定义词典的路径

# 自定义词典格式和默认词库dict.txt一样,一个词占一行:每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒

cut_text= jieba.cut(text)

result = "/".join(cut_text)  # 必须给个符号分隔开分词结果来形成字符串,否则不能绘制词云

# print(result)

# 3、生成词云图,这里需要注意的是WordCloud默认不支持中文,所以这里需已下载好的中文字库

# 无自定义背景图:需要指定生成词云图的像素大小,默认背景颜色为黑色,统一文字颜色:mode='RGBA'和colormap='pink'

wc = WordCloud(font_path=r"c:\WINDOWS\FONTS\MSYHL.TTC", background_color='white', width=400,

               height=300, max_font_size=50,

               max_words=1000)  # ,min_font_size=10)#,mode='RGBA',colormap='pink')

wc.generate(result)

wc.to_file(r"C:\Users\JackGIVENCHY\Desktop\wordcloud.png")  # 按照设置的像素宽高度保存绘制好的词云图,比下面程序显示更清晰

# 4、显示图片

plt.figure("词云图")  # 指定所绘图名称

plt.imshow(wc)  # 以图片的形式显示词云

plt.axis("off")  # 关闭图像坐标系

  1.  结果分析及可视化

【说明1:对实验结果进行性能分析;若是多个算法可以进行结果对比分析】

【说明2:采用可视化的形式对项目的分析结果或执行结果进行展示】

【说明3:自行设计三级小标题,采用“标题3”的排版格式】

  图书价格分析可视化展示 :

 

出版社分布可视化分析展示:

 

评论数量前十的图书可视化展示:

 

评论词云统计可视化展示:

 

  1.  总结   

【说明:对该项目进行总结说明,对项目中实现的功能,遇到的问题,解决方案,有待进一步完善提升的方面进行总结】

Python作为时下流行的编程语言,以高度的封装性、灵活性、丰富的第三库资源,在数据分析领域中占据着重要的地位。python的应用领域广泛,包括系统运维、科学计算、人工智能、网络编程(如搜索引擎、爬虫、服务器编程)、web开发、云计算系统、图形化、教育等。

        在大数据时代, 网络爬虫技术可以有效准确地抓取目标数据, 可以为我们节省大量的资源, 对信息检索起着十分重要的作用。基于Python的网络爬虫技术, 具有很高的前瞻性, 有一定的研究价值。即上部分提到的http Response结果。这个结果中就包含Cookie, 后续的访问就可以利用它来实现模拟登录。

        在当今数据大爆发的时代, 通过爬虫快速的从互联网中爬行所需要的信息显得格外重要。在数据爬虫方面,利用rullib、requests、BeautifulSoup、re、Scrapy等模块进行爬取想要的网站资料,如搜房、淘宝、京东、微信、今日头条、中国知网、新浪、贴吧、金融界、电影论坛等等;Python在爬虫应用中充当了重要的角色。丰富的第三方库让开发变得简单易用。实例证明应用Python语言可以方便地实现深度网络爬虫和聚焦型网络爬虫相结合的爬虫程序, 将网络中的大数据进行整合, 让大数据更方便的服务于其他应用程序。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/809628
推荐阅读
相关标签
  

闽ICP备14008679号