API поиска Reddit не дает всех результатов

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)
        

Выход=953

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

  1. [Документация][1] упоминает

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

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

Тот же вопрос: https://github.com/praw-dev/praw/issues/430 [1]: https://praw.readthedocs.org/en/v2.0.15/pages/faq.html Пожалуйста, перейдите по вышеупомянутой ссылке для соответствующего обсуждения.


person Abhishek Bhatia    schedule 23.06.2015    source источник
comment
Это довольно распространенная практика для API, чтобы люди не перегружали серверы запросами. Обычно вы можете обойти это, сделав свои поисковые запросы более конкретными и перебирая определенный набор, например. сохраняйте запросы к определенному дню и просматривайте последние десять дней или что-то еще, что позволит Reddit, что может работать таким образом,   -  person NDevox    schedule 23.06.2015
comment
@Scironic Спасибо! Это кажется гораздо лучшим решением, чем скребок. Можете привести пример для пояснения. Это было бы очень полезно. Может быть, прохождение, когда Reddit начал текущее время.   -  person Abhishek Bhatia    schedule 23.06.2015


Ответы (2)


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

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

Теперь, хотя я не знаком с PRAW, я вижу, что Reddit 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)
person Peter Brittain    schedule 27.06.2015
comment
Спасибо за ответ! Но можете сказать мне, как этого добиться, это python. - person Abhishek Bhatia; 28.06.2015
comment
Глядя на код PRAW, вам просто нужно добавить 'after=‹полное имя›' к существующему вызову search(), где ‹полное имя› создается в соответствии с reddit.com/dev/api#fullnames - person Peter Brittain; 28.06.2015
comment
@Спасибо за ответ еще раз! Прошу прощения за наивность в питоне. Я не понимаю, что именно вы имеете в виду. Как мне сделать то, что вы посоветовали. Не могли бы вы отредактировать его, чтобы помочь мне лучше понять. - person Abhishek Bhatia; 28.06.2015
comment
Не могли бы вы объяснить больше. Должно ли полное имя ссылаться на ссылку поискового URL? - person Abhishek Bhatia; 28.06.2015
comment
Не могли бы вы ответить. Я все еще застрял. - person Abhishek Bhatia; 28.06.2015
comment
Итак, я быстро поиграл и обнаружил, что пейджинг работает, если вместо этого перейти к get_content. Затем я обнаружил, что поиск уже выполняет пейджинг за вас. Затем я повторил поиск на Reddit и пролистал страницу до конца... Угадайте, что? Было найдено 953 результата. Таким образом, краткий ответ заключается в том, что ваш поиск завершен. - person Peter Brittain; 29.06.2015
comment
Можете ли вы предоставить код того, как вы выполняли пейджинг. Я не уверен, что он пролистал его до конца. Проверьте этот reddit.com/ - person Abhishek Bhatia; 29.06.2015
comment
Пожалуйста, предоставьте некоторый код, это поможет лучше перепроверить и понять вашу методологию. - person Abhishek Bhatia; 29.06.2015
comment
Учитывая, что меня только что дважды проголосовали против (без каких-либо объяснений), я не уверен, что за этим стоит следить, но у меня будет последний шанс... Ваш URL возвращает те же результаты, что и простой поиск только с переименованными записями, начиная с 1000. Счетчик — это всего лишь механизм предоставления пользователю согласованного представления, а не окончательный индекс. - person Peter Brittain; 29.06.2015
comment
Я также думаю, что должно быть какое-то объяснение, почему этот ответ был отклонен. - person Visgean Skeloru; 29.06.2015
comment
Извините за быстрое отрицание, я просто очень запутался. Спасибо, что указали на мою ошибку с переменной count. Если вы проверите вопрос, который я задал, все результаты, я искренне сомневаюсь, что на Reddit меньше 1000 сообщений, содержащих слово StackOverflow. Я также быстро попробовал несколько других популярных поисковых запросов. Кажется, Reddit всегда возвращает меньше тысячи результатов. - person Abhishek Bhatia; 29.06.2015
comment
Но это не полностью отвечает на мой ответ. Кажется, что использование какой-либо другой поисковой системы, такой как Google, может быть единственным вариантом. Что ты посоветуешь? - person Abhishek Bhatia; 29.06.2015
comment
Похоже, что API Reddit намеренно ограничен здесь ... Я не вижу гарантии, что можно разбить любой произвольный поиск и найти все сообщения, содержащие любое ключевое слово. Поэтому поиск в Google с ограничением по сайту, вероятно, является лучшим выбором. - person Peter Brittain; 29.06.2015
comment
@PeterBrittain Можете ли вы привести пример, пожалуйста. Я не могу найти его в Интернете. - person Abhishek Bhatia; 29.06.2015
comment
Теперь вы задаете совсем другой вопрос, на который уже отвечали. Я не думаю, что в вашем первоначальном вопросе есть что-то еще, и поэтому мы должны закрыть этот след. - person Peter Brittain; 29.06.2015
comment
@PeterBrittain Это, конечно, другая методология, но вопрос остается прежним. Это моя ошибка начинать с неправильного метода сначала. - person Abhishek Bhatia; 03.07.2015

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

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

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)
person NDevox    schedule 23.06.2015
comment
Спасибо! Я ищу что-то вроде получения даты последнего реддита, связанного с этим запросом. Затем проверяйте каждый месяц/год с этого момента или используйте лучший способ расчета интервалов. Это больше похоже на псевдокод, чем на реальный код. - person Abhishek Bhatia; 23.06.2015
comment
Например: один начинается с момента запуска Reddit (23 июня 2005 г.), а затем рассчитывается количество сообщений в текущем году, если больше 1000, вы далее делите на месяцы и так далее. Я подозреваю, что это было бы лучшим решением. - person Abhishek Bhatia; 23.06.2015
comment
Я полагаю, что Reddit будет получать более тысячи постов в час, учитывая, что он может получать около миллиона комментариев в день, поэтому его придется урезать до довольно малых временных масштабов — потребуется очень большое количество запросов и долго, чтобы подсчитать количество постов в год, - person NDevox; 23.06.2015
comment
Как упоминалось в ответе, это не должен быть рабочий код, я не знаю API Reddit и у меня нет четкого понимания того, что вы хотите сделать. Но лучший способ обойти ограничения данных — использовать более конкретный запрос — как вы собираетесь это делать — это то, что вам нужно выяснить, поскольку я не могу сказать. - person NDevox; 23.06.2015
comment
Кажется, это предполагает что-то похожее reddit.com/r/redditdev/comments/30a7ap / - person Abhishek Bhatia; 23.06.2015