如何用R语言从网上读取多样格式数据

第一部分:数据信息

生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一个重要特征便是数据的多样化(variety)。

也许你期待的数据是这样的:

##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa

然而事实上我们面临的数据确实这样的:

@HWI-EAS121:4:100:1783:550#0/1
CGTTACGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACGGATCTCGTATGCGGTCTGCTGCGTGACAAGACAGGGG
+HWI-EAS121:4:100:1783:550#0/1
aaaaa`b_aa`aa`YaX]aZ`aZM^Z]YRa]YSG[[ZREQLHESDHNDDHNMEEDDMPENITKFLFEEDDDHEJQMEDDD
@HWI-EAS121:4:100:1783:1611#0/1
GGGTGGGCATTTCCACTCGCAGTATGGGTTGCCGCACGACAGGCAGCGGTCAGCCTGCGCTTTGGCCTGGCCTTCGGAAA

还有这样的:

{
    "uid": 10438,
    "result": [
        {
            "day": "2011-12-12",
            "followers_count": "63",   //粉丝数
            "v_followers_count": "18", //V粉丝数
            "daren_followers_count": "18", //达人粉丝数
            "friends_count": "58",    //关注数
            "v_friends_count": "58",  //V关注数
            "statuses_count": "258",   //微博数
            "bi_followers_count": "18",  //互粉数
            "repost_count": "115", //转发数
            "comments_count": "178",   //评论数
        },
        ...
    ]
}

那么我们如何去处理这些数据,我们如何分析这些数据,从数据中找到我们想要的东西呢?我们将从如何将这些数据导入R中开始,慢慢学习如何处理,分析我们身边的大数据。

第一章 数据的导入

面对各种各样纷杂的数据,我们分析的第一步便是获取数据并将其导入R中。

从网上获取数据

大数据的一个重要数据源便是互联网。从网络上获取数据并用来分析是非常重要的。为了得到这些数据,一个普通青年的做法便是来到一个网站,找到数据连接,然后右键->目标另存为,最后从本地文件夹中导入R。但是如果要下载的数据文件数目比较多,再这么做就从一个普通青年降级为了二逼青年。

为了应对需要下载多个文件的情况,R提供了函数download.file(),使得R可以从互联网上直接把数据拽下来。其调用格式为:

download.file(url, destfile, method, quiet = FALSE, mode = "w",
              cacheOK = TRUE,
              extra = getOption("download.file.extra"))

主要的参数为:

  • url:文件的所在地址
  • destfile:下载后文件的保存地址,默认为工作目录
  • method: 提供"internal", "wget", "curl" 和 "lynx"四种method,在windows上通常internal就能解决大多数的问题,少数搞不定的如Cygwin, gnuwin32这种的"wget"就可以搞定;windows的二进制文件用“curl”,这个method对于Mac的用户来说是都要设置的;“lynx”主要针对historical interest。
用法举例:获取上市公司资产负债表

比如说我们要获取一系列的上市公司财务数据,我们就要得到他们的资产负债表。当然,如果花钱买wind数据库,一切也就不用操心了。但是如果不在学校,用不了数据库的话,一个可以替代的办法就是从新浪财经里面拽数据:以安信信托(600816) 资产负债表为例,你可以访问新浪财经就能看个明白,还可以下载。我们如果还要其他的股票,我们都可以如法炮制。那么我们通过R用download.file写一个函数来实现输入股票代码,将资产负债表下载到指定目录:

getbalancesheets=function(symbol,file){pre="http://money.finance.sina.com.cn/corp/go.php/vDOWN_BalanceSheet/displaytype/4/stockid/";end="/ctrl/all.phtml";url=paste(pre,symbol,end,sep="");destfile=paste(file,"BalanceSheet_",symbol,".xls",sep="");

download.file(url, destfile);
}

值得注意的是:

  • 凡是以http开头的,放心大胆的使用download.file()
  • 凡是以https开头的,这个函数可能失效
  • 在设置路径时可以通过file.exists来查看文件夹是否存在,如果不存在可以使用dir.create来创建它,避免找不到路径的烦恼。
  • 使用getwd获取当前工作路径,setwd可以改变它

读入XML

XML可以说是我们非常熟悉的一类数据。我们通常在网上看到的电子表格便是XML文件的一部分。我们可以看到XML文件大抵是长这样的.

如何打开这样的一个文件?其实最简单的就是用EXCEL表格打开了,我们只要在打开文件时作为 XML 列表打开文件。当打开 XML 源时,Excel 会查找 XML 样式表 (XSL) 的标记。XSL 说明数据的显示方式。如果存在相应的标记,Excel 将会提示您选择是否应用样式表。如果选择应用 XSL,则 XSL 将指示数据的显示方式。

关于XML这种可扩展性标记语言,我们不再赘述,可以参阅wiki.这里我们关注的是在得到XML文件后如何分析处理。

R提供了XML包供我们来读取这样一个文件。我们将XML包的主要函数介绍如下:

xmlTreeParse(file, ignoreBlanks=TRUE, handlers=NULL, replaceEntities=FALSE,
             asText=FALSE, trim=TRUE, validate=FALSE, getDTD=TRUE,
             isURL=FALSE, asTree = FALSE, addAttributeNamespaces = FALSE,
             useInternalNodes = FALSE, isSchema = FALSE,
             fullNamespaceInfo = FALSE, encoding = character(),
             useDotNames = length(grep("^\\.", names(handlers))) > 0,
             xinclude = TRUE, addFinalizer = TRUE, error = xmlErrorCumulator(),
             isHTML = FALSE, options = integer(), parentFirst = FALSE)

xmlRoot(x, skip = TRUE, ...)
## S3 method for class 'XMLDocumentContent'
xmlRoot(x, skip = TRUE, ...)
## S3 method for class 'XMLInternalDocument'
xmlRoot(x, skip = TRUE, addFinalizer = NA, ...)
## S3 method for class 'HTMLDocument'
xmlRoot(x, skip = TRUE, ...)
  • xmlTreeParse函数主要是用于解析XML或HTML文件包含XML / HTML内容或字符串,并生成一个R代表XML / HTML树结构。
  • xmlRoot函数主要是用于提供方便地访问由解析一个XML文档产生的顶级XMLNode对象.

我们下面就来一步一步的分析如何读取一个XML或者HTML文件:

  • 获取网页数据

这时你需要用到RCurl包的getURL函数来下载相关网页,我们以最近BBC上最火的Robin Williams的一则新闻为例说说怎样读取HTML文件(因为中文有些网站会出现乱码,为了避免不必要的麻烦,我们暂时使用英文网站,稍后的例子会有中文的):

library(RCurl)
library(XML)url <- "http://www.bbc.com/news/entertainment-arts-28761353"SOURCE <-  getURL(url,encoding="UTF-8") #Download the page
## Error: transfer closed with 78288 bytes remaining to read
#this is a very very long line. Let's not print it. Instead:substring (SOURCE,1,200)
## Error: 找不到对象'SOURCE'
PARSED <- htmlParse(SOURCE) #Format the html code d
## Error: 找不到对象'SOURCE'
  • 获取HTML的元素

我们可以通过XPath的相关函数来获取HTML的相关信息:

xpathSApply(PARSED, "//h1")
## Error: 找不到对象'PARSED'

这样的标题由于含有HTML标记,让我们很不爽,我们可以通过下面函数来去掉它:

xpathSApply(PARSED, "//h1",xmlValue)
## Error: 找不到对象'PARSED'

相应的函数调用格式如下:

xpathApply(doc, path, fun, ... ,
            namespaces =  xmlNamespaceDefinitions(doc, simplify = TRUE),
              resolveNamespaces = TRUE, addFinalizer = NA)
xpathSApply(doc, path, fun = NULL, ... ,
             namespaces = xmlNamespaceDefinitions(doc, simplify = TRUE),
               resolveNamespaces = TRUE, simplify = TRUE, addFinalizer = NA)

主要参数:

  • doc:XMLInternalDocument类型的数据,htmlParse函数产生的对象
  • path:XPath 表达式,常用的有 "/" 表示根节点处寻找;"//"表示文档任意处寻找;"@"表示选择相应的属性

我们可以通过抓取HTML里的关键词来发现很多东西,比如我们想知道这个页面有多少条链接,我们只需要运行:

length(xpathSApply(PARSED, "//a/@href"))

再比如我们想要知道新闻的日期,我们可以运行:

xpathSApply(PARSED, "//span[@class='date']",xmlValue)

最后要说的是,你的挖掘一定要对HTML的结构十分的熟悉,比如页面有哪些元素,这是第几级的结构等,方便在使用@时确定能找到有关属性,比如说我想知道BBC报道了哪些最近的关于中国的新闻,我们就可以运行以下代码:

url="http://www.bbc.co.uk/search/news/?q=China&search_form=in-page-search-form"SOURCE <-  getURL(url,encoding="UTF-8")PARSED <- htmlParse(SOURCE)targets <- unique(xpathSApply(PARSED, "//a[@class='title linktrack-title']/@href"))
head(targets)
## [1] "http://www.bbc.co.uk/news/world-europe-28755656"       
## [2] "http://www.bbc.co.uk/news/business-28767854"           

然而,对于上面那篇文章,"//a[@class='title linktrack-title']/@href"是找不到任何东西的。进一步地,对于每一个链接,如果我们还想知道标题与日期,我们可以使用sapply函数:

bbcScraper2 <- function(url){  title=date=NA #Return empty values in case field not found
  SOURCE <-  getURL(url,encoding="UTF-8") 
  PARSED <- htmlParse(SOURCE)  title=(xpathSApply(PARSED, "//h1[@class='story-header']",xmlValue))  date=(xpathSApply(PARSED, "//meta[@name='OriginalPublicationDate']/@content"))  if (is.null(date)){    date=(xpathSApply(PARSED, "//span[@class='date']",xmlValue))
  }  return(c(title,as.character(date)))
}targets<-as.data.frame(targets)
t(sapply(targets[1:5,],bbcScraper2))
##      [,1]                                                 
## [1,] "Pope Francis faces greatest challenge yet in Asia"  
## [2,] "Alibaba sells off loan business ahead of share sale"
## [3,] "Conservatives misguided after Ferguson shooting"    
## [4,] "Q&A: Edinburgh's giant pandas"                      
## [5,] "In pictures: Framing Hope"                          
##      [,2]                 
## [1,] "2014/08/13 01:51:58"
## [2,] "2014/08/13 01:18:39"
## [3,] "2014/08/12 17:05:25"
## [4,] "2014/08/12 16:00:21"
## [5,] "2014/08/12 14:55:21"
  • 读取网页表格

很多网站并不提供直接的数据下载,而是提供一个网页表格供你在线观看。那么我们有没有简单一点的办法把他们拽下来呢?readHTMLTable函数可以帮我们把东西轻而易举的办到,我们先来看看函数的调用格式:

readHTMLTable(doc, header = NA,
              colClasses = NULL, skip.rows = integer(), trim = TRUE,
              elFun = xmlValue, as.data.frame = TRUE, which = integer(),
               ...)

我们以保利地产的分红情况为例来说明函数的使用:

url<-"http://money.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/600048.phtml"data<-readHTMLTable(url,header=NA, which=19)data
##           V1 V2 V3   V4     V5         V6         V7         V8     V9
## 1 2014-05-16  0  5 2.94 瀹炴柦 2014-05-22 2014-05-21         -- 鏌ョ湅
## 2 2013-05-28  0  0 2.32 瀹炴柦 2013-06-03 2013-05-31         -- 鏌ョ湅
## 3 2012-06-12  0  2 2.15 瀹炴柦 2012-06-18 2012-06-15         -- 鏌ョ湅
## 4 2011-05-11  0  3 2.13 瀹炴柦 2011-05-17 2011-05-16         -- 鏌ョ湅

对于中文来说,出现了乱码,这是我们不希望看到的,一个简单地办法就是将文件写入一个txt文件,再重新读取出来,即:

write.table(data,"F:/table.txt")
read.table("F:/table.txt",encoding = "UTF-8")
##           V1 V2 V3   V4   V5         V6         V7         V8   V9
## 1 2014-05-16  0  5 2.94 实施 2014-05-22 2014-05-21         -- 查看
## 2 2013-05-28  0  0 2.32 实施 2013-06-03 2013-05-31         -- 查看
## 3 2012-06-12  0  2 2.15 实施 2012-06-18 2012-06-15         -- 查看
## 4 2011-05-11  0  3 2.13 实施 2011-05-17 2011-05-16         -- 查看

看表格很完整的展现在我们面前了。

应用举例:中超预测

虽然中国足球没什么看点,但是还是有一些槽点,对于买彩票的如果没有假球的话还有一些竞猜的价值。我们想要推断首先就得从网上获取相应数据,我们还是用简单的readHTMLTable函数从网易载入中超赛程数据:

library(XML)CslData <- readHTMLTable("http://cs.sports.163.com/fixture/", header = T)CslPoint <- CslData[[31]]CslData[[31]] <- NULLCslFixture <- do.call(rbind, lapply(CslData, function(x) subset(x[, 3:5])))
colnames(CslFixture) <- iconv(colnames(CslFixture), "UTF-8")
colnames(CslPoint) <- iconv(colnames(CslPoint), "UTF-8")
head(CslFixture)
##            主队  比分       客队
## NULL.1 山东鲁能 1 - 0 哈尔滨毅腾
## NULL.2 广州恒大 3 - 0   河南建业
## NULL.3 北京国安 1 - 0   长春亚泰
## NULL.4 江苏舜天 0 - 0   贵州茅台
## NULL.5 杭州绿城 1 - 1 大连阿尔滨
## NULL.6 辽宁宏运 1 - 1   上海上港
head(CslPoint)
##   名次     球队 比赛 积分
## 1    1 广州恒大   20   45
## 2    2 北京国安   19   41
## 3    3 广州富力   19   34

这样我们就得到了中超的数据,之后就可以利用我们之前在博客里讲的MCMClogisticSVM之类的办法去预测了。

这个例子节选自虎扑体育的《恒大夺冠100%,卓尔降级99%——用R语言轻松模拟中超剩余比赛》,那篇帖子也给了一个简单地预测办法,虽然不见得准确,也可以为我们的预测提供一个思路。

应用举例:获取当当网的图书定价

在比价的过程中,我们首要的任务就是从网上获取价格数据。我们该如何从当当的图书页面获取价格数据呢?

library(XML)
library(RCurl)book_price=NULLfor(i in 1:2){    url_i<-paste0("http://category.dangdang.com/pg",i,"-cp01.00.00.00.00.00.html",sep="")    url_i<-htmlParse(url_i,encoding="GBK")    #asText=TRUE,
    node_i<-getNodeSet(url_i,"//li[@class]/div[@class=\"inner\"]/a")    Attr_i<-sapply(node_i,xmlGetAttr,name="href")    for(j in Attr_i){        url_j=htmlParse(j,encoding="GBK")        node_title=getNodeSet(url_j,"//div[@class]/img[@id]")        if(length(node_title)>0){            title=xmlGetAttr(node_title[[1]],"alt")            title=iconv(title,"UTF-8","gbk")
        }        else{            next
        }        node_price=getNodeSet(url_j,"//span[@id=\"salePriceTag\"]")        if (length(node_price)>0){            price=as.numeric(xmlValue(node_price[[1]]))
            }        else{            next
        }        book_price=rbind(book_price,cbind(j,title,price))
    }
}
colnames(book_price)=c("URL","书名","价格")
write.csv(book_price,"F:/book_price.csv")

读入json 数据

json数据的一个典型的代表就是微博数据,然而除了微博外也有很多其他的网站因为json采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯使JSON成为理想的数据交换语言被许多的API使用。比如github的数据,Wikipedia article traffic statistics的数据也采用了json格式。 我们以github的API数据为例,下面是我的github的代码仓库部分数据的json格式信息,完整版本在这里

 {
    "id": 20472818,
    "name": "courses",
    "full_name": "yujunbeta/courses",
    "owner": {
      "login": "yujunbeta",
      "id": 7315956,
      "avatar_url": "https://avatars.githubusercontent.com/u/7315956?v=2",
      "gravatar_id": "e8569ebac320c9aed1764a7d693e5a87",
      "url": "https://api.github.com/users/yujunbeta",
      "html_url": "https://github.com/yujunbeta",
      "followers_url": "https://api.github.com/users/yujunbeta/followers",
      "following_url": "https://api.github.com/users/yujunbeta/following{/other_user}",
      "gists_url": "https://api.github.com/users/yujunbeta/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/yujunbeta/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/yujunbeta/subscriptions",
      "organizations_url": "https://api.github.com/users/yujunbeta/orgs",
      "repos_url": "https://api.github.com/users/yujunbeta/repos",
      "events_url": "https://api.github.com/users/yujunbeta/events{/privacy}",
      "received_events_url": "https://api.github.com/users/yujunbeta/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/yujunbeta/courses",
    "description": "Course materials for the Data Science Specialization: https://www.coursera.org/specialization/jhudatascience/1",
    "fork": true,
    "url": "https://api.github.com/repos/yujunbeta/courses",
    "forks_url": "https://api.github.com/repos/yujunbeta/courses/forks",
    "keys_url": "https://api.github.com/repos/yujunbeta/courses/keys{/key_id}",

R的jsonlite包提供了函数fromJSON来读取JSON数据。以我的github的JSON数据为例:

library(jsonlite)jsonData <- fromJSON("https://api.github.com/users/yujunbeta/repos")

我们可以通过操作jsonData来获取我的github的相应信息:

names(jsonData)#获取JSON数据的一级结构,类似于hush表的关键字
##  [1] "id"                "name"              "full_name"        
##  [4] "owner"             "private"           "html_url"         
##  [7] "description"       "fork"              "url"              
## [10] "forks_url"         "keys_url"          "collaborators_url"
## [13] "teams_url"         "hooks_url"         "issue_events_url" 
## [16] "events_url"        "assignees_url"     "branches_url"     
names(jsonData$owner)#获取所有者的基本信息
##  [1] "login"               "id"                  "avatar_url"         
##  [4] "gravatar_id"         "url"                 "html_url"           
##  [7] "followers_url"       "following_url"       "gists_url"          
jsonData$owner$login#获取登陆信息
##  [1] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
##  [6] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
## [11] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
## [16] "yujunbeta" "yujunbeta" "yujunbeta"
应用举例:分析Wikipedia读者搜索趋势

在股票交易中我们经常会听到“概念股”这样一个名词,那么什么样的概念最可能走红,什么样的概念股最有可能获得多数股民的购买呢,当然就是被议论的最多的,人们最关心的,比如习大大上台时提的“美丽中国”在当时很是红火,现在最近新闻里提及的“金融改革”估计也会成为新的股市宠儿。

我们这里使用Wikipedia article traffic statistics提供的数据来看看最近人们对某一概念的关注程度如何。当然,要获得人们关注什么,什么概念在股市中最红火,靠wiki的搜索指数是远远不够的,用下面的程序赚钱还是够呛。

我们这里以最近比较红火的数据科学这一概念为例,我们来看看人们对它的关注程度:

url <- "http://stats.grok.se/json/en/latest90/data%20science"raw.data <- readLines(url, warn = "F")
library(rjson)rd <- fromJSON(raw.data)rd.views <- rd$daily_viewsrd.views <- unlist(rd.views)df <- as.data.frame(rd.views)
head(df)
##            rd.views
## 2014-06-30      620
## 2014-06-21      355
## 2014-06-20      474
library(ggplot2)df$date <- as.Date(rownames(df))
colnames(df) <- c("views", "date")
ggplot(df, aes(date, views)) + geom_line() + geom_smooth() + theme_bw(base_size = 20)

从图中我们可以看到data science最近真的是红火的不行,然而我们再来看看相关的statistic被人们关注的程度如何?

##            rd.views
## 2014-06-30      288
## 2014-06-21      212
## 2014-06-20      233

显然statistic被人关注的程度真是少的可怜。类似的我们还可以看看big data,machine learning,statistical learning这些相近的词汇的关注度,这里我们不在赘述。

应用举例:《后会无期》能统计什么?

曾经见过网上一个有意思的评论:我们可以通过统计观看《小时代》的人数来统计究竟有多少脑残。当然,这只是一家之言。但是我们仍然可以利用关联规则的思想:如果”小时代“的状态里出现”脑残“的概率很高,那么就基本上可以相信那条评论很有道理。

为了避免一些不必要的争端,我们不妨利用微博数据来看看国民岳父的《后会无期》究竟与什么相关,观影人数又能代表什么?

这里我们利用lijian大神的Rweibo包来看看:

require(Rweibo)res <- web.search.content("后会无期", page = 20, sleepmean = 10, sleepsd = 1)$Weiborequire(Rwordseg)
insertWords("后会无期")n <- length(res)res <- res[res != " "]words <- unlist(lapply(X = res, FUN = segmentCN))word <- lapply(X = words, FUN = strsplit, " ")wordfreq <- table(unlist(word))wordfreq <- sort(wordfreq, decreasing = TRUE)

现在我们来看看去掉一些单字词汇(如“你”,“是”之类)后的词汇频率超过20的大概有:

  TFBOYS     房间     今天     电影     偶像     手记     台湾 后会无期     遥控     大家     年轻 
      64       39       33       32       32       32       32       28       26       24       24 

从着些关联词汇来看,国民岳父的《后会无期》正在被最近风头正劲的TFBOYS演唱的《后会无期》取代,TFBOYS的《后会无期》成了新的热门。不过毕竟后会无期已经上演了那么长的时间,没有人会去温习那些经典的“道理”,因为大家都知道:无论你知道多少道理,仍有可能过不好这一生。那么目前跟电影《后会无期》相关的东西可以肯定的就只有”电影“本身以及电影9月的”台湾“之行。

我们不仅可以读入JSON数据也可以通过函数toJSON将数据框写为JSON格式,例如将鸢尾花数据集写为JSON格式(输出结果较长,在此从略):

data(iris)
toJSON(iris, pretty=TRUE)

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏涤生的博客

天池中间件大赛Golang版Service Mesh思路分享

这次天池中间件性能大赛初赛和复赛的成绩都正好是第五名,出乎意料的是作为Golang是这次比赛的“稀缺物种”,这次在前十名中我也是侥幸存活在C大佬和Java大佬的...

1704
来自专栏圣杰的专栏

ABP入门系列(18)—— 使用领域服务

源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写。特别是当遇到DDD中一些概念术语的时候...

24510
来自专栏数据科学学习手札

(数据科学学习手札33)基于Python的网络数据采集实战(1)

  前面两篇文章我们围绕利用Python进行网络数据采集铺垫了很多内容,但光说不练是不行的,于是乎,本篇就将基于笔者最近的一项数据需求进行一次网络数据采集的实战...

4965
来自专栏IT派

用Python画一个中国地图

先来聊聊为什么做数据分析一定要用Python或R语言。编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python...

4715
来自专栏大数据挖掘DT机器学习

如何用R语言从网上读取多样格式数据

第一部分:数据信息 生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一...

3877
来自专栏Java3y

海量视频资源【网盘直接取】

资源均来源于网络,在自学/开公众号的时候收集而来。如果侵权请联系我,会第一时间删除。

83.6K17
来自专栏精讲JAVA

关于淘点点面试中碰到的架构问题​

之前面试淘点点的时候被问倒得一个问题至今牵挂,由于工作环境的限制,我没能接触到一些大数据量的并发工作,也没能有机遇参与复杂系统的设计,而我学习复杂或高并发系统的...

1123
来自专栏程序人生

再谈 API 的撰写 - 契约

现代社会是个契约社会,生活中大大小小的事情都在和契约打交道。去奥莱买件衣服,一纸小票,便是你跟商家的契约:你花钱买到了产品,产品的问题商家会承诺处理(退换货)。...

3838
来自专栏FreeBuf

两张图片告诉你为什么域名会被解析到65.49.2.178

2014年1月21日中国出现重大网络事故,大量域名被解析到一个65.49.2.178 这个IP了。 中国的一家DNS服务商DNSPOD于 2014 年 1 月...

4177
来自专栏小文博客

用Python画一个中国地图【转】

2063

扫码关注云+社区

领取腾讯云代金券