12谷羞、實(shí)戰(zhàn):原生爬蟲

目標(biāo):爬取熊貓TV某個(gè)分類下面主播的人氣排行

分析網(wǎng)站結(jié)構(gòu)

  1. 使用Chrome瀏覽器
  2. F12查看HTML信息段直,Ctrl+Shift+C鼠標(biāo)選取后找到對應(yīng)的HTML。
  3. 文本分析并提取信息——正則表達(dá)式括丁。

搜索引擎,今日頭條等app本質(zhì)上的技術(shù)就是爬蟲

設(shè)計(jì)步驟:

  1. 明確目的
  2. 找到數(shù)據(jù)對應(yīng)網(wǎng)頁
  3. 分析網(wǎng)頁的結(jié)構(gòu)伶选,找到數(shù)據(jù)所在標(biāo)簽的位置
  4. 模擬HTTP請求史飞,向服務(wù)器發(fā)送請求,獲取到服務(wù)器返回給我們的HTML
  5. 用正則表達(dá)式提取我們要的數(shù)據(jù)
  6. 處理數(shù)據(jù)

HTML結(jié)構(gòu)分析基本原則

1. 尋找到標(biāo)簽仰税、標(biāo)識符构资,使之能夠定位要抓取的信息
  • 盡量選取具有唯一性的標(biāo)簽
  • 盡量選取最接近于數(shù)據(jù)的標(biāo)簽
2. 把多個(gè)個(gè)數(shù)據(jù)看成是一組數(shù)據(jù)并再次尋找標(biāo)簽
  • 盡量選取可以閉合的標(biāo)簽(父級標(biāo)簽),并包裹其需要的數(shù)據(jù)陨簇。

提取順序:htmls->video-info->video-nickname/video-number->提取數(shù)據(jù)

正則匹配

匹配父級標(biāo)簽
root_pattern = '<div class="video-info">([\s\S]*?)</div>'  #此處要使用非貪婪吐绵,否則會無限匹配下去。

匹配名字和人數(shù)
name_pattern = '</i>([\s\S]*?)</span>'
number_pattern = '<i class="ricon ricon-eye"></i>([\s\S]*?)</span>'

數(shù)據(jù)精煉

def __refine(self,anchors):
        l = lambda anchor:{
            'name':anchor['name'][0].strip(),   #去除全部空白字符
            'number':anchor['number'][0] #列表轉(zhuǎn)化為單一的字符串
            }
        return map(l,anchors)

數(shù)據(jù)排序

def __sort_seed(self,anchor):
    r = re.findall('\d*',anchor['number']) #提取數(shù)字
    number = float(r[0])
    if '萬' in anchor['number']: #處理'萬'
        number *= 10000
    return number

def __sort(self,anchors):
    anchors = sorted(anchors,key = self.__sort_seed,reverse = True)
    #key確定字典中哪個(gè)元素作為比較對象
    #sorted()默認(rèn)升序排列河绽,reverse = True降序
    return anchors

VSCode中調(diào)試代碼

斷點(diǎn)調(diào)試:F5啟動(dòng)己单,F(xiàn)10單步,F(xiàn)5跳斷點(diǎn)耙饰,F(xiàn)11進(jìn)內(nèi)部

整體代碼:
from urllib import request
import re

class Spider():
    url = 'https://www.panda.tv/cate/lol'
    root_pattern = '<div class="video-info">([\s\S]*?)</div>'
    name_pattern = '</i>([\s\S]*?)</span>'
    number_pattern = '<i class="ricon ricon-eye"></i>([\s\S]*?)</span>'
    
    def __fetch_content(self):
        r = request.urlopen(Spider.url) #獲取url的界面
        htmls = r.read()    #讀取界面(獲得字節(jié)碼)
        htmls = str(htmls, encoding='utf-8')    #字符串轉(zhuǎn)碼
        return htmls
    
    def __analysis(self,htmls):
        root_html = re.findall(Spider.root_pattern, htmls)
        anchors = []
        # print(root_html[0])
        for html in root_html:
            name = re.findall(spider.name_pattern, html)
            number = re.findall(spider.number_pattern, html)
            anchor = {'name': name, 'number': number}
            anchors.append(anchor)
        # print(anchors[0])
        return anchors

    def __refine(self,anchors):
        l = lambda anchor:{
            'name':anchor['name'][0].strip(),   #去除全部空白字符
            'number':anchor['number'][0] #列表轉(zhuǎn)化為單一的字符串
            }
        return map(l,anchors)

    def __sort_seed(self,anchor):
        r = re.findall('\d*',anchor['number']) #提取數(shù)字
        number = float(r[0])
        if '萬' in anchor['number']: #處理'萬'
            number *= 10000
        return number

    def __sort(self,anchors):
        anchors = sorted(anchors,key = self.__sort_seed,reverse = True)
        #key確定字典中哪個(gè)元素作為比較對象
        #sorted()默認(rèn)升序排列,reverse = True 降序
        return anchors

    def __show(self,anchors):
        for rank in range(0,len(anchors)):
            print('rank ' + str(rank + 1) +':' + ' ' + anchors[rank]['name'] +
            '————' + anchors[rank]['number'])

    def go(self):
        htmls = self.__fetch_content()
        anchors = self.__analysis(htmls)
        anchors = list(self.__refine(anchors))
        anchors = self.__sort(anchors)
        self.__show(anchors)

spider = Spider()
spider.go()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纹笼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苟跪,更是在濱河造成了極大的恐慌廷痘,老刑警劉巖蔓涧,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笋额,居然都是意外死亡元暴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門鳞陨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昨寞,“玉大人瞻惋,你說我怎么就攤上這事厦滤。” “怎么了歼狼?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵掏导,是天一觀的道長。 經(jīng)常有香客問我羽峰,道長趟咆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任梅屉,我火速辦了婚禮值纱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坯汤。我一直安慰自己虐唠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布惰聂。 她就那樣靜靜地躺著疆偿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搓幌。 梳的紋絲不亂的頭發(fā)上杆故,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音溉愁,去河邊找鬼处铛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拐揭,可吹牛的內(nèi)容都是我干的撤蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼投队,長吁一口氣:“原來是場噩夢啊……” “哼枫疆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敷鸦,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤息楔,失蹤者是張志新(化名)和其女友劉穎寝贡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體值依,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圃泡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了愿险。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颇蜡。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辆亏,靈堂內(nèi)的尸體忽然破棺而出风秤,到底是詐尸還是另有隱情,我是刑警寧澤扮叨,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布缤弦,位于F島的核電站,受9級特大地震影響彻磁,放射性物質(zhì)發(fā)生泄漏碍沐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一衷蜓、第九天 我趴在偏房一處隱蔽的房頂上張望累提。 院中可真熱鬧,春花似錦磁浇、人聲如沸斋陪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳍贾。三九已至,卻和暖如春交洗,著一層夾襖步出監(jiān)牢的瞬間骑科,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工构拳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咆爽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓置森,卻偏偏與公主長得像斗埂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子凫海,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容