Python定时爬取微博热搜示例介绍
作者:Dream丶Killer 发布时间:2022-09-18 21:59:18
前言
相信大家在工作无聊时,总想掏出手机,看看微博热搜在讨论什么有趣的话题,但又不方便直接打开微博浏览,今天就和大家分享一个有趣的小爬虫,定时采集微博热搜榜&热评
,下面让我们来看看具体的实现方法。
页面分析
热搜页
热榜首页:https://s.weibo.com/top/summary?cate=realtimehot
热榜首页的榜单中共五十条数据,在这个页面,我们需要获取排行、热度、标题,以及详情页的链接。
我们打开页面后要先 登录
,之后使用 F12
打开开发者工具,Ctrl + R
刷新页面后找到第一条数据包。这里需要记录一下自己的 Cookie
与 User-Agent
。
对于标签的定位,直接使用 Google
工具获取标签的 xpath
表达式即可。
详情页
对于详情页,我们需要获取评论时间、用户名称、转发次数、评论次数、点赞次数、评论内容这部分信息。
方法与热搜页采集方式基本相同,下面看看如何用代码实现!
采集代码
首先导入所需要的模块。
import requests
from time import sleep
import pandas as pd
import numpy as np
from lxml import etree
import re
定义全局变量。
headers
:请求头all_df
:DataFrame,保存采集的数据
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36',
'Cookie': '''你的Cookie'''
}
all_df = pd.DataFrame(columns=['排行', '热度', '标题', '评论时间', '用户名称', '转发次数', '评论次数', '点赞次数', '评论内容'])
热搜榜采集代码,通过 requests
发起请求,获取详情页链接后,跳转进入详情页采集 get_detail_page
。
def get_hot_list(url):
'''
微博热搜页面采集,获取详情页链接后,跳转进入详情页采集
:param url: 微博热搜页链接
:return: None
'''
page_text = requests.get(url=url, headers=headers).text
tree = etree.HTML(page_text)
tr_list = tree.xpath('//*[@id="pl_top_realtimehot"]/table/tbody/tr')
for tr in tr_list:
parse_url = tr.xpath('./td[2]/a/@href')[0]
detail_url = 'https://s.weibo.com' + parse_url
title = tr.xpath('./td[2]/a/text()')[0]
try:
rank = tr.xpath('./td[1]/text()')[0]
hot = tr.xpath('./td[2]/span/text()')[0]
except:
rank = '置顶'
hot = '置顶'
get_detail_page(detail_url, title, rank, hot)
根据详情页链接,解析所需页面数据,并保存到全局变量 all_df
中,对于每个热搜只采集热评前三条,热评不够则跳过。
def get_detail_page(detail_url, title, rank, hot):
'''
根据详情页链接,解析所需页面数据,并保存到全局变量 all_df
:param detail_url: 详情页链接
:param title: 标题
:param rank: 排名
:param hot: 热度
:return: None
'''
global all_df
try:
page_text = requests.get(url=detail_url, headers=headers).text
except:
return None
tree = etree.HTML(page_text)
result_df = pd.DataFrame(columns=np.array(all_df.columns))
# 爬取3条热门评论信息
for i in range(1, 4):
try:
comment_time = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[1]/div[2]/p[1]/a/text()')[0]
comment_time = re.sub('\s','',comment_time)
user_name = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[1]/div[2]/p[2]/@nick-name')[0]
forward_count = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[2]/ul/li[1]/a/text()')[1]
forward_count = forward_count.strip()
comment_count = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[2]/ul/li[2]/a/text()')[0]
comment_count = comment_count.strip()
like_count = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[2]/ul/li[3]/a/button/span[2]/text()')[0]
comment = tree.xpath(f'//*[@id="pl_feedlist_index"]/div[4]/div[{i}]/div[2]/div[1]/div[2]/p[2]//text()')
comment = ' '.join(comment).strip()
result_df.loc[len(result_df), :] = [rank, hot, title, comment_time, user_name, forward_count, comment_count, like_count, comment]
except Exception as e:
print(e)
continue
print(detail_url, title)
all_df = all_df.append(result_df, ignore_index=True)
调度代码,向 get_hot_list
中传入热搜页的 url
,最后进行保存即可。
if __name__ == '__main__':
url = 'https://s.weibo.com/top/summary?cate=realtimehot'
get_hot_list(url)
all_df.to_excel('工作文档.xlsx', index=False)
对于采集过程中对于一些可能发生报错的地方,为保证程序的正常运行,都通过异常处理给忽略掉了,整体影响不大!
工作文档.xlsx
设置定时运行
至此,采集代码已经完成,想要实现每小时自动运行代码,可以使用任务计划程序。
在此之前需要我们简单修改一下上面代码中的Cookie与最后文件的保存路径(建议使用绝对路径),如果在 Jupyter notebook
中运行的需要导出一个 .py
文件
打开任务计划程序,【创建任务】
输入名称,名称随便起就好。
选择【触发器】>>【新建】>>【设置触发时间】
选择【操作】>>【新建】>>【选择程序】
最后确认即可。到时间就会自动运行,或者右键任务手动运行。
运行效果
来源:https://blog.csdn.net/qq_43965708/article/details/121903132


猜你喜欢
- 需求查询某个字段的时候需要给一个字段同样的值。这个值你可以写死,也可以从数据库获取1、写死值SELECT mfr_id AS mfrId,
- 前言为了避免代码泄露的风险,我们往往需要对代码进行加密,PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护
- 由于pygame.movie.Movie.play() 只支持MPEG格式的视频,且 pygame版本大于1.9.5好像已经不支持这个模块了
- 本文实例讲述了PHP函数shuffle()取数组若干个随机元素的方法。分享给大家供大家参考,具体如下:有时候我们需要取数组中若干个随机元素(
- 实例如下:from win32com.client import Dispatch import win32com.client
- Oracle和mysql的一些简单命令对比 1)SQL> select to_char(sysdate,'yyyy-mm-dd
- 作为一个非设计出生的研究思路偏向的设计师,带着少了设计师自恋和自怜的眼光,我记下最近一年来感受到的交互设计师的尴尬。交互设计师就是出界面的,
- 本文实例为大家分享了python3判断url链接是否为404的具体代码,供大家参考,具体内容如下import pymysqlimport t
- 学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装Windows打开Python官方下
- 今天刷《剑指offer》的时候碰到这样一道题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵
- 前言最近在工作中遇到了这个需求,估计搞了一个多小时才把这个远程连接搞好。一台本地电脑,一台云服务器,都是linux系统。下面来看看详细的介绍
- 不能再向以前一样使用model.add(Merge([Model1,Model2]))必须使用函数式out = Concatenate()(
- 在给一个 App 做 API,从服务器端的 MySQL 取出数据,然后生成 JSON。数据中有个字段叫 content,里面保存了文章内容,
- 日期的转换及计算对于日期,有时需执行不同时间单位的转换,或者接受字符串格式的日期,转换为 datetime 对象。有时需计算日期的范围,以及
- 一般来说一个系统最先出现瓶颈的点很可能是数据库。比如我们的生产系统并发量很高在跑一段时间后,数据库中某些表的数据量会越来越大。海量的数据会严
- 如果您还没看过段正淳的css笔记(1)分类之间的横竖线,可以先看看!1、css圆角的做法.为了这个圆角,前段开发们付出的努力是在是太多了.又
- [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利用光标更新数据 [Q]怎
- 前言很多朋友在使用Jetbrains系列软件的时候,可能都会有一个问题,那就是鼠标右击出现的Open Folder as PyCharm P
- Python的安装并不难,但是要正确安装它的库以及配置环境变量则有些麻烦。对于刚刚开始想要学习Python的小伙伴来说,用Anaconda这
- 在印刷排版中“point”是一个绝对的单位,它等于 1/72 英寸。可以用尺子丈量的,物理的英寸。但在CSS中pt的含义