新浪热搜的数据提取(微博热搜停更不用怕)

众所周知,微博热搜是实时更新的,根据用户的关注度高低来确定排名情况,如果错过了,就再也找不到了。由于种种原因,微博从昨天开始停止更新了,一直停留在6月10日15点:

新浪热搜的数据提取(微博热搜停更不用怕)(1)

而且我们是无法查到之前的热搜内容的。为了弥补这一缺憾,我想了一个好办法,用python写个定时爬取程序,把爬取的结果保存到数据库中,这样就可以随时翻阅之前的热搜记录了,效果如下:

新浪热搜的数据提取(微博热搜停更不用怕)(2)

下面给大家详细讲解一下实现的全过程:

一、微博热搜网页分析

打开微博热搜网页,地址为:

https://s.weibo.com/top/summary?sudaref=www.baidu.com

新浪热搜的数据提取(微博热搜停更不用怕)(3)

以火狐浏览器为例,按F12打开流量分析工具,重新请求该网页:

新浪热搜的数据提取(微博热搜停更不用怕)(4)

发现就是个简单的静态网页,显得有点小随意

再分析一下网页内容:

新浪热搜的数据提取(微博热搜停更不用怕)(5)

发现每条热搜的内容及热度都在一个class="td-02"的标签下,我们可以先保存所有的该标签,然后再从中解析出热搜内容及热度。

二、用python模拟爬取微博热搜

整体思路是用requests模拟获取网页,然后用bs4解析网页,从中提取所有热搜的内容及热度。另外,因为微博必须要登录才能获取热搜信息,所以我们在用requests模拟请求的时候要带上cookie信息,而且微博的cookie信息有效值比较长,这样就省去了模拟登录的麻烦,代码如下:

header = { 'User-Agent': 'Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'}cookie = { 'Cookie': ''}response = requests.get(url, headers=header, cookies=cookie)response.encoding = 'utf-8'print(response.text)soup = BeautifulSoup(response.text, 'html.parser')items = soup.find_all('td', class_='td-02')time_stamp = time.strftime('%Y/%m/%d%H:%M', time.localtime(time.time())) #时间戳for i, item in enumerate(items[1:]): rank = '第{0}名'.format(i 1) # 微博排名 num = str(item.find('span')).replace('<span>', '').replace('</span>', '') # 微博热度 title = item.find('a').text #微博内容

三、保存到mysql数据库

关于mysql数据库的安装和配置网上教程有很多,这里就不再赘述了。

将数据保存到数据库的步骤如下:

1.先连接数据库,然后在数据库下创建新表“WEIBO”,在表内创建‘rank、content、hot、now’列,代码如下:

conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yanwnebo123', db='test1', charset='utf8mb4')cur = conn.cursor()cur.execute("DROP TABLE IFEXISTS `WEIBO`")sql = """ create table `WEIBO`( `rank` char(5),`content` char(255),`hot` char(105),`now` char(50))"""cur.execute(sql)

2.然后把爬下来的热搜数据插入数据库表格中

cur.execute("INSERT INTOWEIBO(`rank`,`content`,`hot`,`now`) VALUES ('{0}', '{1}','{2}','{3}')".format(rank,title, num, time_stamp))conn.commit()

这样就基本完成了

四、设置定时爬取

本环节主要用到schedule函数,该函数是一个轻量级的定时任务调度库,可以完成每分钟,每小时,每天,周几,特定日期的定时任务。因此十分便于我们执行一些轻量级的定时任务,用法如下:

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

上述是60秒执行1次的代码,run函数主要实现上述的爬取及保存数据功能。

也可以1分钟执行1次(起始效果一样,只不过写法不同)

schedule.every(1).minutes.do(run)while True: schedule.run_pending()

这样就大功告成了!如果一直运行该程序,就能把时间内的所有热搜内容都保存到数据库中。

本文所述的代码及数据已上传至【python的爬虫与数据分析之路】gzh后台,请输入热搜获取。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页