首页 > 编程语言 >【2023微博评论爬虫】用python爬上千条微博评论,突破15页限制!

【2023微博评论爬虫】用python爬上千条微博评论,突破15页限制!

时间:2023-06-07 12:01:54浏览次数:42  
标签:评论者 list 微博 评论 15 data id

您好,我是@马哥python说,一枚10年程序猿。

一、爬取目标

前些天我分享过一篇微博的爬虫:
马哥python说:【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例

但我的学习群中的小伙伴频繁讨论微博评论的爬取,所以,我们再分享这篇微博评论的爬虫。

注意区分这两个爬虫:
上次:爬指定搜索关键词的搜索结果的博文数据
本次:爬单一微博的微博下方评论数据

二、展示爬取结果

首先,看下部分爬取数据:
张天爱微博评论

爬取字段含:
微博id、评论页码、评论id、评论时间、评论点赞数、评论者IP归属地、评论者姓名、评论者id、评论者性别、评论者关注数、评论者粉丝数、评论内容。

三、爬虫代码

上次在文章中讲到,微博有3种访问方式,分别是:

PC端网页:https://weibo.com/
移动端:https://weibo.cn/
手机端:https://m.weibo.cn/

本次依然采用第3种访问方式爬取,即,通过手机端爬取。
打开张天爱的目标微博:https://m.weibo.cn/detail/4806418774099867
URL地址中的"4806418774099867"就是微博id了。
查看微博id和目标URL

cookie从哪里获取呢?看截图:
获取cookie

把微博id带入到Python爬虫代码中,下面展示部分爬虫代码。

关键逻辑来了!
关键逻辑来了!
关键逻辑来了!
重要的事情说三遍,外加敲黑板!!
关键逻辑:(非常关键!如果处理不好,就只能爬到第1页,很多小伙伴卡在这了)

max_id的处理:

if page == 1:  # 第一页,没有max_id参数
	url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'.format(weibo_id, weibo_id)
else:  # 非第一页,需要max_id参数
	if max_id == '0':  # 如果发现max_id为0,说明没有下一页了,break结束循环
		print('max_id is 0, break now')
		break
	url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0&max_id={}'.format(weibo_id,
	                                                                                        weibo_id,
	                                                                                        max_id)

如果是第一页,不用传max_id参数。
如果非第一页,需要传max_id参数,它的值来自于上一页的r.json()['data']['max_id']
下面,就是正常爬虫逻辑了。
首先,向微博页面发送请求:

r = requests.get(url, headers=headers)  # 发送请求
print(r.status_code)  # 查看响应码
print(r.json())  # 查看响应内容

下面,是解析数据的处理逻辑:

datas = r.json()['data']['data']
for data in datas:
	page_list.append(page)
	id_list.append(data['id'])
	dr = re.compile(r'<[^>]+>', re.S)  # 用正则表达式清洗评论数据
	text2 = dr.sub('', data['text'])
	text_list.append(text2)  # 评论内容
	time_list.append(trans_time(v_str=data['created_at']))  # 评论时间
	like_count_list.append(data['like_count'])  # 评论点赞数
	source_list.append(data['source'])  # 评论者IP归属地
	user_name_list.append(data['user']['screen_name'])  # 评论者姓名
	user_id_list.append(data['user']['id'])  # 评论者id
	user_gender_list.append(tran_gender(data['user']['gender']))  # 评论者性别
	follow_count_list.append(data['user']['follow_count'])  # 评论者关注数
	followers_count_list.append(data['user']['followers_count'])  # 评论者粉丝数

最后,是保存数据的处理逻辑:

df = pd.DataFrame(
	{
		'微博id': [weibo_id] * len(time_list),
		'评论页码': page_list,
		'评论id': id_list,
		'评论时间': time_list,
		'评论点赞数': like_count_list,
		'评论者IP归属地': source_list,
		'评论者姓名': user_name_list,
		'评论者id': user_id_list,
		'评论者性别': user_gender_list,
		'评论者关注数': follow_count_list,
		'评论者粉丝数': followers_count_list,
		'评论内容': text_list,
	}
)
if os.path.exists(v_comment_file):  # 如果文件存在,不再设置表头
	header = False
else:  # 否则,设置csv文件表头
	header = True
# 保存csv文件
df.to_csv(v_comment_file, mode='a+', index=False, header=header, encoding='utf_8_sig')
print('结果保存成功:{}'.format(v_comment_file))

篇幅有限,请求头、cookie、循环页码、数据清洗等其他细节不再赘述。

四、同步视频

详细讲解源码:
https://www.bilibili.com/video/BV1cd4y1R7Mf/

五、获取完整源码

附完整源码:【2023微博评论爬虫】用python爬上千条微博评论,突破15页限制!


推荐阅读:
微博评论分析大屏:马哥python说:【技术流吃瓜】python大屏分析"张天爱"微博网友评论
爬微博搜索结果:马哥python说:【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例

标签:评论者,list,微博,评论,15,data,id
From: https://www.cnblogs.com/mashukui/p/17462967.html

相关文章

  • AntDB数据库入选艾媒金榜《2023年中国信创数据库企业TOP15》,位列前三
    近日,iiMediaRanking艾媒金榜最新公布了《2023年中国信创数据库企业TOP15》榜单,AntDB数据库凭借先进的技术服务及近些年在信创市场的优异表现进入榜单前三。图1:艾媒金榜《2023年中国信创数据库企业TOP15》iiMediaRanking艾媒金榜《2023年中国信创数据库企业TOP15》是依托艾媒自主......
  • 1156. 单字符重复子串的最大长度
    如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/swap-for-longest-repeated-......
  • CF1559D2 Mocha and Diana (Hard Version) 题解
    Luogu|Codeforces题意给定两个森林\(A\)和\(B\),均有编号\(1\)到\(n\)的节点,边数分别为\(m_1,m_2\)。现在进行加边操作,但是有两个要求:如果在第一个森林加一条\((u,v)\)的边,第二个森林也要进行同样的操作。反之同理。加边后两个森林依旧是森林。一棵树也是森林。......
  • 7.15 字符串的截取
    substring,经常结合indexOf,lastIndexOf使用,Stringstr="www.mldn.cn";System.out.println(str.substring(4));//4之后都截取System.out.println(str.substring(4,8));//截取4-8,和php不同,后面的参数不是截取的长度;......
  • 215. 数组中的第K个最大元素
    给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。 示例1:输入:[3,2,1,5,6,4],k=2输出:5示例 2:输入:[3,2,3,1,2,4,5,5......
  • 基于IMOOC强力django+杀手级xadmin 打造上线标准的在线教育平台课程的学习(15)——xadmi
    应该是use_bootswacth首页多了一个主题设置按钮:可以选择不同的主题:importxadminfromxadminimportviewsfrom.modelsimportEmailVerifyRecord,Banner,UserProfileclassBaseSetting(object):enable_themes=Trueuse_bootswatch=TrueclassGlobalSet......
  • Codeforces 1566G - Four Vertices(线段树分治)
    交了整整2页,本来想用随机化卡过去的,后来发现我的实现跑得太慢就写正常做法了。首先发现最优答案对应的四个点只可能有以下两种可能:\(a,b\)间有边,\(c,d\)间有边,此时答案是\(a,b\)边权值加\(c,d\)边权值。\(a\)与\(b,c,d\)三个点间都有边,此时答案是三条边权值之和。......
  • 1502. Can Make Arithmetic Progression From Sequence
    /***1502.CanMakeArithmeticProgressionFromSequence*https://leetcode.com/problems/can-make-arithmetic-progression-from-sequence/description/*Asequenceofnumbersiscalledanarithmeticprogressionifthedifferencebetweenanytwoconsecut......
  • Codeforces 1588F - Jumping Through the Array
    显然无法用polylog的数据结构维护,序列分块也不行,考虑询问分块。每\(B\)个询问处理一次。将这个询问中\(2,3\)操作涉及到的点设为“关键点”,那么容易发现,环上每一段以关键点结尾的链在这块操作的过程中始终保持不变,也就是说我们可以把它们缩在一起。先预处理出每个块的增量......
  • 115. 不同的子序列
    给你两个字符串s和t,统计并返回在s的子序列中t出现的个数。题目数据保证答案符合32位带符号整数范围。示例1:输入:s="rabbbit",t="rabbit"输出:3解释:如下所示,有3种可以从s中得到"rabbit"的方案。rabbbitrabbbitrabbbit>动态规划首先dp[i][j]......