这是《基于R语言自动收集》这本书的第十二章 ,因为网页已经改变源代码也发生了改变。所以重新整理了代码分享。

美国国会的法案存放在一个相对容易访问的数据库里,地址是:https://www.congress.gov。我们的网络抓取练习的第一步是对数据存放的方式进行检查。为了追踪抓取程序。我们可以

(1)  打开https://www.congress.gov

(2)    转到“Legislation”。

(3)    点击页面里的“Congress”,在“Congress”的子目录下点击“111(2009--2010)”。

(4)    点击页面里的“Chamber of Origin”,在“Chamber of Origin”的子目录下点击“Senate”。

按法案编号升序排列后,第111届国会期间提出的4059条法案包含在显示的连续页面中,每个页面显示100条信息。我们可以看到每条提出法案的标题、提案人、共同提案人数量和最后一次针对该法案的主要行动。点击进入第一条法案S.1的页面可以发现有十七位Cosponsors(共同提案人)。让该页面显示17位共同提案人的列表,此时页面包含我们所需的全部信息。观察该页面的URL:https://www.congress.gov/bill/111th-congress/senate-bill/1/cosponsors?r=1。我们可以看到这份提案的序号1是在国会届数111后面的,为了确认这个规律,我们查看第二个法案的URL,可以看到国会届数111后面的提案序号变为了2。选择一个随机数,如66,我们就可以手工改写原始URL

https://www.congress.gov/bill/111th-congress/senate-bill/66/cosponsors?r=66果然灵验了。现在,根据网络抓取良好实践里的规则,我们要把所有4059条法案的网页下载到硬盘,并尝试在第二步读取它们。

1.2下载网页

我们通过下载安装包并加载本练习后续部分需要用到的某些组件来启动R会话。

下载安装整个操作所需要的包

> install.packages("RCurl")

> install.packages("XML")

> install.packages("httr")

> install.packages("stringr")

> install.packages("igraph")

加载安装包

> library(RCurl)

> library(XML)

> library(httr)

> library(stringr)

> library(igraph)

我们设置的抓取函数由3个简单步骤组成,即为每个法案创建一个唯一的URL,下载网页,并最终把页面作为HTML文件写到本地文件夹Bills_111里。我们还加入了一个简单的进度指示器,用于监控下载过程。

创建一个空文件夹用来存储下载的html文件

> dir.create("Bills_111/")

利用url的规律用for循环下载保存4059个页面

> for(i in 1:4059){

url<-str_c("https://www.congress.gov/bill/111th-congress/senate-bill/i/cosponsors?r=i")

bill.result <- getURL(url) # 开始下载网页

write( bill.result,str_c("Bills_111/Bill_111_S", i,  ".html" ) )

# 把网页写入到本地文件夹,存储

cat(i, "\n")# 显示进度

}

首先以S1提案为例解析整个网页

>html.source<-htmlParse(file="Bills_111/Bill_111_S1.html")

根据源代码中,所有提案议员都在标签<td>…</td>中,且都有Sen的身份标志,确定path的内容,接下来调用xpathSApply函数提取整个页面的议员。

> all_sen<-xpathSApply(html.source, path ="//td/a[contains(text(),'Sen')]", xmlValue)

查看all_sen的内容

如上图所示提取了此页面的18名议员的姓名,按照规律,第一个是主提案人,剩下的是共同提案人。

> sponsor<-all_sen[1]

> cosponsors<-all_sen[-1]

> cosponsors[1:3]

[1] "Sen. Begich, Mark [D-AK]*"   "Sen. Bingaman, Jeff [D-NM]*"

[3] "Sen. Boxer, Barbara [D-CA]*"

> length(cosponsors)

[1] 17

> cleanUp<-function(x){

name<-sub("[[:alpha:]*[:punct:]*]+$","",x)

name<-str_trim(str_replace(name,"Sen.",""))

return(name)}

对前面的结果运用cleanUp( )函数,可以得到:

> cleanUp(sponsor)

[1] "Reid, Harry"

> cleanUp(cosponsors)

[1]"Begich, Mark"           "Bingaman, Jeff"

[3]"Boxer, Barbara"         "Brown, Sherrod"

[5]"Casey, Robert P., Jr."  "Clinton, Hillary Rodham"

[7]"Durbin, Richard J."     "Kennedy, Edward M."

[9]"Kerry, John F."         "Klobuchar, Amy"

[11] "Lautenberg, Frank R."    "Levin, Carl"

[13] "Lieberman, Joseph I."    "McCaskill, Claire"

[15] "Menendez, Robert"        "Schumer, Charles E."

[17] "Stabenow, Debbie"

用for循环收集4059个案例中所有的提案议员

> sponsor.list <- list()

> for(i in 1:4059) {

file<-str_c("Bills_111/Bill_111_S",i, ".html")

html_source<-htmlParse(file)

all_sen<-xpathSApply(html_source, path ="//body/div//td/a[contains(text(),'Sen')]",         xmlValue)

sponsor<-cleanUp(all_sen[1])

cosponsors<-cleanUp(all_sen[-1])

#把结果放到sponsor list

sponsor.list[[str_c("S.", i)]] <-list(sponsor = sponsor, cosponsors = cosponsors)

}

创建议员法案关系矩阵

> all.senators <- unlist(sponsor.list)#把列表展开

> all.senators <- unique(all.senators)#去除重复值

> all.senators <- sort(all.senators)#按照一定的顺序进行排列

> head(all.senators)#查看部分议员信息

[1] "Akaka, Daniel"    "Alexander, Lamar""Barrasso, John"

[4] "Baucus, Max"      "Bayh, Evan"       "Begich, Mark"

> sponsor.matrix <- matrix(NA, nrow = 4059, ncol= length(all.senators))

> colnames(sponsor.matrix) <- all.senators

> rownames(sponsor.matrix) <-paste("S.", seq(1, 1000), sep ="")

最后,对提案人列表进行迭代,填充到正确的单元格里。

> for(i in 1:length(sponsor.list)){

sponsor.matrix[i,which(all.senators == sponsor.list[[i]]$sponsor)] <- "Sponsor"

if(length(sponsor.list[[i]]$cosponsors)> 0){

for(j in1:length(sponsor.list[[i]]$cosponsors)){

sponsor.matrix[i,which(all.senators == sponsor.list[[i]]$cosponsors[j])]<-"Cosponsor"

}

}

}

查看矩阵30到35行的信息

> sponsor.matrix[30:35,31:34]

Cornyn,John Crapo, Mike DeMint, Jim Dodd, Christopher

S.30 NA          NA          NA          NA

S.31 NA          NA          NA          NA

S.32 NA          NA          NA          NA

S.33 NA          NA          NA          NA

S.34 "Cosponsor"  "Cosponsor""Sponsor"       NA

S.35 "Cosponsor"   NA         NA          NA

到这里就算是一个比较完美的结果,换成表格就是:

接下来,我们要设置一个议员关于提案的数据矩阵,我们想要的数据结构如下

参议员A

参议员B

参议员C

……

S.1

共同提案人

提案人

共同提案人

……

S.2

共同提案人

……

S.3

提案人

……

……

……

……

……

剩下还有两节的内容会整理到期末作业,跟书上代码差别不大,就不赘述了。不过修改了这个代码以后,我就是我们班可以凭借for循环和list走天下的人了哈哈哈哈....

美国参议院里的合作网络相关推荐

  1. 越狱Season 1-Episode 17: J-Cat

    Season 1, Episode 17: J-Cat -Pope: Hey, that's looking good. 嗨,看起来真棒 You're making some real progres ...

  2. (三)拨开生活中的数字迷雾,警惕图表的陷阱

    实验心理学家赤瑞特拉(Treicher)作过两个著名的心理实验,一个是关于人类获取信息的来源,就是人类获取信息到底主要通过哪些途径.他通过大量的实验证实:人类获取的信息83%来自视觉,11%来自听觉, ...

  3. IMDB TOP250电影介绍(上)

    1. 教父 The Godfather,(1972) 评分:9.0 投票人数:105,042 科波拉黑帮经典<教父>的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属众望所归.虽 ...

  4. 转:不懂这八条,你的领导力只是“命令”而已

    个人理解: 正直,信守承诺 花时间了解你的合作者,特别是你的下属 设定目标,确信并表达自己的愿景 为自己的目标,投入全部的热情和精力,奉献 积极.乐观,对努力从事的事业抱以期望 善待你的做的事,善待每 ...

  5. agilr java 推荐书,[转帖] LSAT 满分经验谈 (a girl from shanghai )

    LSAT180考经 写这份不老歌的一个直接好处是起到了抛砖引玉的作用,两年里结识了不少同样有志于攻读法学院的同学,其中能人大有人在,"A Girl from Shanghai"就是 ...

  6. 美国在人工智能领域亟待解决的5大难题

    来源:战略前沿技术 据C4ISRNET网站报道,根据2018年<国防授权法案>,美国国会组建了由多名技术专家组成的人工智能国家安全委员会,以指导美国人工智能技术的发展.该委员会由谷歌母公司 ...

  7. 金融工程与计算机联系紧密吗,美国留学金融工程专业院校有什么推荐的呢?

    美国留学金融工程专业院校推荐: 专业排名TOP1--加州大学伯克利分校 加州大学伯克利分校的MFE(Master of Financial Engineering)项目是全美名气最大的,是这个项目的首 ...

  8. 斯坦福教授研究了美国200年专利数据: 论文发得多?不等于创新!

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 封面图自网络,版权属于原作者 说到创新,硅谷一直有世界创新高地的标签,吸引世界各地的创业者.投资人.学者和作家源源不断的前来一探究竟.以往研究硅 ...

  9. 美国名校毕业的CEO,为什么坚持与一线工人同吃同住?

    与工人们同吃同住过的CEO周宇翔,要求公司里的工程师必须下到工厂车间实地查看情况,只有深入了解最底层的痛点,才能开发出最适合的软件. 天下网商记者 王安忆 从美国常春藤名校毕业后,同学们都去了华尔街, ...

最新文章

  1. 每日一皮:我们最要避开的山寨产品...
  2. Python基础教程: with语句详解
  3. 算法竞赛入门与进阶 (二)单调队列、单调栈
  4. java解决策略膨胀_折腾Java设计模式之策略模式
  5. MxNet教程:使用一台机器训练1400万张图片
  6. mysql中credit,CREDIT项目:我国类风湿关节炎数据库建设开启
  7. 开放Nginx在文件夹列表功能
  8. java简单实现一个缓存_java简单实现缓存的三种方法
  9. IOS技术分享| WebRTC iOS源码下载编译
  10. 永中文档转换服务Swagger调用说明
  11. SpringSecurity实战(六)-集成图形验证码-自定义认证实现
  12. 生活娱乐 如何像印度人学英语
  13. C++ 定时每天十二点做某事
  14. 陀螺仪随机误差的Allan方差分析
  15. 沈阳市政府 第三方社会评估总体报告
  16. 少儿编程Scratch学习教程2--官方初学指南
  17. 从uart到serial-ringbuff(环形缓存)
  18. Day5 Four English Grammer Mistakes Made By French Speakers
  19. 掌握正确的运动姿势,很有必要!
  20. matlab实现滑动平均滤波(一)

热门文章

  1. Dogecoin官方提醒:有消息称Dogecoin v1.15.0修复v1.14.3中的漏洞,其未指向官网或为恶意软件
  2. [项目管理-14]:大规模组织的项目管理办公室PMO
  3. Legend并列调整
  4. 持续学习:持续协调是终身学习的现实场景
  5. Windows系统下查询WiFi信道及强度等信息
  6. 利用可扩展样式表语言xsl显示xml文档
  7. 合成大西瓜CocosCreator开发源码(可跨平台构建:小程序、android...)
  8. [计划安排] 408经验帖(转自某大神)
  9. android 记事本提醒,Android 日历+记事本+提醒 源码
  10. Xamarin.Android实现自动拨打及挂断电话的功能