#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}’
**
Как я
- Сохранить объект subreddit в формате JSON?
- Сохранить объект 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)"})
...