微博的熱搜榜對於研究大眾的流量有非常大的價值。今天的教程就來說說如何爬取微博的熱搜榜。 熱搜榜的連結是:
用瀏覽器瀏覽,發現在不登入的情況下也可以正常檢視,那就簡單多了。使用開發者工具(F12)檢視頁面邏輯,並拿到每條熱搜的CSS位置,方法如下:
按照這個方法,拿到這個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 熱搜榜爬蟲
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 微博熱搜榜爬蟲
完整程式碼如下:
# 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 微博熱搜
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Python實用寶典, pythondict.com