1.數(shù)據抓取
數(shù)據集的獲取是我們進行數(shù)據分析的第一步?,F(xiàn)在獲取數(shù)據的主要途徑一般為:現(xiàn)成數(shù)據;自己寫爬蟲去爬取數(shù)據;使用現(xiàn)有的爬蟲工具爬取所需內容,保存到數(shù)據庫,或以文件的形式保存到本地。
推薦閱讀:Python 靜態(tài)爬蟲、Python Scrapy網絡爬蟲
爬蟲的設計思路
- 首先確定需要爬取網頁 URL 地址
- 通過 HTTP/HTTPS 協(xié)議來獲取相應的 HTML 頁面
- 提取 HTML 頁面里有用的數(shù)據
a. 如果是需要的數(shù)據就保存起來
b. 如果是頁面里的其他 URL,那就繼續(xù)執(zhí)行第二步。
爬蟲基本流程
發(fā)起請求 通過HTTP庫向目標站點發(fā)起請求,就是發(fā)送一個 Request,請求可以包含額外的 header 等信息,等待服務器的響應 獲取響應內容 如果服務器正常響應,會得到一個 Reponse, Reponse 的內容便是所要獲取的頁面內容,類型可能有 HTML,json 字符串,二進制數(shù)據(如圖片視頻)等類型。 解析內容 得到的內容可能是 HTML,可以用正則表達式,網頁解析庫進行解析,可能是 json,可以直接轉為 JSON 解析對象解析,可能是二進制數(shù)據,可以做保存或者進一步處理。 保存數(shù)據保存的形式多種多樣,可以保存成文本,也可以保存到數(shù)據庫,或者保存特定格式文件
反爬蟲機制與對策
機制
- 通過分析用戶請求的Headers信息進行反爬蟲。網站中應用的最多
- 通過驗證用戶行為進行反爬蟲,不如通過判斷同一個ip在短時間內是否頻繁訪問對應網站等進行分析。
- 通過動態(tài)頁面增加爬取的難度,達到反爬蟲目的。
對策
- 在爬蟲中構造這些用戶請求的 headers 信息,以此將爬蟲偽裝成瀏覽器
- 使用代理服務器并經常切換代理服務器方式,一般就能夠攻克限制。
- 利用一些軟件,比如selenium+phantomJS就可以攻克 反爬蟲的手段 :user-agent、代理、驗證碼、動態(tài)數(shù)據加載、加密數(shù)據
數(shù)據的選擇與處理
- 網頁文本,如HTML文檔 json格式文本 ;
- 圖片,獲取到的是二進制文件保存為圖片格式 ;
- 視頻 獲取的二進制文件保存為視頻格式即可;
- 其他 只要能請求到的,都能獲取 。
解析方式
- 直接處理
- json解析
- 正則表達式
- BeautifulSoup
- PyQuery
- XPath
2. 數(shù)據清洗
數(shù)據得到手,我們就需要對我們爬取的數(shù)據進行清洗工作,為之后的數(shù)據分析做鋪墊,如果清洗的不到位勢必會對之后的數(shù)據分析造成影響。 下文將從數(shù)據格式統(tǒng)一、空值處理。
格式統(tǒng)一
去掉數(shù)據的空格中,在用爬蟲進行數(shù)據爬取時用 strip() 對爬取的字符串進行處理,將中文數(shù)據轉換為阿拉伯數(shù)字。
例如1.7萬變成17000,代碼如下:
def get_int(s):
if s[-1]=="萬":
s=s[0:-1]
s=int(float(s)*10000)
else:
s=int(s)
return s
運行結果如下
if __name__ == '__main__':
s="1.2萬"
price = get_int(s)
print(price)#12000
空值處理
用爬蟲對數(shù)據爬取的時候,若爬取的值不存在會報錯,用異常處理語句 try{} except: pass (try 為爬取視頻信息的代碼),跳過不存在的視頻信息數(shù)據。
try:
html=requests.get(Link).text
doc=BeautifulSoup(html);
List=doc.find('div',{'class':'ops'}).findAll('span')
like=List[0].text.strip()#點贊
like=self.getint(like)
coin=List[1].text.strip()#投幣
coin=self.getint(coin)
collection=List[2].text.strip()#收藏
collection=self.getint(collection)
print('點贊',like)
print('投幣',coin)
print('收藏',collection)
# #將數(shù)據 拼合成字典
data={
'Title':Title,
'link':Link,
'Up':Up,
'Play':Play,
'Like':like,
'Coin':coin,
'Collection':collection,
}
# 存儲到csv文件
self.write_dictionary_to_csv(data,'blibli2.csv')
pass
except:
pass
3.數(shù)據分析及可視化
表格參數(shù)信息如圖
對視頻排放量進行分析
對 B 站熱門播放量進行分析,對 2020 年熱門視頻的播放量分為 4 個等級 一千萬排放量以上為一個等級 五百萬到一千萬播放量為一個等級 五百萬到一百萬播放量為一個等級 一百萬播放量以下為一個等級
l1=len(data[data['Play'] >= 10000000])
l2=len(data[(data['Play'] < 10000000) & (data['Play'] >=5000000)])
l3=len(data[(data['Play'] < 5000000) & (data['Play'] >=1000000)])
l4=len(data[data['Play'] < 1000000])
再數(shù)據通過 matplotlib 庫進行可視化。得到下圖。
plt.figure(figsize=(9,13)) #調節(jié)圖形大小
labels = ['大于一千萬','一千萬到五百萬','五百萬到一百萬','小于一百萬'] #定義標簽
sizes = [l1, l2, l3, l4] #每塊值
colors = ['green', 'yellow', 'blue', 'red'] #每塊顏色定義
explode = (0,0,0,0) #將某一塊分割出來,值越大分割出的間隙越大
# 中文亂碼和坐標軸負號處理
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
patches,text1,text2 = plt.pie(sizes,
explode=explode,
labels=labels,
colors=colors,
autopct = '%3.2f%%', #數(shù)值保留固定小數(shù)位
shadow = False, #無陰影設置
startangle =90, #逆時針起始角度設置
pctdistance = 0.6) #數(shù)值距圓心半徑倍數(shù)距離
#patches餅圖的返回值,texts1餅圖外label的文本,texts2餅圖內部的文本
# x,y軸刻度設置一致,保證餅圖為圓形
plt.axis('equal')
plt.title("B站熱門播放量分布圖")
plt.legend() # 右上角顯示
plt.show()
從圖中可以看出,在 B 站能上每周必看熱門推薦的視頻播放量大部分在五百萬到一百萬播放量,低于一百萬播放量的視頻很難上每周必看熱門推薦,而一年中播放量達到于一千萬的視頻也很少。 讓我們一起看看播放量排名前 10 的視頻是那些好看的視頻
data.nlargest(10,columns='Play')
再數(shù)據通過 matplotlib 庫進行可視化。得到下圖。
d.plot.bar(figsize = (10,8),x='Title',y='Play',title='Play top 10')
plt.xticks(rotation=60)#夾角旋轉60度
plt.show()
從圖中可以看出嗶哩嗶哩拜年祭最受歡迎且播放量遠遠高于其它視頻,說明B站2020年拜年祭節(jié)目進行的比較成功。
對作者進行分析
通過數(shù)據分析看那個作者的作品上熱門次數(shù)最多,從而判斷那個作者在2020年中最受歡迎。 對作者進行劃分,統(tǒng)計出現(xiàn)的次數(shù)
d2=data.loc[:,'Up'].value_counts()
d2=d2.head(10)
再數(shù)據通過 matplotlib 庫進行可視化。得到下圖。
d2.plot.bar(figsize = (10,8),title='UP top 10')
plt.show()
說明 B 站上每周熱門次數(shù)最多的作者是涼風 Kaze,一年 52 周熱門推薦,一共出現(xiàn)了 48 次,幾乎每周熱門都有他的視頻出現(xiàn)。從數(shù)據來看,2020 年最受歡迎的作者是涼風 Kaze。
對視頻參數(shù)分析
對熱門視頻的點贊,投幣,收藏平均比例進行分析
data['點贊比例'] = data['Like'] /data['Play']
data['投幣比例'] = data['Coin'] /data['Play']
data['收藏比例'] = data['Collection'] /data['Play']
d3=data.iloc[:,8:11]
d3=d3.mean()
再數(shù)據通過 matplotlib 庫進行可視化。得到下圖。
d3.plot.bar(figsize = (10,8),title='UP top 10')
plt.show()
2020年中點贊比例最高,達到大約9%。說明在B站看視頻的人,平均10個人中才會有一個人點贊。而平均平均20個人中才會有一個人對視頻進行投幣。
對標題進行分析
對標題高頻次進行提取,看那類標題比較受歡迎 首先對所有標題進行遍歷,儲存在字符串s中
d4=data['Title']
s=''
for i in d4:
s=s+i
然后用詞云進行可視化
標題中帶有“朱一旦,半佛,羅翔”等作者名或“英雄聯(lián)盟,原神”等游戲熱門視頻比較多。