python采集當當網商品數(shù)據(jù)信息并作可視化效果

前言

嗨嘍~大家好呀,這里是魔王吶 ? ~!

看了標題格遭,大家應該都知道我們本期的目的了

沒錯哈街!就是采集當當網數(shù)據(jù)并作可視化

話不多說,我們抓緊開始正文吧~

環(huán)境使用:

在開始之前拒迅,安裝好我們的代碼編輯器和環(huán)境是非常重要的

  • Python 3.8

  • pycharm --> 編輯器

  • jupyter notebook --> 數(shù)據(jù)分析編輯器

模塊使用:

  • requests >>> pip install requests 數(shù)據(jù)請求

  • parsel >>> pip install parsel 數(shù)據(jù)解析

  • csv <表格文件> 內置模塊 保存數(shù)據(jù)

安裝第三方模塊方法:win + R 輸入cmd 輸入安裝命令 pip install 模塊名

(如果你覺得安裝速度比較慢, 你可以切換國內鏡像源)

案例基本思路:

  1. 明確需求 <完成>

    明確采集的網站是什么?

    明確采集的數(shù)據(jù)是什么?

  2. 發(fā)送請求, 模擬瀏覽器對url地址發(fā)送請求

  3. 獲取數(shù)據(jù), 獲取網頁源代碼

  4. 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內容 <書籍基本信息>

  5. 保存數(shù)據(jù), 保存表格文件里面

需用到知識點:

基礎知識點:

  1. open文件操作 保存

  2. for循環(huán)

  3. 字典創(chuàng)建

  4. 函數(shù)關鍵傳參

  5. print輸出函數(shù)

采集知識點:

  1. requests簡單使用

  2. parsel css選擇器

  3. csv 數(shù)據(jù)持久化

采集代碼展示:

導入模塊

# 導入數(shù)據(jù)請求模塊 --> 第三方模塊, 需要安裝 pip install requests
import requests
# 導入數(shù)據(jù)解析模塊 --> 第三方模塊, 需要安裝 pip install parsel
import parsel
# 導入csv模塊
import csv

采集多頁

for page in range(1, 26):
    # 請求鏈接
    url = f'http://*****.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-{page}'

偽裝瀏覽器

    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'
    }

發(fā)送請求

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

<Response [200]> 響應對象

Response中文意思就是響應

<> 表示對象 200 狀態(tài)碼 表示請求成功

把獲取下來html字符串數(shù)據(jù)<response.text>, 轉成可解析對象

    selector = parsel.Selector(response.text)

返回列表, 列表里面元素都是選擇器對象 <每一個li標簽的對象>

    lis = selector.css('.bang_list_mode li')

for循環(huán)遍歷, 把列表里面元素一個一個提取出來

"""

提取數(shù)據(jù)具體內容:

標題 價格 出版社...

"""

    for li in lis:
        title = li.css('.name a::attr(title)').get()  # 標題
        comment = li.css('.star a::text').get()  # 評論
        recommend = li.css('.tuijian::text').get()  # 推薦
        writer = li.css('.publisher_info a::attr(title)').get()  # 作者
        date = li.css('.publisher_info span::text').get()  # 日期
        publisher = li.css('div:nth-child(6) a::text').get()  # 出版社
        price_n = li.css('.price .price_n::text').get()  # 售價
        price_r = li.css('.price .price_r::text').get()  # 原價
        price_s = li.css('.price .price_s::text').get()  # 折扣
        price_e = li.css('.price_e .price_n::text').get()  # 電子書
        href = li.css('.name a::attr(href)').get()  # 詳情頁
        dit = {
            '標題': title,
            '評論': comment,
            '推薦': recommend,
            '作者': writer,
            '日期': date,
            '出版社': publisher,
            '售價': price_n,
            '原價': price_r,
            '折扣': price_s,
            '電子書': price_e,
            '詳情頁': href,
        }
        csv_writer.writerow(dit)
        # print(title, comment, recommend, writer, date, publisher, price_n, price_r, price_s, price_e, href)
        print(dit)

創(chuàng)建文件

f = open('書籍25.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '標題',
    '評論',
    '推薦',
    '作者',
    '日期',
    '出版社',
    '售價',
    '原價',
    '折扣',
    '電子書',
    '詳情頁',
])
csv_writer.writeheader()

數(shù)據(jù)可視化代碼:

1.導入模塊

import pandas as pd
from pyecharts.charts import *
from pyecharts.globals import ThemeType#設定主題
from pyecharts.commons.utils import JsCode
import pyecharts.options as opts

2.導入數(shù)據(jù)

df = pd.read_csv('data.csv', encoding='utf-8', engine='python')
df.head()

3.數(shù)據(jù)處理

df['書名'] = df['書名'].apply(lambda x:x.split('(')[0])
df.head()
df['書籍簡介'] = df['書名'].str.extract('.*?((.*?))')
df['書籍簡介'].fillna('無', inplace=True)
df.head(1)

提取評論數(shù)

data = df.apply(lambda x:x['評論'].split('條評論')[0], axis=1)
df['評論數(shù)'] = data.astype('int64')
df.head(1)

原價骚秦、售價、電子書價格 數(shù)值化

df['原價'] = df['原價'].str.replace('¥', '')
df['售價'] = df['售價'].str.replace('¥', '')
df['電子書價格'] = df['電子書'].str.replace('¥', '')
df.head(1)
df.info()
df['原價'] = df['原價'].str.replace(',', '').astype('float64')
df['售價'] = df['售價'].str.replace(',', '').astype('float64')

選擇需要用到的列

df = df[['書名','書籍簡介','評論','作者','日期','出版社','原價','售價','電子書']]
df.head(1)

缺失值

df.isnull().sum()
df['作者'].fillna('未知', inplace=True)
df['出版社'].fillna('未知', inplace=True)
df.isnull().sum()

電子書價格列額外處理

# df['電子書'] = df['電子書'].str.replace(',', '').replace('¥', '').astype('float64')
df['電子書'].fillna('無電子書版本', inplace=True)

重復值

df.duplicated().sum()
df.info()
df.describe()

4. 可視化

電子書版本占比

per = df['電子書'].value_counts()['無電子書版本']/len(df)
c = (
    Liquid()
    .add("lq", [1-per], is_outline_show=False)
    .set_global_opts(title_opts=opts.TitleOpts(title="電子書版本占比"))
)
c.render_notebook()
from pyecharts import options as opts
from pyecharts.charts import Bar


c = (
    Bar()
    .add_xaxis(x)
    .add_yaxis(','.join(x), y)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="", subtitle=""),
    )
)
c.render_notebook()
import pyecharts.options as opts
from pyecharts.charts import Pie

"""
Gallery 使用 pyecharts 1.1.0
參考地址: https://echarts.apache.org/examples/editor.html?c=pie-doughnut

目前無法實現(xiàn)的功能:

1璧微、迷之顏色映射的問題
"""
content = df['出版社'].value_counts()
# x = content.index.tolist()[:10]
# y = content.values.tolist()[:10]

x_data = content.index.tolist()[:10]
y_data = content.values.tolist()[:10]
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="1600px", height="800px", bg_color="#2c343c"))
    .add(
        series_name="訪問來源",
        data_pair=data_pair,
        rosetype="radius",
        radius="55%",
        center=["50%", "50%"],
        label_opts=opts.LabelOpts(is_show=False, position="center"),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="前10出版社, 書籍占比",
            pos_left="center",
            pos_top="20",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
        ),
        legend_opts=opts.LegendOpts(is_show=False),
    )
    .set_series_opts(
        tooltip_opts=opts.TooltipOpts(
            trigger="item", formatter="{a} <br/>作箍: {c} (77rj6dj%)"
        ),
        label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"),
    )
    
)
c.render_notebook()
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
content = df['出版社'].value_counts()  # 讀取出版社的數(shù)據(jù)
x_data = content.index.tolist()[:10]
y_data = content.values.tolist()[:10]
data_pair = [list(z) for z in zip(x_data, y_data)]
data_pair
# x_data = content.index.tolist()[:10]  # 
# y_data = content.values.tolist()[:10]
# data_pair = [list(z) for z in zip(x_data, y_data)]
c = (
    Pie()
    .add(
        "",
        data_pair,
        radius=["40%", "75%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="出版社前10名"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}"))
    
)
c.render_notebook()

尾語 ??

要成功前硫,先發(fā)瘋蒙揣,下定決心往前沖!

學習是需要長期堅持的开瞭,一步一個腳印地走向未來!

未來的你一定會感謝今天學習的你罩息。

—— 心靈雞湯

本文章到這里就結束啦~感興趣的小伙伴可以復制代碼去試試哦 ??

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嗤详,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瓷炮,更是在濱河造成了極大的恐慌葱色,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘香,死亡現(xiàn)場離奇詭異苍狰,居然都是意外死亡办龄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門淋昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俐填,“玉大人,你說我怎么就攤上這事翔忽∮⑷冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵歇式,是天一觀的道長驶悟。 經常有香客問我,道長材失,這世上最難降的妖魔是什么痕鳍? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮龙巨,結果婚禮上笼呆,老公的妹妹穿的比我還像新娘。我一直安慰自己恭应,他們只是感情好抄邀,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昼榛,像睡著了一般境肾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胆屿,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天奥喻,我揣著相機與錄音,去河邊找鬼非迹。 笑死环鲤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的憎兽。 我是一名探鬼主播冷离,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纯命!你這毒婦竟也來了西剥?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤亿汞,失蹤者是張志新(化名)和其女友劉穎瞭空,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡咆畏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年南捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旧找。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡溺健,死狀恐怖,靈堂內的尸體忽然破棺而出钦讳,到底是詐尸還是另有隱情矿瘦,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布愿卒,位于F島的核電站缚去,受9級特大地震影響,放射性物質發(fā)生泄漏琼开。R本人自食惡果不足惜易结,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柜候。 院中可真熱鬧搞动,春花似錦、人聲如沸渣刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辅柴。三九已至箩溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碌嘀,已是汗流浹背涣旨。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留股冗,地道東北人霹陡。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像止状,于是被迫代替她去往敵國和親烹棉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容