使用python爬取微博评论

2025-12-13 0 433

最近在复习以前学习的python爬虫内容,就拿微博来练了一下手,这个案例适合学习爬虫到中后期的小伙伴,因为他不是特别简单也不是很难,关键是思路,为什么说不是很难呢?因为还没涉及到js逆向,好了话不多说开干。

(1)找到要爬取的页面如下

使用python爬取微博评论

(2)点开评论,拉到最下方,如下位置:

使用python爬取微博评论

点击“点击查看”进入另一个页面,如下所示:

使用python爬取微博评论

这里会显示更多评论,但是不是全部,随便复制一条评论的内容,然后到源码里手搜索,发现是不存在的,这就说明我们想要的内容不在源码里,那就是二次加载的了,当我们第一次请求服务器的时候,服务器返回源码,但是里面没有评论,然后浏览器会二次请求服务器,这时服务器返回评论数据,形式为json数据,然后js会把数据加载进页面。好的,原理懂了,那么现在就开始正式的爬取了。

(3)打开浏览器的开发者工具,切换到网络选项,如果没抓到包,那就刷新一下页面,发现如下所示:

使用python爬取微博评论

记得切换到Fetch/XHR,这样我们要找评论所在的数据包时就会更加容易,一个一个的点点看,你会发现评论数据在buildComments?is_reload=1……里面,然后再看一下参数,如下所示:

使用python爬取微博评论

再看一下标头,如下所示:

使用python爬取微博评论

那么我们现在基本可以确定只要向标头里的地址发送get请求,带上参数,就可以得到json数据,但是,要记得这不是全部数据,当你继续往下滑查看评论时,他会继续请求数据,这时我们在抓包工具里进行过滤,就可以看到如下所示:

使用python爬取微博评论

点开查看,发现请求所带的参数不同了,如下所示:

使用python爬取微博评论

对比后发现,多了flow,max_id,并且count也变成了20,那么我们继续滑动,查看其他的请求,会发现除了max_id其他参数是不变的,经过我的试验,flow参数不是必要的,可以不带,因为有的帖子有这个参数有的帖子没有,其他的每个帖子都有,我们再看看其他的帖子发现不同的帖子id,max_id,uid是不同的,所以现在就确定了这三个参数是变化的。首先你会发现对于不同的帖子,uid就在地址里,应该就是作者的id,因为这个在源码里也是不存在的,所以我们就使用输入的方式获取uid,对于id,你会发现无论在地址里,还是源码里都找不到它,我经过仔细的观察,发现这个id在show?id=MjwcO7WjT这个数据包里,而他的参数id=MjwcO7WjT就在地址里,这个参数我们也采用输入的方式获取。现在就剩下max_id了,我们发现第一次请求不需要max_id,之后的都要,再观察一下第一个数据包里的max_id,正好是第二次请求的参数max_id,那么此时你可能已经有了猜想,每一次请求返回的json数据的max_id就是下一个请求的参数,经过我的辛苦劳动,证实我们的猜想是对的。

(4)现在我们已经把思路给理清了,那么代码就不多讲解了,我就直接给了,但是要注意headers里的cookie要换成自己的,这里的cookie为虚假的。这里说一下cookie的作用,带了你自己的cookie就相当与你登录了微博,现在就这样简单解释吧。

(5)完整代码:(注:这里没有爬取子评论,也就是回复)

import time
import csv
import requests

def getArticleId(id_str):
\”\”\”
:param id_str: 需要解密的id字符串
:return:
\”\”\”
url_id = \”https://weibo.com/ajax/statuses/show?id={}\”.format(id_str)
resp_id = requests.get(url_id, headers=headers)
article_id = resp_id.json()[\”id\”]
return article_id

def get_one_page(params):
\”\”\”
:param params: get请求需要的参数,数据类型为字典
:return: max_id:请求所需的另一个参数
\”\”\”
url = \”https://weibo.com/ajax/statuses/buildComments\”
resp = requests.get(url, headers=headers, params=params)
data_list = resp.json()[\”data\”]
for data in data_list:
data_dict = {
\”screen_name\”: data[\”user\”][\”screen_name\”],
\”profile_image_url\”: data[\”user\”][\”profile_image_url\”],
\”location\”: data[\”user\”][\”location\”],
\”created_time\”: data[\”created_at\”].replace(\”+0800\”, \”\”),
\”text\”: data[\”text_raw\”],
}
print(
f\’昵称:{data_dict[\”screen_name\”]}\\n头像:{data_dict[\”profile_image_url\”]}\\n地址:{data_dict[\”location\”]}\\n发布时间:{data_dict[\”created_time\”]}\\n评论内容:{data_dict[\”text\”]}\’)
print(\”=\” * 90)
saveData(data_dict)
max_id = resp.json()[\”max_id\”]
if max_id:
return max_id
else:
return

def get_all_data(params):
\”\”\”
:param params: get请求需要的参数,数据类型为字典
:return:
\”\”\”
max_id = get_one_page(params)
params[\”max_id\”] = max_id
params[\”count\”] = 20
while max_id:
params[\”max_id\”] = max_id
time.sleep(.5)
max_id = get_one_page(params)

def saveData(data_dict):
\”\”\”
:param data_dict: 要保存的数据,形式为dict类型
:return:
\”\”\”
writer.writerow(data_dict)

if __name__ == \’__main__\’:
uid = input(\”请输入作者id:\”)
id_str = input(\”请输入您要爬取的微博话题的英文id:\”)
fileName = input(\”请输入要保存的文件名:\”)
headers = {
\”user-agent\”: \”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \”
\”Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46 \”,
\”x-requested-with\”: \”XMLHttpRequest\”,
\”referer\”: \”https://weibo.com/1779719003/{}\”.format(id_str),
\”cookie\”: \”替换为自己的cookie\”,
\”x-xsrf-token\”: \”-YYOKoKzkyMDGhDmhVSCLqpD\”
}

id = getArticleId(id_str) # 获取参数需要的真正id

# 向csv文件写入表头
header = [\”screen_name\”, \”profile_image_url\”, \”location\”, \”created_time\”, \”text\”]
f = open(f\”csv/{fileName}.csv\”, \”w\”, encoding=\”utf-8\”, newline=\”\”)
writer = csv.DictWriter(f, header)
writer.writeheader()

# get请求的参数
params = {
\”is_reload\”: 1,
\”id\”: id,
\”is_show_bulletin\”: 2,
\”is_mix\”: 0,
\”count\”: 10,
\”uid\”: int(uid)
}

get_all_data(params)
f.close()
print(\”数据爬取完毕。\”)

效果如下:

使用python爬取微博评论

注意:csv文件路径修改为自己的,如果爬取过程中出现400 bad request,那么你被发现了是爬虫,可以考虑把睡眠时间改长些,如果还不行的话,有基础的伙伴们可以使用ip代理或使用随机的user-agent。

来源:https://www.cnblogs.com/minqiliang/p/16985227.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 使用python爬取微博评论 https://www.zuozi.net/36169.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务