Python學習:爬蟲示例

本篇是在學習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學習者聚集地

發佈了54 篇原創文章 · 獲贊 68 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章