现在是一个专业的时代,要早一点成为一个专家
空空荡荡而又满满当当<---------------------------------> 昏昏沉沉却又明明白白
哈喽,各位小伙伴大家好呐,这些天一直忙其它事情,回头发现已经好几天没更新爬虫专辑了,今天给大家整一首Python爬取微博评论,哈哈但是最后有点小丑(微博被封号了一段时间),下面大家一起来看操作!
一: 核心过程步骤
-
找api接口,获取json文本数据
-
分析主评论与子评论url链接参数从而进行拼接
-
分别爬取主评论与子评论数据并导入到execl表格中
二: Search评论接口
首先微博搜索一个博主,点击进入博主发一条微博信息界面!
然后得从PC端观看模式切换为手机端观看模式,PC端参数过于复杂(小夜斗在PC端挣扎了三天结果最后拼接出来的url啥也没有,但是手机端一天就就弄好了)!
然后呢从一大堆文件中找到存放评论信息api接口(小夜斗这边建议选择xhr格式查找,一般都是ajax格式加载出的信息)
将这个url链接复制到网址链接上面,在将网址显示出的内容复制粘贴到json.cn这个json格式加载网站,如图所示:
让小夜斗先对这个json文件数据进行爬取一下吧,小试牛刀先爬取一个url链接,需要爬取的数据如下所示:
核心数据抓取代码,访问接口,获取json数据格式即可!
import requests
import json
from tqdm import tqdm
import datetime
import time
import random
import csv
# 一条主微博链接部分评论, 需要构造参数max_id获取全部ajax
up_main_url = 'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id_type=0'
headers = {
# ua代理
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75',
# 登录信息
'cookie': 'SINAGLOBAL=5702871423690.898.1595515471453; SCF=Ah2tNvhR8eWX01S-DmF8uwYWORUbgfA0U3GnciJplYvqE1sn2zJtPdkJ9ork9dAVV8G7m-9kbF-PwIHsf3jHsUw.; SUB=_2A25NDifYDeRhGeBK7lYS9ifFwjSIHXVu8UmQrDV8PUJbkNANLRmlkW1NR7rne18NXZNqVxsfD3DngazoVlT-Fvpf; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhhI1TcfcjnxZJInnV-kd405NHD95QcSh-Xe0q41K.RWs4DqcjQi--ciK.RiKLsi--Ni-24i-iWi--Xi-z4iKyFi--fi-2XiKLhSKeEeBtt; wvr=6; _s_tentry=www.sogou.com; UOR=,,www.sogou.com; Apache=9073188868783.379.1611369496580; ULV=1611369496594:3:3:3:9073188868783.379.1611369496580:1611281802597; webim_unReadCount=%7B%22time%22%3A1611369649613%2C%22dm_pub_total%22%3A0%2C%22chat_group_client%22%3A0%2C%22chat_group_notice%22%3A0%2C%22allcountNum%22%3A63%2C%22msgbox%22%3A0%7D'
}
response = requests.get(url=up_main_url, headers=headers)
if response.status_code == 200:
text = response.text.encode("gbk", "ignore").decode("gbk", "ignore") # 解决报错双重严格限制
content = json.loads(text) # 将文本转为json格式
try:
data = content['data']['data'] # 获取评论列表
for comment in tqdm(data, desc='花花评论爬取加载进度--->!'):
time.sleep(random.random())
text = str(comment['text']) # 获取文本信息
# 卧槽,我房子又塌了<span class="url-icon">
# 处理文本信息,find函数找到<span开始的索引
if text.find('<span') != -1:
text = text[:text.find('<span')]
create_time = comment['created_at'] # 发布时间
# 格林威治时间格式字符串 Wed Jul 10 20:00:09 +0800 2019 转换为好理解的标准时间格式 2019-07-10 20:00:09
# Fri Jan 22 17:56:48 +0800 2021 转换为标准时间格式 2021/1/22 17:56:48
std_transfer = '%a %b %d %H:%M:%S %z %Y' # 转换的一个格式
std_create_time = datetime.datetime.strptime(create_time, std_transfer)
user_name = comment['user']["screen_name"] # 用户姓名
user_id = comment['user']['id'] # 用户id
user_followers_count = comment['user']['followers_count'] # 该用户粉丝数
user_follow_count = comment['user']['follow_count'] # 该用户关注数
user_gender = comment['user']['gender'] # 用户性别
total_number = comment["total_number"] # 总回复数
like_count = comment["like_count"] # 点赞数
flag_id = comment["id"] # 二级评论url构造所需id
print('')
# print(f'内容: {text}')
# print(f'用户名: {user_name}')
# print(f'评论时间: {std_create_time}')
# print(f'id:{user_id}')
# print(f'关注人数: {user_follow_count}')
# print(f'粉丝: {user_followers_count}')
# print(f'性别: {user_gender}')
# print(f'回复数量: {total_number}')
# print(f'点赞数: {like_count}')
# print(f'cid: {flag_id}')
#print('成功保存信息!')
except:
print("啊这,今晚是上分局!被反爬了")
pass
上述代码简单的访问api接口,获取评论内容、评论用户名、点赞数量、回复数、点赞时间等必要信息,将其保存为csv文件导入execl表格中,表中部分信息如图所示:
上述代码是一条微博下面部分主评论的数据爬取,还有一部分主评论是ajax加载出来的,需要参数构造url链接!主评论下面子评论回复信息爬取与上述代码类似,因篇幅问题就不过多展示,文末自取即可!
参数构造的url规律
爬取主评论api接口参数需要:max_id (可直接从第一个主评论api接口中的json数据中获取得到)
爬取子评论api接口参数需要: cid(可直接从第一个主评论api接口中的json数据中获取得到)、max_id(需要从子评论接口中json数据中获取得到)
ps:两个max_id参数来源不一样:一个是从主评论api接口获得,一个是从子评论api接口获得
# 构造主评论url链接
# 获取构造ajax主评论url全部max_id参数
def main_max_id():
# 以没有内容报错作为终止条件break跳出
while len(max_id_url_list) < 200:
print("正在休眠中")
time.sleep(random.randint(1, 3)) # 休眠
print("休眠完毕啦")
if (len(max_id_list) == 0):
main_url = 'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id_type=0'
max_id_url_list.append(main_url)
else:
main_url = f'https://m.weibo.cn/comments/hotflow?id=4596226979532970&mid=4596226979532970&max_id={max_id_list[-1]}&max_id_type=0'
max_id_url_list.append(main_url)
try:
content = requests_json(main_url)
max_id = content['data']["max_id"] # 获得主评论需要得参数max_id来构造url链接
max_id_list.append(max_id)
# TODO: 写一个终止条件, 什么时候不在获取max_id
data = content['data']['data'] # 获取评论列表
for comment in data: # 循环遍历
cid = comment["id"] # 二级评论url构造所需id
cid_list.append(cid) # 添加
except:
print("最后一条max_id打底啦!该跳出走人咯!")
break
代码运行如图所示,采取双线程方式进行爬取,成功获取微博数据
以上就是本期分享地微博评论爬取啦,篇幅过长,想获取全部源码的小伙伴们请持续关注小夜斗的微信公众号:夜斗小神社
后台回复"005微博数据"即可获得全部源码!
请持续关注夜斗小神社,爬虫路上不迷路!
- 在这个星球上,你很重要,请珍惜你的珍贵! ~~~夜斗小神社