爬取微博评论内容

简介: 网友:看看胸女:滚 网友:美胸比赛女:[图片消息] ​​​​ 继上次知乎话题 拥有一副好身材是怎样的体验? 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的美胸大赛为例: https://m.weibo.cn/detail/4367970740108457 https://m.weibo.cn/detail/4348022520956497 这就是本次要获取的微博图片内容,共计672张很凶的照片: 下面是讲如何获取的,不感兴趣的话直接去公众号回复 套图 即可获得。

继上次知乎话题 拥有一副好身材是怎样的体验? 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的大赛为例:

https://m.weibo.cn/detail/4367970740108457

https://m.weibo.cn/detail/4348022520956497
要获取的微博图片内容,共计672张很凶的照片。

下面是讲如何获取的,不感兴趣的话直接去后台回复 套图 即可获得。


首先进入开发者工具看一下微博结构:

weibocom.png
这只是一小部分,微博评论和微博用户发的微博页面,里面都是以html5格式传到本地的,把内容格式化之后就会发现,层级非常复杂,有兴趣的可以看一下,与其解析这个还不如用selenium更简单一些。于是当时就产生了两个思路:

  • 借助 splash 直接解析渲染后的页面
  • 用 mitmproxy 抓手机APP微博的包,用 APPium 控制手机刷新评论

不管是哪一种,相对于只是获取一下图片而言都麻烦。于是去网上搜一下,搜索结果都是前两年爬取微博的方法,那时候还是用 ajax 以 json 格式传递,现在明显已经不是。

然后后面抱着侥幸心理把访问形式改成手机,微博域名就从 weibo.com 变成了 weibo.cn,再看一下 network 选项卡以hotflow 开头的 xhr :

weibocn.png

这时候 weibo.cn 传给本地信息就是简单的 json 格式啦。上图就是微博评论列表的评论,可以看到每条评论如果有图片,就会有 pic 属性,但是要注意在 pic 下的 直接子 url 只是预览图链接,并非原图。原图链接在pic 属性下 large 下的 url。其他的属性是一些微博的标题、发送时间、内容、点赞数、评论数、转发数和博主相关信息等。我们这次重点是图片,就不管其他的了。

另外微博的反爬措施很强,真的恶心到我了,如果有大规模爬取需求,建议去淘宝买号,建 Cookie池,或者用代理池不停地切换访问主机。如果只用自己电脑本地Cookie,那就把请求头弄全,并限制抓取速度。

切换到 Headers 选项卡,看一下 Request URL

https://m.weibo.cn/comments/hotFlowChild?cid=4376866645060411&max_id=152030087630286&max_id_type=0

可以看出它的格式是

https://m.weibo.cn/comments/hotFlowChild? + cid + max_id + max_id_type'

其中 cid 是每一条微博的唯一ID,max_id 是下一次传回数据的最后一条评论的 ID。也就是往下翻看评论,每次显示十条,并在这次所看的评论里就传回 下十条评论 的最后一条评论的唯一 ID,微博是根据这个 ID 传回下十条内容。这也就直接限制了每次爬评论、微博、二级评论时只能一次获取十条,也无法利用线程池加速,因为只有获取了这十条才知道下十条请求地址里 max_id 的值。

然后就可以由这些信息构造请求,获取 json 格式的响应结果:

comment_url = 'https://m.weibo.cn/comments/hotflow?id={weibo_id}&mid={weibo_id}&max_id={max_id}&max_id_type=0'
url = comment_url.format(weibo_id=id, max_id=0)
response = requests.get(url, headers=headers)
result = json.loads(response.text)

先获取总评论数来计算需要多少次才能爬完评论:

total_number = result.get('data').get('total_number')
total_number = int(total_number)
for i in range(int(total_number / 10)):
    result = get_page(weibo_id)
    for url in parse_comment(result):
        save_to_img(url)

下载完图片只有700来张才知道靠后的评论都是无用的(男士跟答主要联系方式什么的)评论。

然后就是获取图片地址:

def parse_comment(result):
    if result.get('ok') and result.get('data').get('data'):
        comments = result.get('data').get('data')
        for comment in comments:
            if comment.get('pic'):
                url = comment.get('pic').get('large').get('url')
                yield url

要先 if comment.get('pic') 一下,这很重要,因为很多无用评论并没有配图,也就是没有 pic 属性,要以这种方式过滤掉。

另外还有这个:

child_comment.png

这里的二级评论就很有必要爬一下,看一下结构:

child_com.png

值得注意的是二级评论里不管有没有图片都不会有 pic 属性,图片在回答内容text 里以 css 方式嵌套的,很明显就是 a 标签下的 href 属性 就是图片地址。用 pyquery 取出来地址:

childs_comment = result.get('data')
for child_comment in childs_comment:
    text = child_comment.get('text')
    content = pyquery.PyQuery(text)
    url = content('a').attr('href')
    yield url

存储图片以图片内容的 md5 值命名,可以去重:

response = requests.get(url)
if response.status_code == 200:img_path = '{0}/{1}.{2}'.format(path,md5(response.content).hexdigest(), 'jpg')  # 以图片的md5字符串命名防止重复图片

最后接入某大厂的人体特征值检测,考虑到图片大多没有露脸,识别男女性别不够准,这里只把未识别出人体的图片去掉了(一些表情图)。

有兴趣的可以回复 套图 获得这次微博图片和上次知乎图片

本次微博结构比较简单,与上次关于知乎的文章差不多,不再提供源码。

目录
相关文章
|
机器学习/深度学习 人工智能 自然语言处理
从前端智能化看“低代码/无代码”
什么是低代码/无代码开发?业界对于低代码/无代码开发是否存在其他不同的理解?低代码开发和无代码开发之间的区别是什么?
从前端智能化看“低代码/无代码”
|
数据采集 存储 自然语言处理
基于Python的微博热点李佳琦忒网友话题的评论采集和情感分析的方法,利用情感分析技术对评论进行情感倾向性判断
本文介绍了一种基于Python的方法,用于采集微博热点话题下的评论数据,并运用情感分析技术对这些评论进行情感倾向性判断,进而通过统计分析和可视化技术展示网友对特定话题的情感态度,对品牌或个人形象管理、用户需求发现、舆情监测和危机管理等方面具有重要价值。
440 2
基于Python的微博热点李佳琦忒网友话题的评论采集和情感分析的方法,利用情感分析技术对评论进行情感倾向性判断
|
前端开发 PHP 数据安全/隐私保护
WordPress独立资源下载页面插件,基于Xydown美化
xydown是一款wordpress的独立下载页面插件,主要适用于wp建站用户使用,有些用户在发布文章的时候想要添加一些下载资源,使用这款插件可以把下载的内容独立出来,支持添加本地下载或者百度网盘蓝奏网盘的网址,并且可以自定义文件信息,包括设置文件名称、文件大小、更新日志以及适用版本等内容,同时还支持自定义文件信息以及添加自定义广告等。
370 1
WordPress独立资源下载页面插件,基于Xydown美化
|
vr&ar 图形学
PICO4开发实战一:节奏光剑(VR)(需求文档)
这篇文章是PICO4开发实战指南,详细介绍了开发一款名为“节奏光剑”的VR游戏的需求文档,包括从基础功能开发到交互体验优化、场景体验优化、UI设计、游戏关卡设计等多个开发阶段的详细规划和说明。
PICO4开发实战一:节奏光剑(VR)(需求文档)
|
机器学习/深度学习 人工智能 算法
强化学习在复杂环境中的应用与挑战
【8月更文第9天】强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过智能体与环境的交互来学习最优策略。近年来,随着计算能力的提升和算法的进步,强化学习被广泛应用于各种复杂环境下的任务,如机器人导航、游戏策略优化等。本文将探讨强化学习在这些领域中的应用案例,并分析所面临的挑战及其潜在的解决方案。
1087 4
|
自然语言处理 算法 安全
Python实现贝叶斯算法疫情微博评论情感分析
Python实现贝叶斯算法疫情微博评论情感分析
Python实现贝叶斯算法疫情微博评论情感分析
|
存储 芯片
51单片机--DS1302时钟
51单片机--DS1302时钟
381 0
|
安全 Linux Android开发
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
|
算法
链表的头插法和尾插法
链表的头插法和尾插法
469 1
|
算法 BI
产品分析——抖音
产品分析——抖音
502 0