1. 程式人生 > 實用技巧 >Python爬蟲是怎麼實現的,它的原理是什麼?

Python爬蟲是怎麼實現的,它的原理是什麼?

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲 作者:梧雨北辰

( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )

本篇是在學習Python基礎知識之後的一次小小嚐試,這次將會爬取熊貓TV網頁上的王者榮耀主播排名,在不借助第三方框架的前提下演示一個爬蟲的原理。

一、實現Python爬蟲的思路

第一步:明確目的

1.找到想要爬取資料的網頁
2.分析網頁結構,找到需要爬取資料所在的標籤位置

第二步:模擬Http請求,提取資料,加工資料

1.模擬Http網路請求,向伺服器傳送請求,獲取伺服器返回給我們的html
2.使用正則表示式從Html中提取我們需要的資料(比如本例中的主播名字和人氣)
3.對提取的資料進行加工,顯示成我們可以直觀檢視的形式

二、檢視網頁原始碼,觀察關鍵值

我們應該首先找到需要處理的網頁,即:某貓TV網頁上的王者農藥,然後檢視這個網頁的原始碼,觀察我們需要關注的資料在哪個位置,下面是擷取的網頁效果圖:

網頁.png

然後,我們需要在瀏覽器中檢視當前網頁的Html原始碼,不同的瀏覽器中檢視的操作會有所不同,這個需要自行百度一下。此次我們需要拿到每個主播的名字和視訊瀏覽量,從下面原始碼中我們可以很快發現這些關鍵資料的位置,如圖中的標註:

Html原始碼.png

三、實現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 number 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()

然後,我們將看到如下的列印效果:

執行爬蟲.png