使用爬虫爬取微博评论

embedded/2024/9/23 10:17:28/

具体步骤如下👇👇👇:

Step1:电脑访问手机端微博_https://m.weibo.cn/_

Step2:打开一条微博_https://m.weibo.cn/detail/4907031376694279_

Step3:URL地址中的_49070__31376694279_就是需要爬取的微博ID

Step4:将ID填写到_main_下即可,也支持同时填写多个

完整代码:

import os
import requests
import pandas as pd
import datetime
from time import sleep
import random
# from fake_useragent import UserAgent
import re
def trans_time(v_str):"""转换GMT时间为标准格式"""GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'timeArray = datetime.datetime.strptime(v_str, GMT_FORMAT)ret_time = timeArray.strftime("%Y-%m-%d %H:%M:%S")return ret_time
def tran_gender(gender_tag):"""转换性别"""if gender_tag == 'm':return '男'elif gender_tag == 'f':return '女'else:  # -1return '未知'
def get_comments(v_weibo_ids, v_comment_file, v_max_page):"""爬取微博评论:param v_weibo_id: 微博id组成的列表:param v_comment_file: 保存文件名:param v_max_page: 最大页数:return: None"""for weibo_id in v_weibo_ids:# 初始化max_idmax_id = '0'# 爬取前n页,可任意修改for page in range(1, v_max_page + 1):wait_seconds = random.uniform(0, 1)  # 等待时长秒print('开始等待{}秒'.format(wait_seconds))sleep(wait_seconds)  # 随机等待print('开始爬取第{}页'.format(page))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 str(max_id) == '0':  # 如果发现max_id为0,说明没有下一页了,break结束循环print('max_id is 0, break now')breakurl = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0&max_id={}'.format(weibo_id,weibo_id,max_id)# 发送请求# ua = UserAgent(verify_ssl=False)headers = {"user-agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',# 如果cookie失效,会返回-100响应码"cookie": "__bid_n=1855e52f83c12780664207; FEID=v10-766d48bf476a5b99a31684e6d4b74c98b4d133a2; __xaf_fpstarttimer__=1672634141361; __xaf_thstime__=1672634141910; __xaf_fptokentimer__=1672634142056; _T_WM=91010151027; SCF=AhqqhuU0eySfXjT2vmQ5faXpqgHtzG0tpXf6Jh1xOrIiSqjsMXmKh4wsNBFg5ejqRMTI93-xSbS-Uduk_s4NRK8.; SUB=_2A25O5c7uDeRhGedI4lIU8C3PwzyIHXVqKdKmrDV6PUJbktAKLUz1kW1NVoZ-2WIGRSgsp51DeFB9dxRhRboM7px_; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhWcVXRXvfX3iep9.M98zpA5JpX5K-hUgL.Fo2c1K5fehe01h52dJLoIE2LxK.LBK.LB-eLxK-L1KeLBKH7wPxQdcRLxKnLB-qLBoBt; ALF=1678330814; FPTOKEN=p16283+PpnoduGibvvEpa7Jm1K1HU2NhkUXcqTuOwltTEKQJhsj3jOo/s/CWN8838ew7/ie6v2DLIYzTNLo40f3l05g4fFF+kjYdomw3o20ziaJMA4VJXMtzUBj6vAo3zxEa+LfqjEUYQuqn3G1gHwOdB2At9OvAubnkHHfZSzJJo0v+TLKcmjTLExJW/OjHZyhR9bRoWqV/1ENZHuxKvsn7tn+pgwC2n28Q/ez8zMNkj6X0huMuaBeNA8HoQ8FuWjoyrXps7wwbRbBv8z4mumRRoqiXEOSOsASflCjKw6gkfJJ5oHmoh1hx43ugVTZqxpYLivp8aCToqFu/clIex5bB2b0WQdp59i9E1KqEiwRN6jxPjhl7EKQlruQclvFYRExGOw5KMKGZy/0CNraMcw==|PfOWxrz13V2fvzp/rEoL/lSANYW4voaw2PHjpWZ/njY=|10|b67122b33a5e1ebb87032fafdc0126ba; XSRF-TOKEN=eceae9; WEIBOCN_FROM=1110006030; mweibo_short_token=87f071037d; MLOGIN=1; M_WEIBOCN_PARAMS=oid=4865363672566456&luicode=10000011&lfid=102803&uicode=20000061&fid=4865363672566456","accept": "application/json, text/plain, */*","accept-encoding": "gzip, deflate, br","accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7","referer": "https://m.weibo.cn/detail/{}".format(weibo_id),"x-requested-with": "XMLHttpRequest","mweibo-pwa": '1',}r = requests.get(url, headers=headers)  # 发送请求print(r.status_code)  # 查看响应码# print(r.json())  # 查看响应内容try:max_id = r.json()['data']['max_id']  # 获取max_id给下页请求用datas = r.json()['data']['data']except Exception as e:print('excepted: ' + str(e))continuepage_list = []  # 评论页码id_list = []  # 评论idtext_list = []  # 评论内容time_list = []  # 评论时间like_count_list = []  # 评论点赞数source_list = []  # 评论者IP归属地user_name_list = []  # 评论者姓名user_id_list = []  # 评论者iduser_gender_list = []  # 评论者性别follow_count_list = []  # 评论者关注数followers_count_list = []  # 评论者粉丝数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'])  # 评论者iduser_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({'max_id': max_id,'微博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 = Falseelse:  # 否则,设置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))if __name__ == '__main__':weibo_id_list = ['4907031376694279', ]  # 指定爬取微博id,可填写多个idmax_page = 1  # 爬取最大页数comment_file = '数据评论.csv'# 如果结果文件存在,先删除if os.path.exists(comment_file):os.remove(comment_file)# 爬取评论get_comments(v_weibo_ids=weibo_id_list, v_comment_file=comment_file, v_max_page=max_page)


http://www.ppmy.cn/embedded/90727.html

相关文章

网络面经

1.TCP头格式有哪些&#xff1f; 图解TCP头部格式 详情 源端口和目的端口 端口的作用是什么&#xff1f; 端口的作用是在网络中唯一表示一台主机中的一个进程 序列号 什么是序列号&#xff1f; 用来给传输的字节标号的 比如要传10个字节 那么给第一个字节标号为1001 那么第十…

大数据应用【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 大数据在许多领域应用互联网领域应用生物医学…

鸿蒙媒体开发【相机数据采集保存】音频和视频

相机数据采集保存 介绍 本示例主要展示了相机的相关功能&#xff0c;使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像&#xff0c;以及对焦、曝光等控制类功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机&#xff1f;…

玄机-第二章-日志分析-apache日志分析

1.题目 2. 启动靶机并用连接工具连接靶机 2.1 提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a;(flag{ip}) 注&#xff1a;Apache的日志文件通常存储在/var/log/apache2/或/var/log/httpd/目录下 切换并查看Apache日志文件得到flag flag{192.168.200.2} 2.2 黑…

【vue-cli】vue-cli@2源码学习

vue-cli 2 源码 @vue/cli: 3.11.0创建项目 vue create 项目名称 @vue/cli: 2.x.x 创建项目 vue init webpack yhh-project 脚手架初始化项目流程: 下载vue/cli@2 源码 下载完成后初始化 npm i 创建项目 vue init webpack yhh-project vue-init: bin/vue-init #!/usr/bin/e…

rust 初探 -- 常用的集合

rust 初探 – 常用的集合 Vector 存储在堆内存上的数据&#xff0c;运行时可以动态变大或者变小。 Vec 特性&#xff1a; 由标准库提供&#xff0c;可以存储多个相同类型的值&#xff0c;并且值在内存中连续存放 Vector 的创建 fn main() {// Vec::new()let v: Vec<i32…

Java中等题-最长回文子串(力扣)

给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 示例1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "cbbd" 输…

redis面试(三)Hash数据结构

HASH 哈希&#xff0c;在redis底层实现的时候&#xff0c;数据的结构叫做dict 这个Dict就是一个用于维护key和value映射关系的数据结构&#xff0c;与很多语言中的Map类型相似。 本质上也是一个数组链表的形式存在&#xff0c;不同的点在于&#xff0c;每个dict中是可以存在…