起點中文網月票榜爬取及數據分析
1. 數據爬取
數據爬取就是通過網絡爬蟲程序來獲取需要的網站上的內容信息,比如文字、視頻、圖片等數據。網絡爬蟲(網頁蜘蛛)是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。一般是通過網頁的url獲取網頁的源代碼中,從源代碼中提取需要的信息。
1.1.1 准備
運行cmd命令,通過 pip install +庫名 或者pip3 install +庫名,安裝好需要的庫,做好准備后即可開始爬取操作。
需要爬取的網頁為 https://www.qidian.com/rank/yuepiao?style=2
1.1.2 網頁分析
由上圖可知,該榜中需要的爬取的有用信息為類名、書名、最新章節、月票數、小說作者、更新的時間、小說簡介以及周票數和打賞人數。
1.1.3 層次爬取
html=requests.get(url)
#爬取月票的html文件
html.encoding='UTF-8'
#該網頁的編碼格式為UTF-8
doc=BeautifulSoup(html.text,'lxml')
#轉換為BeautifulSoup對象
排行榜總共有兩頁,先得到頁數,方便后續的訪問。先得到前50名上榜書籍,排行榜上能夠獲取到的信息:
page=doc.find('div',class_="pagination fr")['data-pagemax']
#獲取網頁最大頁碼
list1=doc.find('table',class_='rank-table-list hot-new').find('tbody').find_all('tr')
#找出每款書在該頁面的信息塊
for x in list1:
#通過循環對每款書的信息進行提取
name=x.find('a',class_='name').text.strip()
#取出書名
#strip() 方法用於移除字符串頭尾指定的字符(默認為空格或換行符)或字符序列。
infrom='https:'+x.find('a',class_='name')['href']
#規范url格式,方便進行下一步的深度爬取
author=x.find('a',class_='author').text.strip()
#爬取作者
booktype=x.find('a',class_='type').text.strip()
#文本分類
month=x.find(class_='month').text
#月票數量
time=x.find(class_='time').text
#上傳日期
new=x.find('a',class_='chapter').text
#最新章節名稱
然后爬取每本上榜作品的詳細信息
html1=requests.get(infrom)
#爬取第二層的html文件
html1.encoding='UTF-8'
#該網頁的編碼格式為UTF-8
doc1=BeautifulSoup(html1.text,'lxml')
list1 = doc1.find('div',class_="book-intro")
bookIntrodaction = list1.find("p").text.strip()
#獲取小說簡介
listt2=doc1.find(class_="fans-interact cf")
monthTickets=listt2.find(class_ ='ticket month-ticket').find(class_ = 'num').text
#小說月票
weekTickets=listt2.find(class_ ='ticket rec-ticket hidden').find(class_ = 'num').text
#小說周票
people=listt2.find(class_= 'rewardNum').text
#小說本周打賞人數
經過以上操作后前50名的信息就獲取成功了!!
1.1.4 數據存儲
將爬取到的信息存入到csv文件中,方便后續的可視化分析。
file_exists = os.path.isfile('bookRooking.csv')
#判斷是否為文件
with open('bookRooking.csv','a',encoding='utf-8',newline='') as f:
#newline = "" 表示讀取的換行符保持不變,原來是啥,讀出來還是啥
headers=data.keys()
#找出data的所有的鍵
w =csv.DictWriter(f,delimiter=',',lineterminator='\n',fieldnames=headers)
#創建一個對象
if not file_exists :
w.writeheader()
#第一次寫入數據先寫入表頭
w.writerow(data)
#單行寫入
print('當前行寫入csv成功!')
此處判斷是否為文件,能夠有效的防止后面輸出的表頭不會重復。只有非表頭的情況可以寫入。
2. 數據分析及可視化
利用csv文件對每個類型書籍的周票均值、月票均值、總共的打賞值繪制折線圖,可以一眼出周票、月票、以及打賞最多的類型的書籍。
plt.rcParams['font.sans-serif'] = ['SimHei']
#解決橫坐標不能顯示中文的況
plt.rcParams['axes.unicode_minus'] = False
#解決橫坐標不能顯示中文的情況
y1 = data.groupby('類型').sum()['本周打賞人數']
#求和
y2 = data.groupby('類型').mean()['周票']
#求平均值
y3 = data.groupby('類型').mean()['月票']
#求平均值
x=list(dict(y1).keys())
#橫坐標值
fig = plt.figure(figsize=(8,6), dpi=100)
#指定畫布大小
plt.plot(x,y1,c='red',label='打賞票和')
#指定折線的顏色和標簽
plt.plot(x,y2,c='yellow',label='周票均值')
plt.plot(x,y3,c='blue',label='月票均值')
plt.legend(loc='upper left')#標簽靠左
plt.title("小說票數折線圖")#圖名
plt.xlabel('小說類型',fontsize=15)
由上圖可以得知仙俠類型的書籍得到的周票和月票均值是最高的其次是玄幻類型的,且玄幻得到打賞的票數最多,軍事類型的書籍較少。
利用柱狀圖能夠的出項成績的具體數據。
plt.rcParams['figure.figsize']=(8,3)#圖形大小
data.groupby(['類型']).mean().plot(kind = 'bar')
plt.xticks(rotation=0)#橫坐標的角度
plt.ylabel('總票數',fontsize = 15)#縱坐標名
plt.xlabel('小說類型',fontsize = 15)#橫坐標名
可以看出一周中給出打賞的人占極少數,月票甚至比周榜的人數還少。
通過餅狀圖可以看清楚在整體中所占的比重。
sizes = []
for booktype in x:#x是上文折線圖中橫坐標,即小說所有的類型。
bookTypeNum=len(data[data['類型']==booktype])#獲取各種小說的數量
sizes.append(bookTypeNum)
plt.figure(figsize=(20,20)) #調節圖形大小
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.pie(
sizes,
labels=x,#指定顯示的標簽
autopct='%1.1f%%'#數據保留固定小數位
)
plt.axis('equal')# x,y軸刻度設置一致#本文中可以不用
plt.title('小說類型受歡迎的分布圖比')
plt.legend(loc='upper left')# 左上角顯示
由此可以玄幻和都市類型的小說是現在網絡小說最受歡迎的類型,兩種占據了40%的比重。