2015-11-24 14 views
6

Mam funkcję, aby zeskrobać wszystkie posty w subreddit Bitcoin między 2014-11-01 i 2015-10-31.Jak zeskrobać wszystkie posty subreddit w danym okresie czasu

Jednak jestem w stanie wydobyć około 990 postów, które powracają do 25 października. Nie rozumiem, co się dzieje. Włączyłem Sys.sleep 15 sekund między każdym ekstraktem po odniesieniu do https://github.com/reddit/reddit/wiki/API, bezskutecznie.

Ponadto eksperymentowałem ze skrobaniem z innego subreddita (fitness), ale zwróciło ono również około 900 wpisów.

require(jsonlite) 
require(dplyr) 

getAllPosts <- function() { 
    url <- "https://www.reddit.com/r/bitcoin/search.json?q=timestamp%3A1414800000..1446335999&sort=new&restrict_sr=on&rank=title&syntax=cloudsearch&limit=100" 
    extract <- fromJSON(url) 
    posts <- extract$data$children$data %>% dplyr::select(name, author, num_comments, created_utc, 
              title, selftext) 
    after <- posts[nrow(posts),1] 
    url.next <- paste0("https://www.reddit.com/r/bitcoin/search.json?q=timestamp%3A1414800000..1446335999&sort=new&restrict_sr=on&rank=title&syntax=cloudsearch&after=",after,"&limit=100") 
    extract.next <- fromJSON(url.next) 
    posts.next <- extract.next$data$children$data 

    # execute while loop as long as there are any rows in the data frame 
    while (!is.null(nrow(posts.next))) { 
     posts.next <- posts.next %>% dplyr::select(name, author, num_comments, created_utc, 
            title, selftext) 
     posts <- rbind(posts, posts.next) 
     after <- posts[nrow(posts),1] 
     url.next <- paste0("https://www.reddit.com/r/bitcoin/search.json?q=timestamp%3A1414800000..1446335999&sort=new&restrict_sr=on&rank=title&syntax=cloudsearch&after=",after,"&limit=100") 
     Sys.sleep(15) 
     extract <- fromJSON(url.next) 
     posts.next <- extract$data$children$data 
    } 
    posts$created_utc <- as.POSIXct(posts$created_utc, origin="1970-01-01") 
    return(posts) 
} 

posts <- getAllPosts() 

Czy Reddit ma jakiś limit, który uderzam?

Odpowiedz

4

Tak, wszystkie oferty reddit (posty, komentarze itp.) Są ograniczone do 1000 pozycji; są one zasadniczo tylko buforowanymi listami, a nie zapytaniami, ze względu na wydajność.

Aby obejść ten problem, należy przeprowadzić sprytne wyszukiwanie based on timestamps.

+1

Jeśli napiszę funkcję, która ma pętlę, w której każda iteracja przechwytuje dane o 4 dniach, czy to obejdzie ograniczenia Reddita? Innymi słowy, czy będę mógł uruchomić tę funkcję i otrzymywać posty przez cały rok? –

+1

W zależności od tego, czy uważasz, że w tych 4 dniach będzie prawdopodobnie 1000 stanowisk. Prawdopodobnie łatwiej byłoby sortować według nowych i używać sygnatury czasowej ostatniego wpisu, do którego masz dostęp. – Pokechu22

Powiązane problemy