【爬虫实战】用Python采集任意小红书笔记下的评论,爬了10000多条,含二级评论!

一、爬取目标

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

我们继续分享Python爬虫的案例,今天爬取小红书上指定笔记("巴勒斯坦"相关笔记)下的评论数据。

老规矩,先展示结果:

截图1:
截图1

截图2:
截图2

截图3:
截图3

共爬取了1w多条"巴勒斯坦"相关评论,每条评论含10个关键字段,包括:

笔记链接, 页码, 评论者昵称, 评论者id, 评论者主页链接, 评论时间, 评论IP属地, 评论点赞数, 评论级别, 评论内容。

其中,评论级别包括:根评论、二级评论及二级展开评论。

二、爬虫代码讲解

2.1 分析过程

任意打开一个小红书笔记的评论,打开浏览器的开发者模式,网络,XHR,找到目标链接的预览数据,如下:
开发者模式

由此便得到了前端请求链接,下面开始开发爬虫代码。

2.2 爬虫代码

首先,导入需要用到的库:

import requests
from time import sleep
import pandas as pd
import os
import time
import datetime
import random

定义一个请求头:

# 请求头
h1 = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    # cookie需定期更换
    'Cookie': '换成自己的cookie值',
}

经过我的实际测试,请求头包含User-Agent和Cookie这两项,即可实现爬取。

其中,Cookie很关键,需要定期更换。那么Cookie从哪里获得呢?方法如下:
获取Cookie方法

下面,开发翻页逻辑。

由于我并不知道一共有多少页,往下翻多少次,所以采用while循环,直到触发终止条件,循环才结束。

那么怎么定义终止条件呢?我注意到,在返回数据里有一个叫做"has_more"的参数,大胆猜测它的含义,是否有更多数据,正常情况它的值是true。如果它的值是false,代表没有更多数据了,即到达最后一页了,也就该终止循环了。

因此,核心代码结构应该是这样(以下是伪代码,主要是表达逻辑,请勿直接copy):

while True:
    # 发送请求
    r = requests.get(url, headers=h1)
    # 解析数据
    json_data = r.json()
    # 逐条解析
    for c in json_data['data']['comments']:
        # 评论内容
        content = c['content']
        content_list.append(content)
    # 保存数据到csv
    。。。
    # 判断终止条件
    next_cursor = json_data['data']['cursor']
    if not json_data['data']['has_more']:
        print('没有下一页了,终止循环!')
        break
    page += 1

另外,还有一个关键问题,如何进行翻页。

查看请求参数,如下:
请求参数中的cursor

这里的游标,就是向下翻页的依据,因为每次请求的返回数据中,也有一个cursor:
返回数据中的cursor

大胆猜测,返回数据中的cursor,就是给下一页请求用的cursor,所以,这部分的逻辑实现应该如下(以下是伪代码,主要是表达逻辑,请勿直接copy):

while True:
    if page == 1:
        url = 'https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={}&top_comment_id=&image_scenes=FD_WM_WEBP,CRD_WM_WEBP'.format(
            note_id)
    else:
        url = 'https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={}&top_comment_id=&image_scenes=FD_WM_WEBP,CRD_WM_WEBP&cursor={}'.format(
            note_id, next_cursor)
    # 发送请求
    r = requests.get(url, headers=h1)
    # 解析数据
    json_data = r.json()
    # 得到下一页的游标
    next_cursor = json_data['data']['cursor']

另外,我在第一章节提到,还爬到了二级评论及二级展开评论,怎么做到的呢?
经过分析,返回数据中有个节点sub_comment_count代表子评论数量,如果大于0代表该评论有子评论,进而可以从sub_comments节点中爬取二级评论。

其中,二级展开评论,请求参数中的root_comment_id代表父评论的id,其他逻辑同理,不再赘述。

最后,是顺理成章的保存csv数据:

# 保存数据到DF
df = pd.DataFrame(
    {
        '笔记链接': 'https://www.xiaohongshu.com/explore/' + note_id,
        '页码': page,
        '评论者昵称': nickname_list,
        '评论者id': user_id_list,
        '评论者主页链接': user_link_list,
        '评论时间': create_time_list,
        '评论IP属地': ip_list,
        '评论点赞数': like_count_list,
        '评论级别': comment_level_list,
        '评论内容': content_list,
    }
)
# 设置csv文件表头
if os.path.exists(result_file):
    header = False
else:
    header = True
# 保存到csv
df.to_csv(result_file, mode='a+', header=header, index=False, encoding='utf_8_sig')

至此,爬虫代码开发完毕。

完整代码中,还包含转换时间戳、随机等待时长、解析其他字段、保存Dataframe数据、多个笔记同时循环爬取等关键逻辑,详见演示视频。

三、演示视频

代码演示:【Python爬虫】用python爬了10000条小红书评论,以#巴勒斯坦#为例

四、获取完整源码

get完整源码:【爬虫实战】用Python采集任意小红书笔记下的评论,爬了10000多条,含二级评论!


我是@马哥python说,一名10年程序猿,持续分享python干货中!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容