4 Stimmen

Eingabe einer 5-stelligen (Zahl) ID in der Reddit-URL

Im Reddit-URL gibt es den "5 characternumerics" thing_id Teil (zum Beispiel "wplf7" von "http://redd.it/wplf7"), der von Base36 generiert wird.

wplf7 wird aus der Zahl 54941875 generiert - das ist das, was ich bisher gefunden habe... Ich frage mich, wie 54941875 generiert wird.

Ich versuche, den Kommentar eines bestimmten Abschnitts von Reddit abzurufen (sagen wir mal http://www.reddit.com/r/leagueoflegends/) mit R und bleibe bei diesen 5 Zeichen numerisch stecken.

Kann mir jemand das auf einfache Weise erklären? Leider ist Python nicht mein Fachgebiet und die 2000 Zeilen Python-Code auf der Website von Reddit haben mir nicht viel geholfen.

Vielen Dank,

7voto

shhhhimhuntingrabbits Punkte 7277

Zunächst setzen Sie einen eindeutigen Benutzer-Agenten, da Reddit dies mag

options(HTTPUserAgent="Mein Name ist BOB")

Ich gehe davon aus, dass Sie den Inhalt unter http://www.reddit.com/r/leagueoflegends/ abrufen möchten. Sie müssen eine .json an die URL anhängen:

library(RJSONIO)
library(RCurl)
# library(XML)

jdata<-getURL('http://www.reddit.com/r/leagueoflegends/.json')
jdata<-fromJSON(jdata)
# xdata<-getURL('http://www.reddit.com/r/leagueoflegends/.xml')
# xdata<-xmlParse(xdata)

Offensichtlich ist der Inhalt sehr umfangreich, z.B. die Domains, Permalinks, Autoren, Titel der Beiträge:

Domains<-sapply(jdata[[2]]$children,function(x){x$data$domain})
permalinks<-sapply(jdata[[2]]$children,function(x){x$data$permalink})
authors<-sapply(jdata[[2]]$children,function(x){x$data$author})
titles<-sapply(jdata[[2]]$children,function(x){x$data$title})
ids<-sapply(jdata[[2]]$children,function(x){x$data$id})
created<-as.POSIXct(sapply(jdata[[2]]$children,function(x){x$data$created}),origin="1970/01/01")

> head(titles)
[1] "Pendragon 3-day-banning someone for randoming in ranked, or saying hes going to. Mixed feelings..."
[2] "Dig Kicks L0cust."                                                                                 
[3] "Summoners, y u no communicate??"                                                                   
[4] "Without Even Trying"                                                                               
[5] "Cross Country Tryndamere (Chaox Stream)"                                                           
[6] "Top 5 Flops - Episode 4 ft Dyrus, Phantoml0rd, and HatPerson vs Baron Nashor"                      
> 

Um zu untersuchen, wie diese IDs generiert werden, können wir @Ben Bolkers Funktion base36ToInteger auf die gesammelten IDs anwenden und sie mit dem Datum ihres Erstellungszeitpunkts vergleichen:

createData<-data.frame(created=created,ids=sapply(ids,base36ToInteger))
> dput(createData)
structure(list(created = structure(c(1342658844, 1342657298, 
1342622962, 1342643655, 1342641187, 1342654768, 1342665353, 1342640599, 
1342648272, 1342662822, 1342654185, 1342659591, 1342624350, 1342647907, 
1342637587, 1342591960, 1342625515, 1342642330, 1342651384, 1342668363, 
1342608976, 1342608165, 1342632545, 1342638611, 1342643489), class = c("POSIXct", 
"POSIXt")), ids = c(55047001, 55044612, 55010018, 55025557, 55022809, 
55040754, 55056689, 55022221, 55031424, 55053023, 55039810, 55048123, 
55010880, 55030934, 55019343, 54976515, 55011555, 55024060, 55035670, 
55061120, 54998192, 54997264, 55015528, 55020295, 55025363)), .Names = c("created", 
"ids"), row.names = c("wrujd", "wrsp0", "wr202", "wrdzp", "wrbvd", 
"wrppu", "ws20h", "wrbf1", "wriio", "wrz6n", "wrozm", "wrvej", 
"wr2o0", "wri52", "wr973", "wqc5f", "wr36r", "wrcu4", "wrlsm", 
"ws5fk", "wqsvk", "wqs5s", "wr694", "wr9xj", "wrdub"), class = "data.frame")

Bildbeschreibung hier eingeben

was darauf hindeutet, dass Reddit diese Nummern sequenziell auf der gesamten Website generiert, während neue Beiträge erstellt werden.

Ohne eine spezifische Anweisung werde ich es dabei belassen, aber hoffentlich verstehen Sie das Konzept.

5voto

Ben Bolker Punkte 190239

Ich bin von Code für die generische Basisumwandlung ausgegangen Veröffentlicht von Erich Neuwirth auf r-help im Jahr 2008: dies ist rekursiv, könnte also langsam sein - aber es hat genau die richtige Zeit gedauert, um es zu entwickeln!

numberInBase <- function(number,base){
    numberInBaseRecur<-function(number,base){
        lastDigit<-function(number,base) number %% base
        if (number == 0) result <- c(0)
        else result <- c(numberInBaseRecur(number %/% base,base),
                         lastDigit(number,base))
        result
    }
    result <- numberInBaseRecur(number,base)
    while (result[1]== 0 && length(result)>1)
        result <- result[-1]
    result
} 

Ein schneller Test:

numberInBase(36^3,36)
## [1] 1 0 0 0

Alles was wir jetzt brauchen ist die Umwandlung von Dezimal in Basis 36, dann die entsprechende alphanumerische Zeichenfolge zu indizieren. Hier ist Ihr Beispiel:

b36string <- c(0:9,letters)
paste(b36string[numberInBase(54941875,36)+1],collapse="")
## [1] "wplf7"

Falls Sie den umgekehrten Weg einschlagen müssen, gibt es einen Post von Jim Holtman aus Jan 2012, der eine Lösung enthält:

base36ToInteger <- function (Str) {
    common <- chartr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                     , ":;<=>?@ABCDEFGHIJKLMNOPQRS:;<=>?@ABCDEFGHIJKLMNOPQRS"
                     , Str)
    x <- as.numeric(charToRaw(common)) - 48
    sum(x * 36 ^ rev(seq(length(x)) - 1))
} 

base36ToInteger("wplf7")

(Ich habe mir keine Zeit genommen, um herauszufinden, wie dies tatsächlich funktioniert, aber Sie können den Beitrag lesen ...)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X