Subreddit, объект redditor в формате JSON

#python #json #api #praw

#python #json #API #praw

Вопрос:

Я хочу извлечь и сохранить весь объект subreddit в формате JSON. Я сталкивался со способами извлечения определенных полей из объекта subreddit и сохранения их в JSON, однако я хотел бы сохранить весь объект в JSON. Я пробовал несколько способов.

Во-первых, я сделал следующее:

 import requests
import pprint
import praw

ml_subreddit = reddit.subreddit('MachineLearning')
for submission1 in ml_subreddit.hot(limit=10):
    pprint.pprint(vars(submission1))
 

Это дает мне что-то похожее на JSON, и я могу получить доступ к некоторой информации о сообщении, как мы получили бы доступ к JSON. Тем не менее, я также хотел бы сохранить и получить доступ к объектам Redditor и comments также в формате JSON, что я не могу сделать с помощью этого метода.

Я попробовал другой метод:

 import requests

for submission1 in ml_subreddit.hot(limit=10):
   url = submission1.permalink
   response = requests.get('http://reddit.com'   url   '.json') 
   json = response.content

json
 

Это дает мне json-высказывание
**
b'{«сообщение»: «Слишком много запросов», «ошибка»: 429}’
**

Как я

  1. Сохранить объект subreddit в формате JSON?
  2. Сохранить объект Redditor и comments в формате JSON?

Заранее спасибо!

Комментарии:

1. Подумайте о «time.sleep ()» — если вы отправляете на сервер x запросов менее чем за секунду — это, очевидно, робот beaviour, и они могут запретить вам или ограничить ваш доступ. Эта ошибка может быть слишком большим количеством запросов за определенный интервал времени.

2. Я совершенно уверен, что praw должен позаботиться о том, чтобы вы не достигли предела скорости, используете ли вы его? Но, как сказал @Leemosh, время ожидания истекло.

3. Что я могу сделать, чтобы предотвратить это? Я использую praw. Я получил submission1, ml_subreddit и submission1.permalink с использованием praw. Как я могу использовать praw для ограничения запросов? Кроме того, как я могу использовать time.sleep() для ограничения запросов?

4. Я никогда не использовал prew, поэтому больше ничего об этом не знаю. Но вы можете попробовать использовать sleeps — просто поместите time.sleep(1) , например, под строку response = requests.get('http://reddit.com' url '.json') и не забудьте import time .

5. К сожалению, я все еще получаю одно и то же сообщение.

Ответ №1:

Ваш 2-й подход работает. Единственное, чего вам не хватало, это установить User-Agent заголовок. API Reddit требует этот заголовок, и в противном случае он возвращает ошибку «429 Слишком много запросов» (см. Инструкции Reddit API для получения дополнительной информации).

Это должно быть что-то уникальное и описательное. Предлагаемый формат <platform>:<app ID>:<version string> (by /u/<reddit username>) .

Так что для вас сработало бы что-то вроде этого (замените на свое собственное имя приложения и имя пользователя).:

 ...
response = requests.get('https://reddit.com'   url   '.json', headers={"User-Agent": "python:MyApp:v0.0.1 (by u/MyUser)"})
...