Python 超簡單爬取微博熱搜榜資料

pythondict發表於2020-05-13

微博的熱搜榜對於研究大眾的流量有非常大的價值。今天的教程就來說說如何爬取微博的熱搜榜。 熱搜榜的連結是:

s.weibo.com/top/summary/

用瀏覽器瀏覽,發現在不登入的情況下也可以正常檢視,那就簡單多了。使用開發者工具(F12)檢視頁面邏輯,並拿到每條熱搜的CSS位置,方法如下:

Python 熱搜榜爬蟲

按照這個方法,拿到這個td標籤的selector是:
pl_top_realtimehot > table > tbody > tr:nth-child(3) > td.td-02
其中nth-child(3)指的是第三個tr標籤,因為這條熱搜是在第三名的位置上,但是我們要爬的是所有熱搜,因此:nth-child(3)可以去掉。還要注意的是 pl_top_realtimehot 是該標籤的id,id前需要加#號,最後變成:
#pl_top_realtimehot > table > tbody > tr > td.td-02

你可以自定義你想要爬的資訊,這裡我需要的資訊是:熱搜的連結及標題、熱搜的熱度。它們分別對應的CSS選擇器是:

連結及標題:#pl_top_realtimehot > table > tbody > tr > td.td-02 > a
熱度:#pl_top_realtimehot > table > tbody > tr > td.td-02 > span

值得注意的是連結及標題是在同一個地方,連結在a標籤的href屬性裡,標題在a的文字中,用beautifulsoup有辦法可以都拿到,請看後文程式碼。

現在這些資訊的位置我們都知道了,接下來可以開始編寫程式。預設你已經安裝好了python,並能使用cmd的pip,如果沒有的話請見這篇教程:python安裝。需要用到的python的包有:

BeautifulSoup4:
cmd/Terminal 安裝指令:

pip install beautifulsoup4

lxml解析器:
cmd/Terminal 安裝指令:

pip install lxml

lxml是python中的一個包,這個包中包含了將html文字轉成xml物件的工具,可以讓我們定位標籤的位置。而能用來識別xml物件中這些標籤的位置的包就是 Beautifulsoup4.

編寫程式碼:

# https://s.weibo.com/top/summary/
import requests
from bs4 import BeautifulSoup

if __name__ == "__main__":
    news = []
    # 新建陣列存放熱搜榜
    hot_url = 'https://s.weibo.com/top/summary/'
    # 熱搜榜連結
    r = requests.get(hot_url)
    # 向連結傳送get請求獲得頁面
    soup = BeautifulSoup(r.text, 'lxml')
    # 解析頁面

    urls_titles = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > a')
    hotness = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > span')

    for i in range(len(urls_titles)-1):
        hot_news = {}
        # 將資訊儲存到字典中
        hot_news['title'] = urls_titles[i+1].get_text()
        # get_text()獲得a標籤的文字
        hot_news['url'] = "https://s.weibo.com"+urls_titles[i]['href']
        # ['href']獲得a標籤的連結,並補全字首
        hot_news['hotness'] = hotness[i].get_text()
        # 獲得熱度文字
        news.append(hot_news) 
        # 字典追加到陣列中 

    print(news)

程式碼說明請看註釋,不過這樣做,我們僅僅是將結果儲存到陣列中,如下所示,其實不易觀看,我們下面將其儲存為csv檔案。

Python 熱搜榜爬蟲

Python 熱搜榜爬蟲

    import datetime
    today = datetime.date.today()
    f = open('./熱搜榜-%s.csv'%(today), 'w', encoding='utf-8')
    for i in news:
        f.write(i['title'] + ',' + i['url'] + ','+ i['hotness'] + 'n')

效果如下,怎麼樣,是不是好看很多:

Python 微博熱搜榜爬蟲

Python 微博熱搜榜爬蟲

完整程式碼如下:

# https://s.weibo.com/top/summary/
import requests
from bs4 import BeautifulSoup

if __name__ == "__main__":
    news = []
    # 新建陣列存放熱搜榜
    hot_url = 'https://s.weibo.com/top/summary/'
    # 熱搜榜連結
    r = requests.get(hot_url)
    # 向連結傳送get請求獲得頁面
    soup = BeautifulSoup(r.text, 'lxml')
    # 解析頁面

    urls_titles = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > a')
    hotness = soup.select('#pl_top_realtimehot > table > tbody > tr > td.td-02 > span')

    for i in range(len(urls_titles)-1):
        hot_news = {}
        # 將資訊儲存到字典中
        hot_news['title'] = urls_titles[i+1].get_text()
        # get_text()獲得a標籤的文字
        hot_news['url'] = "https://s.weibo.com"+urls_titles[i]['href']
        # ['href']獲得a標籤的連結,並補全字首
        hot_news['hotness'] = hotness[i].get_text()
        # 獲得熱度文字
        news.append(hot_news)
        # 字典追加到陣列中

    print(news)

    import datetime
    today = datetime.date.today()
    f = open('./熱搜榜-%s.csv'%(today), 'w', encoding='utf-8')
    for i in news:
        f.write(i['title'] + ',' + i['url'] + ','+ i['hotness'] + 'n')

​Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關注公眾號:Python實用寶典
原文來自Python實用寶典:Python 微博熱搜

Python 教程

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Python實用寶典, pythondict.com

相關文章