2015-06-23 6 views
4
import praw 

def get_data_reddit(search): 
    username="" 
    password="" 
    r = praw.Reddit(user_agent='') 
    r.login(username,password,disable_warning=True) 
    posts=r.search(search, subreddit=None,sort=None, syntax=None,period=None,limit=None) 
    title=[] 
    for post in posts: 
     title.append(post.title) 
    print len(title) 


search="stackoverflow" 
get_data_reddit(search) 

Ouput = 953Reddit поиск API не дает все результаты

Почему ограничение?

  1. Documentation упоминает

Мы можем получить максимум 1000 результатов от каждого списка, это выше ограничение на Reddit. Мы ничего не можем сделать, чтобы пройти этот предел. Но мы можем получить желаемые результаты с помощью метода поиска() .

Любое обходное решение? Я надеюсь, что каким-то образом преодолеть в API, я написал скребок для данных twitter и считаю, что это не самое эффективное решение.

Тот же вопрос: https://github.com/praw-dev/praw/issues/430 Пожалуйста, обратитесь к вышеуказанной ссылке для соответствующей дискуссии.

+1

Это относительно обычная практика для API, чтобы люди не перегружали запросы с помощью запросов. Обычно вы можете обойти его, сделав ваши поисковые запросы более конкретными и перейдя через определенный набор, например. сохраняйте запросы в определенный день и прокручивайте последние десять дней, или что-то, что reddit позволит этим работать, – Scironic

+0

@Scironic Спасибо! Это кажется гораздо лучшим решением, чем скребок. Можете ли вы привести пример для разъяснения. Было бы очень полезно. Может быть, пройдет, когда reddit начнет текущее время. –

ответ

8

Предельной результаты на поиск или список является общей тактикой для снижения нагрузки на серверы. API reddit ясно, что это то, что он делает (как вы уже отметили). Однако это не останавливается на достигнутом ...

API также поддерживает различные результаты поиска для списков. Поскольку это постоянно изменяющаяся база данных, они не предоставляют страницы, но вместо этого позволяют вам выбирать, где вы остановились, используя параметр «после». Это задокументировано here.

Теперь, когда я не знаком с PRAW, я вижу, что reddit search API соответствует синтаксису листинга. Я думаю, вам просто нужно переиздать ваш поиск, указав дополнительный параметр «после» (ссылаясь на ваш последний результат от первого поиска).

После того, как вы попробовали, появляется PRAW, искренне возвращающий вам все результаты, которые вы просили.

В соответствии с запросом OP, вот код, который я написал, чтобы посмотреть результаты, выложенные по ссылке.

import praw 

def get_data_reddit(search, after=None): 
    r = praw.Reddit(user_agent='StackOverflow example') 
    params = {"q": search} 
    if after: 
     params["after"] = "t3_" + str(after.id) 
    posts = r.get_content(r.config['search'] % 'all', params=params, limit=100) 
    return posts 

search = "stackoverflow" 
post = None 
count = 0 
while True: 
    posts = get_data_reddit(search, post) 
    for post in posts: 
     print(str(post.id)) 
     count += 1 
    print(count) 
+0

Спасибо за ответ! Но могу сказать, как достичь этого - питон. –

+1

Глядя на код PRAW, вам просто нужно добавить 'after = ' к существующему вызову для поиска(), где построен по http://www.reddit.com/dev/api#fullnames –

+0

@Thanks для ответа снова! Мне жаль наивного для питона. Я не понимаю, что вы точно имеете в виду. Как я могу делать то, что вы посоветовали. Можете ли вы отредактировать его, помогите мне лучше понять. –

0

Таким образом, я бы просто прошел через предопределенный набор поисковых запросов, я предполагаю, что период - это период времени? Я также не уверен, какой будет формат для этого, поэтому ниже в основном составлено, но вы должны получить суть.

В этом случае было бы что-то вроде следующего

import praw 

def get_data_reddit(search): 
    username="" 
    password="" 
    r = praw.Reddit(user_agent='') 
    r.login(username,password,disable_warning=True) 
    title=[] 

    periods = (time1, time2, time3, time4) # declare a set of times to use in the search query to limit results 

    for period in periods: # loop through the different time points and query the posts from that time. 
     posts=r.search(search, subreddit=None,sort=None, syntax=None,period=None,limit=None) # this now returns a limited search query. 

     for post in posts: 
      title.append(post.title) # and append as usual. 
    print len(title) 


search="stackoverflow" 
get_data_reddit(search) 
+0

Спасибо! Я ищу что-то вроде получения даты последнего reddit, связанной с этим запросом. Затем проверяя каждый месяц/год с их сейчас или лучший способ рассчитать интервалы.Это больше похоже на псевдокод, чем на фактический код. –

+0

Например: один начинается с момента запуска reddit (23 июня 2005 г.), а затем вычисляет номера в текущем году, если более 1000 вы разделите их в месяцах и так далее. Это было бы лучшее решение, которое я подозреваю. –

+1

Я считаю, что reddit получит более тысячи сообщений в час, учитывая, что он может получать около миллиона комментариев в день, поэтому его нужно будет сократить до довольно небольших временных масштабов - потребовалось бы очень много запросов, и долгое время, чтобы вычислить количество сообщений за год, – Scironic