1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一行代碼爬取微博熱搜

        共 8126字,需瀏覽 17分鐘

         ·

        2021-09-01 05:16

        ↑↑↑關(guān)注后"星標(biāo)"簡(jiǎn)說(shuō)Python

        人人都可以簡(jiǎn)單入門Python、爬蟲、數(shù)據(jù)分析
         簡(jiǎn)說(shuō)Python推薦 

        來(lái)源:簡(jiǎn)說(shuō)Python 編輯:老表

        作者:老表

        • 一、前言

        • 二、專欄概要

        • 三、直接來(lái):爬取微博熱搜數(shù)據(jù)

          • 3.1 找到數(shù)據(jù)源,頁(yè)面分析

          • 3.2 一行代碼爬取微博熱搜

          • 3.3 爬蟲初學(xué)者看這里,爬蟲入門模板教程如何爬去微博熱搜

        一、前言

        大家好,我是老表,今天的分享來(lái)滿足讀者的需求,想讀“關(guān)于數(shù)據(jù)庫(kù)sql或者M(jìn)ySQL的,就那種Python來(lái)處理數(shù)據(jù)庫(kù),比如Python爬蟲爬到數(shù)據(jù),然后封存到數(shù)據(jù)庫(kù)里面,然后再?gòu)膕ql里面讀取,進(jìn)行分析可視化”。

        后面寫文章一方面是自己學(xué)習(xí)筆記,另外也會(huì)針對(duì)讀者需求寫一些專題文章,如果你有自己的想法,歡迎瀏覽器訪問(wèn)下方鏈接,或者點(diǎn)擊閱讀原文,給博主提意見(jiàn):

        https://shimo.im/forms/pVQRXG6gWyqPxCTY/fill?channel=wechat

        二、專欄概要

        • 直接來(lái):一行代碼爬取微博熱搜數(shù)據(jù)
        • 做準(zhǔn)備:將爬取到的數(shù)據(jù)存入csv和mysql、其他數(shù)據(jù)庫(kù)
        • 搞事情:讀取mysql數(shù)據(jù)并進(jìn)行數(shù)據(jù)分析與可視化
        • 進(jìn)階活:將可視化數(shù)據(jù)結(jié)果呈現(xiàn)到web頁(yè)面(大屏可視化)
        • 悄悄話:項(xiàng)目總結(jié)與思考,期待你的來(lái)稿

        三、直接來(lái):爬取微博熱搜數(shù)據(jù)

        3.1 找到數(shù)據(jù)源,頁(yè)面分析

        首先我們直接瀏覽器搜索微博熱搜,就可以很快的找到微博熱搜的在線頁(yè)面,地址如下:

        https://s.weibo.com/top/summary/

        我們要爬取的熱搜榜數(shù)據(jù),包括了如下列表中的四個(gè)字段。

        話不多說(shuō),看到數(shù)據(jù)在頁(yè)面,按住F12調(diào)出瀏覽器開(kāi)發(fā)者工具(推薦使用谷歌瀏覽器),然后點(diǎn)擊network,刷新頁(yè)面,在加載出來(lái)的頁(yè)面中找到summary,發(fā)現(xiàn)這個(gè)請(qǐng)求返回來(lái)的是頁(yè)面中的數(shù)據(jù),里面是html代碼(數(shù)據(jù)也在里面)。然后點(diǎn)擊Headers,可以看出請(qǐng)求的url就是我們?yōu)g覽器里輸入的鏈接,沒(méi)有其他接口,所以,接下來(lái)就簡(jiǎn)單了。

        (本文相關(guān)全部源碼,可以在文末獲取下載地址)

        3.2 一行代碼爬取微博熱搜

        接下來(lái)說(shuō)下簡(jiǎn)單的數(shù)據(jù)獲取方式,只需一行代碼即可,如果硬是要算,最多就是兩行。

        import pandas as pd
        pd.read_html('https://s.weibo.com/top/summary/summary', index_col=0)[0]

        (做這個(gè)項(xiàng)目的時(shí)候我是先用的后一種方式爬取的數(shù)據(jù))中間分析xpath路徑的時(shí)候突然發(fā)現(xiàn),這頁(yè)面上tr、td不是表格嗎,頁(yè)面上的表格爬取,在數(shù)據(jù)分析從零開(kāi)始實(shí)戰(zhàn) | 基礎(chǔ)篇(四)中有詳細(xì)介紹,直接使用pandas的read_html函數(shù)即可,于是就有了上面一行代碼爬取到微博熱搜的想法了。

        當(dāng)然,我們會(huì)發(fā)現(xiàn)爬取的數(shù)據(jù)還是有點(diǎn)問(wèn)題,雖然已經(jīng)是DataFrame數(shù)據(jù)格式了,但是熱搜標(biāo)題和熱搜熱度由于在一個(gè)td里,所以爬取的時(shí)候也是給放到了一列中,著實(shí)有點(diǎn)尷尬。

        不過(guò)沒(méi)關(guān)系,我們處理下,可以利用正則將標(biāo)題和熱度分成兩列即可。

        首先對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單處理,設(shè)置下列名和刪除推薦熱搜(熱搜排名為'?')和置頂熱搜(熱搜排名為nan)。

        # 重新設(shè)置表頭
        wb_hot_data.columns = ['wb_rank''wb_title_hot''wb_lable']
        # 簡(jiǎn)單處理數(shù)據(jù),去除推薦熱搜和置頂熱搜
        wb_hot_data = wb_hot_data.drop(wb_hot_data[(wb_hot_data['wb_rank']=='?') | pd.isna(wb_hot_data['wb_rank'])].index)

        使用正則表達(dá)式提取數(shù)據(jù),將熱搜標(biāo)題和熱搜熱度分成兩列

        import re
        def reg_str(wb_title_hot='迪麗熱巴玩泡泡機(jī) 293536'):
            data = re.match('(.*?) (\d+)', wb_title_hot)
            if data:
                return data[1],data[2]
            else:
                return None,None
        # apply函數(shù)應(yīng)用
        wb_title_hots = wb_hot_data.apply(lambda x: reg_str(x['wb_title_hot']),axis=1)
        # 列表推倒式將熱搜標(biāo)題和熱搜熱度值分別賦值給兩個(gè)新列
        wb_hot_data['wb_title'] = [wb_title_hots[i][0for i in wb_title_hots.index]
        wb_hot_data['wb_hot'] = [int(wb_title_hots[i][1]) for i in wb_title_hots.index]

        這樣數(shù)據(jù)基本就解決好啦~整體來(lái)看,還是會(huì)比后一種方法更簡(jiǎn)單,如果你是爬蟲初學(xué)者,我建議你可以仔細(xì)看下接下來(lái)的一種數(shù)據(jù)爬取、解析方法。

        3.3 爬蟲初學(xué)者看這里,爬蟲入門模板教程如何爬去微博熱搜

        直接無(wú)腦套入爬蟲模板:

        # 爬蟲基礎(chǔ)庫(kù),需要提前pip install requests 安裝
        import requests
        # html文本解析庫(kù),將文本內(nèi)容解析成html,方便使用xpath方式提取數(shù)據(jù)
        from lxml import etree


        def get_respones_data(wb_url = 'https://s.weibo.com/top/summary/'):
            '''
            參數(shù):wb_url 字符串 要請(qǐng)求的url,默認(rèn):https://s.weibo.com/top/summary/
            返回:get_data,a 元組 第一個(gè)元素為請(qǐng)求得到的頁(yè)面文本數(shù)據(jù)(可以后期使用正則表達(dá)式提取數(shù)據(jù)) 第二個(gè)元素為將get_data文本內(nèi)容解析成html后的內(nèi)容,方便使用xpath方式提取數(shù)據(jù)
            '''

            headers={
                'Host''s.weibo.com',
                'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
            }
            # requests 發(fā)送請(qǐng)求
            get_response = requests.get(wb_url,headers=headers)
            # 將返回的響應(yīng)碼轉(zhuǎn)換成文本(整個(gè)網(wǎng)頁(yè))
            get_data = get_response.text
            # 解析頁(yè)面
            a = etree.HTML(get_data)
            return get_data,a
        # 調(diào)用函數(shù),獲取到數(shù)據(jù)  
        get_data,first_a = get_respones_data()

        覺(jué)得這種方法比較麻煩的,可以跳過(guò)本部分,后面會(huì)介紹一種特別簡(jiǎn)單的數(shù)據(jù)獲取方式(后面才想到的,之所以先記錄這種麻煩方法,也是想讓大家學(xué)習(xí)下這種方法,后面數(shù)據(jù)爬取中會(huì)比較常見(jiàn))。

        接下來(lái),我們就開(kāi)始從爬取到的數(shù)據(jù)中提取我們需要的數(shù)據(jù)啦!

        3.3.1 熱搜標(biāo)題

        首先在熱搜頁(yè)面,按住F12,調(diào)出開(kāi)發(fā)者工具,點(diǎn)擊開(kāi)發(fā)者工具左上角的select an element...,然后選中自己想提取的數(shù)據(jù),如下圖中的熱搜標(biāo)題。選中并點(diǎn)擊下熱搜標(biāo)題,這是時(shí)候會(huì)回歸正常模式(非選擇元素模式),如下圖,鼠標(biāo)移動(dòng)到被選中的html代碼上,然后右鍵,選擇Copy-> Copy Xpath,就可以輕松的獲取到標(biāo)題對(duì)應(yīng)的xpath路徑啦。例如:

        //*[@id="pl_top_realtimehot"]/table/tbody/tr[2]/td[2]/a

        獲取到數(shù)據(jù)對(duì)應(yīng)的xpath路徑后,我們就可以調(diào)用lxml中的xpath函數(shù)進(jìn)行數(shù)據(jù)提取啦,如下代碼,輸出結(jié)果為一個(gè)列表,列表里的元素就是我們的熱搜標(biāo)題。

        這里需要注意的是,我們是獲取a標(biāo)簽內(nèi)的文本內(nèi)容,所以需要在獲取的xpath路徑后在加上\text(),同樣的,如果有需要我們還可以獲取標(biāo)簽內(nèi)的元素對(duì)應(yīng)的值,如熱搜對(duì)應(yīng)的鏈接。

        # 熱搜標(biāo)題
        print(first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[2]/td[2]/a/text()'))

        '''
        輸出:['小米放棄MI品牌']
        '''

        獲取到一條數(shù)據(jù)后,我們就要開(kāi)始想獲取頁(yè)面所有標(biāo)題數(shù)據(jù)啦,方法也很簡(jiǎn)單,我們按照上面的方法,在隨便獲取一個(gè)熱搜標(biāo)題的xpath路徑,然后對(duì)比一下,取相同就可以了。

        如下代碼所示,我們發(fā)現(xiàn)兩個(gè)xpath路徑只有tr這一級(jí)不同,所以將tr后的[2]去掉即可。

        '''
        對(duì)比找出通用xpath路徑
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[2]/td[2]/a
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[4]/td[2]/a
        '''

        # 通用
        wb_titles = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/a/text()')
        print(len(wb_titles))
        print(wb_titles)

        看輸出數(shù)據(jù),我們會(huì)發(fā)現(xiàn)數(shù)據(jù)總數(shù)對(duì)不上,頁(yè)面上的熱搜明明只有50條,為什么我們跑出來(lái)的數(shù)據(jù)有53條?有隱藏?cái)?shù)據(jù)被我們爬出來(lái)了?當(dāng)然不是,出現(xiàn)這種情況是因?yàn)槲⒉┯幸粋€(gè)置頂熱搜(暫且這么稱呼),另外還會(huì)有1-3個(gè)微博推薦熱搜(暫且這么稱呼),這兩種數(shù)據(jù)只有標(biāo)題屬性,沒(méi)有其他如:排行、熱度、標(biāo)簽等屬性,分析的時(shí)候需要剔除。

        按上面的方法,我們可以依次獲取到熱搜熱度、熱搜排名、熱度標(biāo)簽。

        3.3.2 熱搜熱度

        # 熱搜熱度
        print(first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[2]/td[2]/span/text()'))

        # 輸出:['2866232']

        '''
        對(duì)比找出通用xpath路徑
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[2]/td[2]/span
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[4]/td[2]/span
        '''

        # 通用
        wb_hot = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/span/text()')
        print(len(wb_hot))
        print(wb_hot)

        3.3.3 熱搜排名

        # 熱搜排名
        '''
        對(duì)比找出通用xpath路徑
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[10]/td[1]
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[7]/td[1]
        '''

        # 通用
        wb_rank = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[1]/text()')
        print(len(wb_rank))
        print(wb_rank)

        3.3.4 熱度標(biāo)簽

        # 熱度標(biāo)簽
        '''
        對(duì)比找出通用xpath路徑
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[4]/td[3]/i
        //*[@id="pl_top_realtimehot"]/table/tbody/tr[7]/td[3]/i
        '''

        # 通用
        wb_lable = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[3]/i/text()')
        print(len(wb_lable))
        print(wb_lable)

        這樣每個(gè)部分的數(shù)據(jù)都獲取到了,但是我們需要將每個(gè)熱搜的數(shù)據(jù)連接起來(lái),現(xiàn)在由于里面會(huì)有置頂熱搜和微博推薦熱搜,所以有些數(shù)據(jù)沒(méi)法直接連接起來(lái),比如熱搜標(biāo)題和熱度標(biāo)簽。

        當(dāng)然,辦法肯定是有的,前面分析、復(fù)制xpath的時(shí)候,我們已經(jīng)發(fā)現(xiàn)每個(gè)xpath只有tr[n]中的n不同,所以寫個(gè)循環(huán)變動(dòng)n即可,這樣每次獲取每條熱搜對(duì)應(yīng)的相關(guān)數(shù)據(jù)即可。

        新問(wèn)題來(lái)了,n是多少呢?顯然n不會(huì)是個(gè)定值(微博推薦熱搜條數(shù)不定),我們?cè)僮屑?xì)觀察頁(yè)面,可以發(fā)現(xiàn)不管是微博熱搜、置頂熱搜還是推薦熱搜,標(biāo)題都是有的,所以我們看標(biāo)題數(shù)即可。如下代碼。

        # 通用
        wb_titles = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr/td[2]/a/text()')
        n = len(wb_titles)
        wb_hot_data = []

        # 提取數(shù)據(jù)
        def get_element(data_list):
            if data_list:
                return data_list[0]
            else:
                return None
            
        # 遍歷循環(huán)
        for i in range(n):
            wb_rank = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[%d]/td[1]/text()'%(i+1))
            wb_titles = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[%d]/td[2]/a/text()'%(i+1))
            wb_hot = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[%d]/td[2]/span/text()'%(i+1))
            wb_lable = first_a.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr[%d]/td[3]/i/text()'%(i+1))
            wb_hot_data.append([get_element(wb_rank), get_element(wb_titles), get_element(wb_hot), get_element(wb_lable)])
            
        # 將列表數(shù)據(jù)轉(zhuǎn)換成DataFrame格式數(shù)據(jù),方便后續(xù)分析
        wb_hot_data = pd.DataFrame(wb_hot_data, columns=['wb_rank''wb_title''wb_hot''wb_lable'])
        wb_hot_data

        以上,相對(duì)完整且簡(jiǎn)潔的給大家說(shuō)明白了一個(gè)簡(jiǎn)單爬蟲的基本思路與行進(jìn)路徑,希望對(duì)初學(xué)爬蟲的讀者朋友有幫助,覺(jué)得還不錯(cuò),記得點(diǎn)個(gè)贊哦。

        下一講中,我們將一起學(xué)習(xí)如何將爬取下來(lái)的數(shù)據(jù)存儲(chǔ)到本地csv文件,或者數(shù)據(jù)庫(kù)中(如:mysql,mongodb,sqlite等),關(guān)于數(shù)據(jù)存儲(chǔ)這一節(jié),你還想學(xué)習(xí)什么其他的內(nèi)容也可以在評(píng)論區(qū)、留言區(qū)進(jìn)行留言。

        源碼獲取方法:
        點(diǎn)擊下方卡片,關(guān)注公眾號(hào)簡(jiǎn)說(shuō)Python
        回復(fù):微博爬 即可獲取全部源碼
        --END--


        公眾號(hào)簡(jiǎn)說(shuō)Python學(xué)習(xí)交流群已開(kāi)放,想加入進(jìn)行學(xué)習(xí)交流的讀者朋友,可以掃下方二維碼添加老表微信,回復(fù):進(jìn)群,獲取進(jìn)群邀請(qǐng)鏈接。

        掃碼即可加我微信

        觀看朋友圈,獲取最新學(xué)習(xí)資源


        學(xué)習(xí)更多:
        整理了我開(kāi)始分享學(xué)習(xí)筆記到現(xiàn)在超過(guò)250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說(shuō)不知道該從哪開(kāi)始,實(shí)戰(zhàn)哪里找了

        點(diǎn)擊閱讀原文,反饋你的建議;“點(diǎn)贊、留言”就是對(duì)我最大的支持!
        瀏覽 97
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            室友顶撞喘嗯啊h | 午夜伦情电午夜伦情电影如如视频 | 色戒免费观看电影全集高清版 | 最新国产大屌 | 啊灬啊灬啊灬快灬高潮了啊 | 口述交换做爰全过程细节 | 屌视频| 日韩特黄片 | 欧美色爱综合网 | 做爰免费视频网站 |