百木园-与人分享,
就是让自己快乐。

一位同学的Python大作业【分析当当网书籍价格、出版社、电子书版本占比数据】

目录

  • 前言
    • 本次案例实现目标
    • 最基本思路流程: <通用>
      • 一. 数据来源分析
      • 二. 代码实现步骤过程: 代码实现基本四大步骤
  • 代码实现
    • 获取书籍详情信息
      • 发送请求
      • 解析数据
      • 保存数据
      • 运行代码得到结果
    • 可视化图表
      • 书籍总体价格区间
      • 各个出版社书籍数量柱状图
      • 电子书版本占比
    • 书籍评论数据
    • 词云

 

对于本篇文章有疑问的同学可以加【资料白嫖、解答交流群:326937069】

前言

本次案例实现目标

  • 书籍基本数据
  • 实现可视化图表
  • 书籍评论数据
  • 评论可以实现词云图

最基本思路流程: <通用>

一. 数据来源分析
  1. 只有当你知道你想要数据内容, 是来自于哪里的时候, 才能通过代码请求得到数据
  2. 打开 F12 开发者工具进行抓包分析
  3. 通过关键字进行搜索查询 数据包是请求那个url地址
二. 代码实现步骤过程: 代码实现基本四大步骤
  1. 发送请求, 模拟浏览器对于url地址<刚刚分析得到的url地址>发送请求
  2. 获取数据, 获取服务器返回响应数据 —> 开发者工具里面 response
  3. 解析数据, 提取我们想要的数据内容 —> 书籍基本信息
  4. 保存数据, 把数据内容保存到表格里面

代码实现

获取书籍详情信息

发送请求
url = f\'http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1\'
# 代码模拟浏览器发送请求 ---> headers请求头 <可以复制粘贴>
headers = {
    # User-Agent 用户代理 表示浏览器基本身份标识
    \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\'
}
# 发送请求
response = requests.get(url=url, headers=headers)

 

解析数据
# 转换数据类型 ---> 可解析对象
selector = parsel.Selector(response.text)
# 第一次提取, 获取所有li标签
lis = selector.css(\'.bang_list_mode li\')  # 返回列表
# for循环遍历, 把列表里面的元素一个一个提取出来
for li in lis:
    title = li.css(\'.name a::attr(title)\').get()  # 标题/书名
    recommend = li.css(\'.tuijian::text\').get().replace(\'推荐\', \'\')  # 推荐
    star = li.css(\'.star a::text\').get().replace(\'条评论\', \'\')  # 评价
    author = li.css(\'div:nth-child(5) a:nth-child(1)::attr(title)\').get()  # 作者
    date = li.css(\'div:nth-child(6) span::text\').get()  # 出版日期
    press = li.css(\'div:nth-child(6) a::text\').get()  # 出版社
    price_r = li.css(\'.price .price_r::text\').get()  # 原价
    price_n = li.css(\'.price .price_n::text\').get()  # 售价
    price_e = li.css(\'.price_e span::text\').get()  # 电子书价格
    href = li.css(\'.name a::attr(href)\').get()  # 详情页
    dit = {
        \'标题\': title,
        \'推荐\': recommend,
        \'评价\': star,
        \'作者\': author,
        \'出版日期\': date,
        \'出版社\': press,
        \'原价\': price_r,
        \'售价\': price_n,
        \'电子书价格\': price_e,
        \'详情页\': href,
    }
    csv_writer.writerow(dit)
    print(dit)

 

保存数据
f = open(\'书籍.csv\', mode=\'a\', encoding=\'utf-8\', newline=\'\')
csv_writer = csv.DictWriter(f, fieldnames=[
    \'标题\',
    \'推荐\',
    \'评价\',
    \'作者\',
    \'出版日期\',
    \'出版社\',
    \'原价\',
    \'售价\',
    \'电子书价格\',
    \'详情页\',
])
# 写入表头
csv_writer.writeheader()

 

运行代码得到结果


可视化图表

书籍总体价格区间
pie1 = (
    Pie(init_opts=opts.InitOpts(theme=\'dark\',width=\'1000px\',height=\'600px\'))
    
    .add(\'\', datas_pair_1, radius=[\'35%\', \'60%\'])
    .set_series_opts(label_opts=opts.LabelOpts(formatter=\"{b}:{d}%\"))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title=\"当当网书籍\\n\\n原价价格区间\", 
            pos_left=\'center\', 
            pos_top=\'center\',
            title_textstyle_opts=opts.TextStyleOpts(
                color=\'#F0F8FF\', 
                font_size=20, 
                font_weight=\'bold\'
            ),
        )
    )
    .set_colors([\'#EF9050\', \'#3B7BA9\', \'#6FB27C\', \'#FFAF34\', \'#D8BFD8\', \'#00BFFF\', \'#7FFFAA\'])
)
pie1.render_notebook() 

 

pie1 = (
    Pie(init_opts=opts.InitOpts(theme=\'dark\',width=\'1000px\',height=\'600px\'))
    
    .add(\'\', datas_pair_2, radius=[\'35%\', \'60%\'])
    .set_series_opts(label_opts=opts.LabelOpts(formatter=\"{b}:{d}%\"))
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title=\"当当网书籍\\n\\n售价价格区间\", 
            pos_left=\'center\', 
            pos_top=\'center\',
            title_textstyle_opts=opts.TextStyleOpts(
                color=\'#F0F8FF\', 
                font_size=20, 
                font_weight=\'bold\'
            ),
        )
    )
    .set_colors([\'#EF9050\', \'#3B7BA9\', \'#6FB27C\', \'#FFAF34\', \'#D8BFD8\', \'#00BFFF\', \'#7FFFAA\'])
)
pie1.render_notebook() 

 

各个出版社书籍数量柱状图
bar=(
    Bar(init_opts=opts.InitOpts(height=\'500px\',width=\'1000px\',theme=\'dark\'))
    .add_xaxis(counts.index.tolist())
    .add_yaxis(
        \'出版社书籍数量\',
        counts.values.tolist(),
        label_opts=opts.LabelOpts(is_show=True,position=\'top\'),
        itemstyle_opts=opts.ItemStyleOpts(
            color=JsCode(\"\"\"new echarts.graphic.LinearGradient(
            0, 0, 0, 1,[{offset: 0,color: \'rgb(255,99,71)\'}, {offset: 1,color: \'rgb(32,178,170)\'}])
            \"\"\"
            )
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title=\'各个出版社书籍数量柱状图\'),
            xaxis_opts=opts.AxisOpts(name=\'书籍名称\',
            type_=\'category\',                                           
            axislabel_opts=opts.LabelOpts(rotate=90),
        ),
        yaxis_opts=opts.AxisOpts(
            name=\'数量\',
            min_=0,
            max_=29.0,
            splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_=\'dash\'))
        ),
        tooltip_opts=opts.TooltipOpts(trigger=\'axis\',axis_pointer_type=\'cross\')
    )

    .set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(type_=\'average\',name=\'均值\'),
                opts.MarkLineItem(type_=\'max\',name=\'最大值\'),
                opts.MarkLineItem(type_=\'min\',name=\'最小值\'),
            ]
        )
    )
)
bar.render_notebook()

 

电子书版本占比
c = (
    Liquid()
    .add(\"lq\", [1-per], is_outline_show=False)
    .set_global_opts(title_opts=opts.TitleOpts(title=\"电子书版本占比\"))
)
c.render_notebook()

 

书籍评论数据

for page in range(1, 11):
    time.sleep(1)
    # 确定请求url地址
    url = \'http://product.dangdang.com/index.php\'
    # 请求参数
    data = {
        \'r\': \'comment/list\',
        \'productId\': \'29129370\',
        \'categoryPath\': \'01.43.79.01.00.00\',
        \'mainProductId\': \'29129370\',
        \'mediumId\': \'0\',
        \'pageIndex\': page,
        \'sortType\': \'1\',
        \'filterType\': \'1\',
        \'isSystem\': \'1\',
        \'tagId\': \'0\',
        \'tagFilterCount\': \'0\',
        \'template\': \'publish\',
        \'long_or_short\': \'short\',
    }
    # headers 请求头
    headers = {
        \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36\'
    }
    # 发送请求
    response =  requests.get(url=url, params=data, headers=headers)
    # response.json() 获取响应json字典数据 键值对取值 ---> 根据冒号左边的内容, 提取冒号右边的内容
    html_data = response.json()[\'data\'][\'list\'][\'html\']
    content_list = re.findall(\"<span><a href=.*?\' target=\'_blank\'>(.*?)</a></span>\", html_data)
    with open(\'评论.txt\', mode=\'a\', encoding=\'utf-8\') as f:
        f.write(\'\\n\'.join(content_list))
        f.write(\'\\n\')
        print(content_list)

 

词云

import jieba # 分词模块 pip install jieba
import wordcloud
import imageio
img = imageio.imread(\'123.png\')
# wordcloud
# 1. 打开文件 获取弹幕数据
# mode=\'r\' 一定要写吗  不一定 默认以 r
# encoding=\'\' 要写吗?  肯定要的
f = open(\'评论.txt\', mode=\'r\', encoding=\'utf-8\')
txt = f.read()
# print(txt)
# 2. jieba分词 分割词汇
txt_list = jieba.lcut(txt)
# print(txt_list)
# 列表转字符串怎么转
string = \' \'.join(txt_list)
# print(string)
# 3. 词云图设置
wc = wordcloud.WordCloud(
    width=800,  # 宽度
    height=500, # 高度
    background_color=\'white\', # 背景颜色
    mask=img, # 设置图片样式
    font_path=\'msyh.ttc\',
    scale=15,
    stopwords={\'\', \'\'},
    contour_width=5,
    contour_color=\'red\'
)
# 4. 输入文字内容 (字符串的形式)
wc.generate(string)
# 5. 输出图片
wc.to_file(\'output2.png\')

 


来源:https://www.cnblogs.com/qshhl/p/16697157.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 一位同学的Python大作业【分析当当网书籍价格、出版社、电子书版本占比数据】

相关推荐

  • 暂无文章