天天看点

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小时不间断爬取数据,然后制作成可视化。

如果觉得这篇文章对你有帮助的话,可否点个赞再走?