最近看到可視化資料非常火爆,是以要做這方面的話首先要做的就是擷取到資料。
目錄
一、準備工作
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.使用正則比對到相應資料
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxCeBRUT5FlMiZHaHR2bkdVY1RnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2ITN0EjN0YTM5EDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如圖,現如今的微網誌熱搜上不隻是帶排名的熱搜,還有置頂熱搜和與商業有關的熱搜。
由于置頂熱搜和商業相關的熱搜不算真正意義上的熱搜(後面沒有熱度值),是以在爬取資料過程中要避免爬這兩類資料。
分析這三類的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小時不間斷爬取資料,然後制作成可視化。
如果覺得這篇文章對你有幫助的話,可否點個贊再走?