首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在reddit URL中输入5个字符(数字) ID

在reddit URL中输入5个字符(数字) ID
EN

Stack Overflow用户
提问于 2012-07-18 08:16:11
回答 2查看 361关注 0票数 4

在reddit URL中,有base36生成的"5字符数字“thing_id部件(例如,”http://redd.it/wplf7"“中的"wplf7”)。

wplf7是从数字54941875生成的-这是我到目前为止发现的……我想知道54941875是如何生成的。

我试图使用R来抓取reddit的特定部分(假设是http://www.reddit.com/r/leagueoflegends/)的注释,但我被这个5个字符的数字卡住了。

有谁可以用简单的方式来解释这一点?不幸的是,Python不是我的领域,Reddit网站上列出的2000行python代码对我帮助不大。

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-19 06:51:12

首先设置一个唯一的用户代理,如reddit所示

代码语言:javascript
复制
options(HTTPUserAgent="My name is BOB")

我告诉我你想在http://www.reddit.com/r/leagueoflegends/上获取内容。您需要在url后面附加一个.json

代码语言:javascript
复制
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)

显然,内容非常丰富,例如域名,永久链接,作者,帖子标题:

代码语言:javascript
复制
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"                      
> 

为了研究这些ids是如何生成的,我们可以将@Ben Bolker的base36ToInteger函数应用于我们收集的ids,并将它们与创建日期进行比较,给出:

代码语言:javascript
复制
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在创建新帖子时会在整个网站上按顺序生成这些数字。

如果没有明确的方向,我将把它留在这里,但希望你能理解。

票数 7
EN

Stack Overflow用户

发布于 2012-07-18 08:56:41

我从泛型基础转换posted by Erich Neuwirth on r-help in 2008的代码开始:这是递归的,所以可能很慢--但我花了适当的时间来开发它!

代码语言:javascript
复制
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
} 

快速测试:

代码语言:javascript
复制
numberInBase(36^3,36)
## [1] 1 0 0 0

现在我们需要做的就是将十进制数转换为基数36,然后索引适当的字母数字字符串。下面是你的例子:

代码语言:javascript
复制
b36string <- c(0:9,letters)
paste(b36string[numberInBase(54941875,36)+1],collapse="")
## [1] "wplf7"

如果你需要走另一条路,有一个post by Jim Holtman from Jan 2012 that gives a solution

代码语言:javascript
复制
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")

(我并没有停下来弄清楚这到底是如何工作的,但你可以阅读这篇文章……)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11532637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档