当当网Python图书数据分析
【說明:可以從項目的背景、項目的具體內容、涉及到的相關技術、實施流程、項目的目標或意義進行描述】
1. 從當當網獲取Python有關的圖書的數據
2. 對數據進行存儲、清洗、整理
3. 分析圖書價格分布、出版社分布、評論數量前10的圖書、評論詞云統(tǒng)計
【說明:數據來源即數據獲取的網站、URL;若是已有的數據集,要說明數據集的來源位置】
URL:http://search.dangdang.com/?key=Python&act=input&page_index=%d
【說明:數據集中的數據描述,包括幾個數據文件,具體數據項及數據類型,數據量等等】
【說明:2.3僅針對需要進行“數據采集”來獲取的數據源,描述數據源獲取的流程或算法】
利用Scrapy框架對當當網進行爬取
【說明:項目具體實施的相關技術,例如對數據進行聚類分析,此部分對聚類算法理論進行基礎論述】
【說明1:具體的方案的實施,例如對數據進行聚類分析,從具體實現(xiàn)的角度去描述如何取做的,例如:如何進行數據表示,采用什么庫或技術等等】
【說明2:根據項目的具體任務,設置3.2.1,3.2.2標題,分小節(jié)進行說明】
對當當網Python圖書數據進行爬取,并儲存為csv文件
?
?
?
?
?
首先讀取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)]
????????
????????# 是否展示成南丁格爾圖,通過半徑區(qū)分數據大小,有'radius'和'area'兩種模式。
????????# radius:扇區(qū)圓心角展現(xiàn)數據的百分比,半徑展現(xiàn)數據的大小
????????# area:所有扇區(qū)圓心角相同,僅通過半徑展現(xiàn)數據大小
????????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),
????)
????
????# 系統(tǒng)配置項
????.set_series_opts(
????????# 設置提示框
????????tooltip_opts=opts.TooltipOpts(
????????????trigger="item", formatter="{a} <br/>: {c} (ozvdkddzhkzd%)"
????????),
????????label_opts=opts.LabelOpts(color="#3333FF"),
????)
????.render("dangdangtushu_money.html")
)
讀取后用set函數進行去重處理,統(tǒng)計出版社出版書籍數量
?
代碼如下:
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評論詞云統(tǒng)計
1.找到目標的url
?
2.檢查響應結果
前三頁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對結果無影響,因此不做考慮。
?
實現(xiàn)代碼:
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'
????????}
????????# 發(fā)送請求,獲取響應
????????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文件
?
繪制詞云圖
?
實現(xiàn)代碼: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、結巴分詞,默認精確模式??梢蕴砑幼远x詞典userdict.txt,然后jieba.load_userdict(file_name) ,file_name為文件類對象或自定義詞典的路徑
# 自定義詞典格式和默認詞庫dict.txt一樣,一個詞占一行:每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開,順序不可顛倒
cut_text= jieba.cut(text)
result = "/".join(cut_text) ?# 必須給個符號分隔開分詞結果來形成字符串,否則不能繪制詞云
# print(result)
# 3、生成詞云圖,這里需要注意的是WordCloud默認不支持中文,所以這里需已下載好的中文字庫
# 無自定義背景圖:需要指定生成詞云圖的像素大小,默認背景顏色為黑色,統(tǒng)一文字顏色: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:對實驗結果進行性能分析;若是多個算法可以進行結果對比分析】
【說明2:采用可視化的形式對項目的分析結果或執(zhí)行結果進行展示】
【說明3:自行設計三級小標題,采用“標題3”的排版格式】
??圖書價格分析可視化展示?:
?
出版社分布可視化分析展示:
?
評論數量前十的圖書可視化展示:
?
評論詞云統(tǒng)計可視化展示:
?
【說明:對該項目進行總結說明,對項目中實現(xiàn)的功能,遇到的問題,解決方案,有待進一步完善提升的方面進行總結】
Python作為時下流行的編程語言,以高度的封裝性、靈活性、豐富的第三庫資源,在數據分析領域中占據著重要的地位。python的應用領域廣泛,包括系統(tǒng)運維、科學計算、人工智能、網絡編程(如搜索引擎、爬蟲、服務器編程)、web開發(fā)、云計算系統(tǒng)、圖形化、教育等。
????????在大數據時代, 網絡爬蟲技術可以有效準確地抓取目標數據, 可以為我們節(jié)省大量的資源, 對信息檢索起著十分重要的作用。基于Python的網絡爬蟲技術, 具有很高的前瞻性, 有一定的研究價值。即上部分提到的http Response結果。這個結果中就包含Cookie, 后續(xù)的訪問就可以利用它來實現(xiàn)模擬登錄。
????????在當今數據大爆發(fā)的時代, 通過爬蟲快速的從互聯(lián)網中爬行所需要的信息顯得格外重要。在數據爬蟲方面,利用rullib、requests、BeautifulSoup、re、Scrapy等模塊進行爬取想要的網站資料,如搜房、淘寶、京東、微信、今日頭條、中國知網、新浪、貼吧、金融界、電影論壇等等;Python在爬蟲應用中充當了重要的角色。豐富的第三方庫讓開發(fā)變得簡單易用。實例證明應用Python語言可以方便地實現(xiàn)深度網絡爬蟲和聚焦型網絡爬蟲相結合的爬蟲程序, 將網絡中的大數據進行整合, 讓大數據更方便的服務于其他應用程序。
總結
以上是生活随笔為你收集整理的当当网Python图书数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据面试知识点
- 下一篇: python实现视频剪切与拼接