最近看到可视化数据非常火爆,因此要做这方面的话首先要做的就是获取到数据。
目录
一、准备工作
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小时不间断爬取数据,然后制作成可视化。
如果觉得这篇文章对你有帮助的话,可否点个赞再走?