天天看點

python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結

最近看到可視化資料非常火爆,是以要做這方面的話首先要做的就是擷取到資料。

目錄

一、準備工作

1.子產品

2.url和headers

二、正文

1.使用正則比對到相應資料

2.存儲資料到excel中

3.每隔一段時間運作程式

三、全部代碼展示

四、總結

本文的大緻思路是每隔1分鐘爬取微網誌熱搜前十并儲存到excel中。

一、準備工作

1.子產品

import time
import requests
import schedule as schedule
import re
import pandas as pd
           

2.url和headers

url = 'https://s.weibo.com/top/summary'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
           

二、正文

1.使用正則比對到相應資料

python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結

 如圖,現如今的微網誌熱搜上不隻是帶排名的熱搜,還有置頂熱搜和與商業有關的熱搜。

由于置頂熱搜和商業相關的熱搜不算真正意義上的熱搜(後面沒有熱度值),是以在爬取資料過程中要避免爬這兩類資料。

python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結
python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結
python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結

 分析這三類的elements,可以發現前兩個圖檔雖然都帶有target="_blank"></a>,但是置頂熱搜的href中最後是Refer=new_time,帶排名的熱搜的href最後是Refer=top。商業性的熱搜則根本不一樣。同理,在分析熱度的時候,置頂熱搜沒有<span></span>,而帶排名的熱搜和商業性的熱搜都帶有<span></span>,但是商業性的裡面沒有數值,我們要擷取有數值的。

titles = re.compile('Refer=top" target="_blank">(.*?)</a>', re.S)
nums = re.compile(r'<span>(\d+)</span>')
           

經分析,使用正規表達式中的re.compile()。注:帶括号則比對括号内的内容,否則就會将整個都比對進去,\d表示數字,+表示比對一個或多個,這樣就将商業性的熱搜排除在外了。

定義一個run()函數:

def run():
    global m
    print('第{}次運作'.format(m) + '=' * 50)  # 可以觀察到第幾次運作
    m += 1
    response = requests.get(url, headers=headers)
    # print(response.text)
    time_stamp = time.strftime('%Y/%m/%d %H:%M', time.localtime(time.time()))  # 時間戳

    for i in range(1, 11):
        rank = '第{}名'.format(i)    # 微網誌排名
        # print(rank)
        num = re.findall(nums, response.text)[i-1]  # 微網誌熱度
        # print(num)
        title = re.findall(titles, response.text)[i-1]  # 微網誌内容
        # print(title)
        # 存儲資料
        df.append([time_stamp, rank, num, title])
        d = pd.DataFrame(df, columns=columns)
        d.to_excel("微網誌前十熱搜.xlsx", index=False)
           

 由于微網誌熱搜具有實時性,所有要根據時間來爬資料,這裡采用時間戳

time_stamp = time.strftime('%Y/%m/%d %H:%M', time.localtime(time.time()))  # 時間戳
           

 %Y/%m/%d %H:%M表示xx年xx月xx日x點x分。

由于爬熱搜前十,所有最簡單的方法就是用for i in range(1, 11):,将排名直接用i帶入,對于熱度和内容,則需要用re.findall(),至于[i-1],例如熱搜第一的num和title對應的位置在python中為0,所有是i-1。

2.存儲資料到excel中

首先定義一個空清單,在for循環中每循環一次,就将時間,排名,熱度,内容當作一行寫入到excel中,DataFrame表示二維數組。columns表示标題欄,index表示索引,你可以将false改為true來體會index是啥。

3.每隔一段時間運作程式

schedule.every(60).seconds.do(run)
while True:
    schedule.run_pending()
           

這裡是每隔60秒運作一次。

三、全部代碼展示

如果覺得看的不流暢,可以直接看這裡。

import time
import requests
import schedule as schedule
import re
import pandas as pd

url = 'https://s.weibo.com/top/summary'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

titles = re.compile('Refer=top" target="_blank">(.*?)</a>', re.S)
nums = re.compile(r'<span>(\d+)</span>')
df = []
columns = ['time_stamp', 'rank', 'num', 'title']  # excel的标題欄

m = 1
def run():
    global m
    print('第{}次運作'.format(m) + '=' * 50)  # 可以觀察到第幾次運作
    m += 1
    response = requests.get(url, headers=headers)
    # print(response.text)
    time_stamp = time.strftime('%Y/%m/%d %H:%M', time.localtime(time.time()))  # 時間戳

    for i in range(1, 11):
        rank = '第{}名'.format(i)    # 微網誌排名
        # print(rank)
        num = re.findall(nums, response.text)[i-1]  # 微網誌熱度
        # print(num)
        title = re.findall(titles, response.text)[i-1]  # 微網誌内容
        # print(title)
        # 存儲資料
        df.append([time_stamp, rank, num, title])
        d = pd.DataFrame(df, columns=columns)
        d.to_excel("微網誌前十熱搜.xlsx", index=False)

schedule.every(60).seconds.do(run)
while True:
    schedule.run_pending()
           

python爬取微網誌熱搜前十并儲存到excel中一、準備工作二、正文三、全部代碼展示四、總結

四、總結

希望大家自己動手寫寫,因為自己動手的時候會遇到各種各樣的問題,如果解決的話對自己來說也是一種提升,當然如果對這個案例有不懂的可以私信我

使用這個方法就是需要一直運作程式,如果你會弄雲伺服器的話,也可以在雲伺服器上24小時不間斷爬取資料,然後制作成可視化。

如果覺得這篇文章對你有幫助的話,可否點個贊再走?