一位同學的Python大作業【分析噹噹網書籍價格、出版社、電子書版本占比數據】

来源:https://www.cnblogs.com/qshhl/archive/2022/09/15/16697157.html
-Advertisement-
Play Games

目錄 前言 本次案例實現目標 最基本思路流程: <通用> 一. 數據來源分析 二. 代碼實現步驟過程: 代碼實現基本四大步驟 代碼實現 獲取書籍詳情信息 發送請求 解析數據 保存數據 運行代碼得到結果 可視化圖表 書籍總體價格區間 各個出版社書籍數量柱狀圖 電子書版本占比 書籍評論數據 詞雲 對於本 ...


目錄

 

對於本篇文章有疑問的同學可以加【資料白嫖、解答交流群: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')

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 個人博客:槿蘇的知識鋪 一、什麼是自動裝配 SpringBoot 定義了一套介面規範,這套規範規定:SpringBoot在啟動時會掃描外部引用jar包中的META-INF/spring.factories文件,將文件中配置的類型信息載入到Spring容器,並執行類中定義的各種操作。對於外部jar包來 ...
  • 真是一本透著編程思想的書。 上面的書讓你從微觀角度瞭解 Java,而這本書則可以讓你從一個巨集觀角度瞭解 Java。 這本書和 Java 核心技術的厚度差不多,但這本書的信息密度比較大。 所以,讀起來是非常耗大腦的,因為它會讓你不斷地思考。 對於想學好 Java 的程式員來說,這是一本必讀的書。 -... ...
  • 上一篇我們學習了多對一的處理,這次我們來學習一對多的處理。 一對多的處理與多對一的處理差別不大,只是有一些細微的地方需要註意。 我們還是先做準備工作,其他部分與多對一的準備工作相同,僅實體類構建需要做出改變。 一、修改實體類 Student類: package com.jms.pojo; publi ...
  • 前因後果 公司新來的小姐姐,超級喜歡看漫畫,天天給我介紹,好煩~ 現在是2022年9月15日16點30,於是我決定, 五點下班前寫個代碼把她說的漫畫全部爬下來,應付一下~ 再發篇文章揭露她的罪惡,嘿嘿~ 準備事項 環境使用 Python 3.8 Pycharm 2021.2版本 模塊使用 impor ...
  • 現在我們就開始更加深入的學習了,今天我們要學習的是多對一的處理。 在正式開始之前我們需要做一些準備工作。 一、在資料庫建立兩張新的表並插入數據 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NUL ...
  • Java坦克大戰07 8.IO流應用02 8.3記錄退出游戲時敵人坦克坐標/方向,存檔退出 8.3.1思路分析 在Recorder類中,增加一個Vector集合,用來接收從MyPanel類中傳入的enemyTanks集合,在記錄時遍歷集合,將還存活的敵人坦克的方向和坐標逐一取出並保存 8.3.2代碼 ...
  • 整理:四猿外 以下排序是按照從技術組件到開發框架到代碼工具,也有一些實在不好分類的,就放到最後了。 WEB 容器 Tomcat https://tomcat.apache.org/ Jetty https://www.jetty.com/ JBoss https://www.jboss.org/ R ...
  • 前言 嗨嘍~大家好呀,這裡是魔王吶 ! 開發環境以及模塊的使用: python 3.6 pycharm requests >>> pip install requests os 內置模塊 不需要安裝的 整體流程: 代碼 import requests # 第三方模塊 pip install requ ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...