Я пытаюсь получить сообщения от subreddit. Я пробовал PRAW, но потом я обнаружил, что в списке есть ограничение в 1000 сообщений. Мне нужно больше, поэтому я попытался использовать pushshift.io. Я следовал за учебником, и код ниже. Однако я не могу получить само сообщение: если я использую submisson.selftext
, он возвращает пустую строку, а если я использую только submission
, он возвращает Submisson(id=)
.
def make_request(uri, max_retries = 5):
def fire_away(uri):
response = requests.get(uri)
assert response.status_code == 200
return json.loads(response.content)
current_tries = 1
while current_tries < max_retries:
try:
time.sleep(1)
response = fire_away(uri)
return response
except:
time.sleep(1)
current_tries += 1
return fire_away(uri)
def pull_posts_for(subreddit, start_at, end_at):
def map_posts(posts):
return list(map(lambda post: {
'id': post['id'],
'created_utc': post['created_utc'],
'prefix': 't4_'
}, posts))
SIZE = 500
URI_TEMPLATE = r'https://api.pushshift.io/reddit/search/submission?subreddit={}&after={}&before={}&size={}'
post_collections = map_posts( \
make_request( \
URI_TEMPLATE.format( \
subreddit, start_at, end_at, SIZE))['data'])
n = len(post_collections)
while n == SIZE:
last = post_collections[-1]
new_start_at = last['created_utc'] - (10)
more_posts = map_posts( \
make_request( \
URI_TEMPLATE.format( \
subreddit, new_start_at, end_at, SIZE))['data'])
n = len(more_posts)
post_collections.extend(more_posts)
return post_collections
subreddit = 'fear'
end_at = math.ceil(datetime.utcnow().timestamp())
start_at = math.floor((datetime.utcnow() -
timedelta(days=365*55)).timestamp())
posts = pull_posts_for(subreddit, start_at, end_at)
reddit = praw.Reddit(client_id=cid,
client_secret=secret, password=pass_word,
user_agent='anything', username=user_name)
posts_from_reddit = []
for submission_id in np.unique([ post['id'] for post in posts ]):
submission = reddit.submission(id=submission_id)
posts_from_reddit.append(submission)
Я не уверен, что нужно сделать, чтобы получить содержание целых постов?