从Reddit上的线程检索所有注释

2024-10-01 13:43:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉API,也不熟悉JSON,希望能在这里得到一些帮助

我知道我想要完成的每件事都可以用PRAW库来完成,但我正在努力在没有PRAW的情况下找出答案

我有一个for循环,它从一个特定的子Reddit中提取文章标题,将所有的文章标题输入到一个pandas数据帧中,在达到限制后,将‘after参数更改为最后一个文章id,以便在下一批中重复

一切都很完美,但当我在一个特定线程中尝试相同的技术并收集注释时,‘after’参数无法抓取下一批

我假设‘after’在线程中的工作方式与在子Reddits帖子中的工作方式不同。我在JSON中看到了一个ID列表。我需要用这个吗?当我查看线程的JSON时,‘after’表示‘none’,即使使用了更新的参数

你知道我需要改变什么吗?这可能很简单

获取限制为5的subreddit帖子的工作代码:

params = {"t":"day","limit":5}
for i in range(2):
    response = requests.get('https://oauth.reddit.com/r/stocks/new',
                            headers=headers, params = params)
    response = response.json()
    for post in response['data']['children']:
        name = post['data']['name']
        print('name',name)
    params['after'] = name
    print(params)

给出输出:

name t3_lifixn
name t3_lifg68
name t3_lif6u2
name t3_lif5o2
name t3_lif3cm
{'t': 'day', 'limit': 5, 'after': 't3_lif3cm'}
name t3_lif26d
name t3_lievhr
name t3_liev9i
name t3_liepud
name t3_lie41e
{'t': 'day', 'limit': 5, 'after': 't3_lie41e'}

限制为10的Reddit线程代码

params = {"limit":10}
for i in range(2):
    response = requests.get('https://oauth.reddit.com/r/wallstreetbets/comments/lgrc39/',
                            params = params,headers=headers)
    response = response.json()
    for post in response[1]['data']['children']:
        name = post['data']['name']
        print(name)
    params['after'] = name
    print(params)

给出输出:

t1_gmt20i4
t1_gmzo4xw
t1_gmzjofk
t1_gmzjkcy
t1_gmtotfl
{'limit': 10, 'after': 't1_gmtotfl'}
t1_gmt20i4
t1_gmzo4xw
t1_gmzjofk
t1_gmzjkcy
t1_gmtotfl
{'limit': 10, 'after': 't1_gmtotfl'}

尽管限制设置为10,但在继续循环之前只给出了5个id。另外,它没有更新'after'参数,而是重新启动


Tags: nameinfordata参数responseparamspost
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:51

我终于想出了办法。阅读Reddit API的文档,当你在一个线程中,想要获取更多的注释时,你必须从JSON中的more部分编译一个id的列表。它是一个嵌套树,如下所示:

{'kind': 'more', 'data': {'count': 161, 'name': 't1_gmuram8', 'id': 'gmuram8', 'parent_id': 't1_gmt20i4', 'depth': 1, 'children': ['gmuram8', 'gmt6mf6', 'gmubxmr', 'gmt63gl', 'gmutw5j', 'gmtpitn', 'gmtoec3', 'gmtnel0', 'gmt4p79', 'gmupqhx', 'gmv70rm', 'gmtu2sj', 'gmt2vc7', 'gmtmjai', 'gmtje0b', 'gmtkzzj', 'gmt93n5', 'gmtvsqa', 'gmumhat', 'gmuj73q', 'gmtor7c', 'gmuqcwv', 'gmt3lxe', 'gmt4l78', 'gmum9cm', 'gmt857f', 'gmtjrz3', 'gmu0qcl', 'gmt9t9i', 'gmt8jc7', 'gmurron', 'gmt3ysv', 'gmt6neb', 'gmt4v3x', 'gmtoi6t']}}

使用get请求时,您将使用以下url和格式

requests.get(https://oauth.reddit.com/api/morechildren/.json?api_type=json&link_id=t3_lgrc39&children=gmt20i4,gmuram8....etc)

相关问题 更多 >