本篇是在學習Python基礎知識之後的一次小小嚐試,這次將會爬取熊貓TV網頁上的王者榮耀主播排名,在不借助第三方框架的情況下演示一個爬蟲的原理。
一、實現Python爬蟲的思路
第一步:明確目的
1.找到想要爬取數據的網頁
2.分析網頁結構,找到需要爬取數據所在的標籤位置
第二步:模擬Http請求,提取數據,加工數據
1.模擬Http網絡請求,向服務器發送請求,獲取服務器返回給我們的html
2.使用正則表達式從Html中提取我們需要的數據(比如本例中的主播名字和人氣)
3.對提取的數據進行加工,顯示成我們可以直觀查看的形式
二、查看網頁源碼,觀察關鍵值
我們應該首先找到需要處理的網頁,即:熊貓TV網頁上的王者榮耀,然後查看這個網頁的源代碼,觀察我們需要關注的數據在哪個位置,下面是我們截取的網頁效果圖:
然後,我們需要在瀏覽器中查看當前網頁的Html源碼,不同的瀏覽器中查看的操作會有所不同,這個需要自行百度一下。此次我們需要找到每個主播的名字和視頻的瀏覽量,從源碼中我們可以很快發現這些關鍵數據的位置如圖中的標註:
三、實現Python爬蟲的具體實踐
下面就是實現爬取數據的具體操作了,這裏是創建了一個爬蟲類Spider,然後使用不同的正則獲取Html標籤裏的數據,進而將其重新整理後打印顯示,具體的代碼如下:
from urllib import request #導入模塊urllib,用於發起網絡請求,獲取數據
import re #導入模塊re,用於實現正則提取信息
class Spider():
#需要抓取的網絡鏈接
url = "https://www.panda.tv/cate/kingglory"
#正則:獲取顯示視頻信息的div代碼串
reString_div = '<div class="video-info">([\s\S]*?)</div>'
#正則:獲取主播名
reString_name = '</i>([\s\S]*?)</span>'
#正則:獲取視頻瀏覽量
reString_number = '<span class="video-number">([\s\S]*?)</span>'
def __fetch_content(self):
'''
這裏是方法註釋
請求網絡,獲取整個網頁的Hmtl字符串
'''
r = request.urlopen(Spider.url)
data = r.read()
htmlString = str(data,encoding="utf-8")
return htmlString
def __alalysis(self,htmlString):
'''
使用正則初步獲取數據,得到主播信息(主播名和瀏覽量)的數組
'''
videoInfos = re.findall(Spider.reString_div,htmlString)
anchors = []
#print(videoInfos[0])
for html in videoInfos :
name = re.findall(Spider.reString_name,html)
number = re.findall(Spider.reString_number,html)
anchor = {"name":name,"number":number}
anchors.append(anchor)
#print(anchors[0])
return anchors
def __refine(self,anchors):
'''
將數據進一步提煉,去除空格等多餘字符
'''
f = lambda anchor :{"name":anchor["name"][0].strip(),"number":anchor["number"][0]}
newAnchors = list(map(f,anchors))
#print(newAnchors)
return newAnchors
def __sort(self,anchors):
'''
數據分析:排序瀏覽量從大到小
'''
anchors = sorted(anchors,key=self.__sort_seed,reverse = True)
return anchors
def __sort_seed(self,anchor):
'''
排序規則
'''
list_nums = re.findall('\d*',anchor["number"])
number = float(list_nums[0])
if '萬' in anchor["number"]:
number = number * 10000
return numbe
def __show(self,anchors):
'''
展示數據,將已經排序好的數據打印出來
'''
for rank in range(0,len(anchors)):
print("第" + str(rank+1) +"名:" + anchors[rank]["number"] + "\t" + anchors[rank]["name"])
def startRun(self):
'''
程序入口,開始運行爬蟲
'''
htmlString = self.__fetch_content()
anchors = self.__alalysis(htmlString)
anchors = self.__refine(anchors)
anchors = self.__sort(anchors)
self.__show(anchors)
#創建爬蟲類,爬取數據
spider = Spider()
spider.startRun()
推薦我們的Python學習扣qun:784758214 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地