4

reddit URLには、base36によって生成される「5characternumerics」thing_id部分(たとえば、「http://redd.it/wplf7」の「wplf7」)があります。

wplf7は番号54941875から生成されます-これは私がこれまでに見つけたものです...私は54941875がどのように生成されるのか疑問に思っています。

Rを使用してredditの特定のセクション(たとえばhttp://www.reddit.com/r/leagueoflegends/ )のコメントをスクレイプしようとしていますが、この5文字の数字で立ち往生しています。

これを簡単に説明できる人はいますか?残念ながら、Pythonは私のドメインではなく、RedditのWebサイトにリストされている2000行のPythonコードはあまり役に立ちませんでした。

ありがとう、

4

2 に答える 2

7

まず、redditがこれを気に入っているので、ユニークなユーザーエージェントを設定します

options(HTTPUserAgent="My name is BOB")

http://www.reddit.com/r/leagueoflegends/でコンテンツを入手したいと思います。.jsonURLにを追加する必要があります:

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)

明らかに、コンテンツは非常に豊富です。たとえば、ドメイン、パーマリンク、作成者、投稿のタイトルなどです。

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"                      
> 

これらのIDがどのように生成されるかを調査するために、@ Ben Bolkerのbase36ToInteger関数を収集したIDに適用し、それらを作成された日付と比較して、次のようにします。

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")

ここに画像の説明を入力してください

これは、新しい投稿が作成されると、redditがサイト全体でこれらの番号を順番に生成することを意味します。

特定の方向性がなければ、私はこれをそのままにしておきますが、うまくいけば、あなたはアイデアを得るでしょう。

于 2012-07-18T22:51:11.770 に答える
5

私は2008年にErichNeuwirthによってr-helpに投稿された汎用ベース変換のコードから始めました。これは再帰的であるため遅いかもしれませんが、開発には適切な時間がかかりました。

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
} 

簡単なテスト:

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

ここで必要なのは、10進数から36進数に変換してから、適切な英数字の文字列にインデックスを付けることだけです。これがあなたの例です:

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

逆に行く必要がある場合は、 2012年1月のJimHoltmanによる解決策の投稿があります

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")

(私はこれが実際にどのように機能するかを理解するために立ち止まりませんでしたが、あなたは投稿を読むことができます...)

于 2012-07-18T00:56:40.917 に答える