前言
嗨嘍~大家好呀,這里是魔王吶 ? ~!
看了標題格遭,大家應該都知道我們本期的目的了
沒錯哈街!就是采集當當網數(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 模塊名
(如果你覺得安裝速度比較慢, 你可以切換國內鏡像源)
案例基本思路:
-
明確需求 <完成>
明確采集的網站是什么?
明確采集的數(shù)據(jù)是什么?
發(fā)送請求, 模擬瀏覽器對url地址發(fā)送請求
獲取數(shù)據(jù), 獲取網頁源代碼
解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內容 <書籍基本信息>
保存數(shù)據(jù), 保存表格文件里面
需用到知識點:
基礎知識點:
open文件操作 保存
for循環(huán)
字典創(chuàng)建
函數(shù)關鍵傳參
print輸出函數(shù)
采集知識點:
requests簡單使用
parsel css選擇器
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ā)瘋蒙揣,下定決心往前沖!
學習是需要長期堅持的开瞭,一步一個腳印地走向未來!
未來的你一定會感謝今天學習的你罩息。
—— 心靈雞湯
本文章到這里就結束啦~感興趣的小伙伴可以復制代碼去試試哦 ??