楼主: sssyunsheng
8386 15

[程序分享] R抓取股票数据(东方财富网) [推广有奖]

  • 2关注
  • 47粉丝

博士生

51%

还不是VIP/贵宾

-

威望
0
论坛币
24 个
通用积分
5.0108
学术水平
47 点
热心指数
49 点
信用等级
43 点
经验
5133 点
帖子
203
精华
0
在线时间
301 小时
注册时间
2012-2-21
最后登录
2024-2-22

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
获取信息的能力往往是成就一个人或一个组织关键力量,从二战时期的恩格玛密码开始,人类进入了信息时代,信息开始在各个领域发挥越来越大的作用,甚至成为一种独立于其他资源之外的资源。
数据分析挖掘人员除了研究企业自有的数据外,还要能够获得外界的公开数据和二手数据,更要注重内外数据的结合。巧妇难为无米之炊,当自身数据资源匮乏时,更要有能力获得外部数据帮助企业和个人决策。善不到我面前来,我就到山里挖矿,本章我们就集中学习一下R和python抓取数据的技术。

  1. >获取信息的能力同其他专业技能一样重要,专业化深度分工的社会里更要注重信息的广度。
复制代码


首先先见识一下R抓取常见的网络数据,抓取数据首先要虚拟一个命令行浏览器,`RCurl`包就是R语言的一个命令行浏览器;`XML`包则用来解析处理浏览器接受到的XML或是HTML数据;数据解析完成之后,就要进行一些数据整理的工作,`stringr`是处理字符数据的不二之选。

###载入数据包
  1. if (!suppressWarnings(require(RCurl))) {
  2.   install.packages("RCurl")
  3.   require(RCurl)
  4. }

  5. if (!suppressWarnings(require(XML))) {
  6.   install.packages("XML")
  7.   require(XML)
  8. }

  9. if (!suppressWarnings(require(stringr))) {
  10.   install.packages("stringr")
  11.   require(stringr)
  12. }
复制代码


在抓取数据之前,需要了解网络数据的格式,网络数据一般包括text文本、表格、超文本标记语言(HTML)、JSON等等,另外获取数据时是不是有权限限制等等这些需要事先清楚明白,一方面为了选择合适的抓取方法,另一方面如果出现错误或困难,可以详细描述自己的问题方便别人给予帮助。
遵从循序渐进的介绍方法,首先从简单地读取text格式的网页文本开始,从古滕堡(`www.gutenberg.org`)抓取一本《An Inquiry into the Nature and Causes of the Wealth of Nations》读读,这本书的名字直译过来为《国民财富的性质和原因的研究》,他还有一个更为响亮的名字《富国论》,世人尊称亚当·斯密为“现代经济学之父”和“自由企业的守护神”,人类第一次认识了那双看不见的手(`invisible hand`),毫不知情的情况下,这双看不见的手引导自私自利的人类在谋取自身利益的同时促进人类全体利益向前发展,今天我们就用R完整的抓取这本书,以纪念这一人类精英。

###读取文本数据
  1. url <- "http://www.gutenberg.org/cache/epub/3300/pg3300.txt"
  2. fuguolun <- readLines(url)
  3. temp <- paste(fuguolun, collapse = "\n")
  4. write.table(temp, "G:/zimeiti/dzdata/fuguolun.txt")
复制代码

直接使用R基础包里的`readLines`函数即将《富国论》论读取完整了,`readLines`有很多参数,最有用的是`n`和`encoding`这两个参数,前者用来指定读取文本的前几行,后者用来指定文本的字符编码。除此之外`readLines`函数读取的结果是一个list对象,文本的每一行(注:文本中一行字符代表着我们所说的一段字符)为list的一个元素。
如果直接将list输出为txt,R将在每一段的开头添加list元素的编号,不符合电子书的格式,需要将它们按一定的格式融合在一起,比如每一行使用换行。使用`paste`函数可以将它们粘在一起,需要注意的是paste函数的两个参数sep和collapse,他们是用来设置粘贴时以什么分隔符隔离,用法略有不同。如果要将一个`vector`对象粘在一起,使用逗号分开,就设置`sep = ","`,而不用设置`collapse`,如果是将一个`list`的对象粘在一起,就使用`collapse = ","`。这里是后者,不过选择的分割符为`\n`。
然后在将调整好的文件使用`write.table`函数写入到指定目录就行了,到这里我们就得到了这本名震江湖的《富国论》,值得一提的是富国论发表的同一年,正值乾隆爷全国范围内推行“删销书籍,以正人心”等文化管制政策时期,东西方横向对比,不禁让人感喟万千。
以上是牛刀小试,为自己准备了一份精神食粮《富国论》之后,可以开始尝试抓取一些更有难度的数据了。股票应该是很多人学习数据挖掘之路上常常幻想的突破点,不幸的是大多数人在此折戟沉沙,虽然没有能够完成预测市场的重任,但也锻炼了个人技能。既然这条路流下了很多“先贤”的足迹,在此也不妨尝试一下抓取股票数据,万一梦想成真了呢?
东方财富网公布大量的股票数据,借此宝地,抓取他们的龙虎榜的股票交易数据留作“中国梦”的数据资本也是不错的选择,据我认识的一个大隐隐于市的老股民说,龙虎榜的机构交易数据往往能预示以后的股票走势,机构看好,后期走高,机构逃跑,就有可能成为接盘侠。奉劝各位不要据此投资,以上是不负责任的言语,大可不必当真,成功抓取数据才是本书的责任所在。

###HTML格式
  1. lhb <- "http://data.eastmoney.com/stock/lhb/600006.html"
复制代码


首先解释一下这个网址`http://data.eastmoney.com/stock/lhb/600006.html`,`http://data.eastmoney.com/stock/lhb`表示东方财富网的数据分支龙虎榜数据;`600006`是股票的代码,它指东风汽车,可以换成任何已知的股票代码,龙虎榜数据每天收盘后更新,读者可以根据需要抓取;`html`表示网页数据是超文本标记语言格式。
不得不说说`html`的基础内容,它是一种描述数据并将数据结构化的语言。在网页上显示数据不仅要标记某一部分是什么文件,比如图片、音频、视频、文本等等,还要标注它们的归属关系,`html`和`xml`做的就是这部分工作。在浏览器中右键选择(Ctrl+U)“查看网页源代码”可以查看网页标记语言文本。
###简单的html结构
  1. <html>

  2. <body>
  3.   <h1>烈日灼心</h1>
  4.   <div id="info">
  5.         <span ><span class='pl'>导演</span>: <span class='attrs'><a href="/celebrity/1274278/" rel="v:directedBy">曹保平</a></span></span><br/>
  6.         <span class="actor"><span class='pl'>主演</span>: <span class='attrs'><a href="/celebrity/1274235/" rel="v:starring">邓超</a> / <a href="/celebrity/1274291/" rel="v:starring">段奕宏</a> / <a href="/celebrity/1274274/" rel="v:starring">王珞丹</a> / <a href="/celebrity/1118269/" rel="v:starring">高虎</a></span></span><br/>
  7.         <span class="pl">制片国家/地区:</span> 中国大陆<br/>
  8.         <span class="pl">语言:</span> 汉语普通话<br/>
  9.         <span class="pl">上映日期:</span> <span property="v:initialReleaseDate" content="2015-08-27(中国大陆)">2015-08-27(中国大陆)</span> </span><br/>
  10.   </div>
  11. </body>
  12. </html>
复制代码


`html`一般分为头部、体部,`<html>`与`</html>`之间描述整个网页,包括网页的结构和标志等等,`<body>`与`</body>`是网页可见的内容,`<div>`与`</div>`描述一个模块。其树状结构如下图:
html.png
而我们提取网页是从树的根部(root)一层一层向下盘剥的,显示根结构再到枝结构再到亚枝结构再到叶,这样就可以顺藤摸瓜找到目标数据然后抽提出来重新组合成新的数据结构。
###读取HTML数据
  1. wp <- getURL(lhb,.encoding ="gb2312")
  2. wp2 <- iconv(wp,"gb2312","UTF-8")
  3. trade <- htmlParse(wp2, asText = TRUE, encoding = "UTF-8")
复制代码


`getURL`来自神奇的RCurl包,它将网页下载下来,参数很多,一般要用到的只有两个,第一个参数为要目标网页地址,可以是一个也可以是多个,`.encoding`用来指定网页的编码方式,一般为utf-8或gb2312,编码参数标注不当会出现乱码。
  1. ```{r}一旦发现乱码,即为编码方式有误,《密码故事》:信息接口错误往往会造成信息混乱。```
复制代码


然后用`iconv`函数进行了一次转码,该函数包括三个参数,第一个为需要转码的数据;第二个为数据原始的编码;第三个为将要转成的目标编码方式。

最后也是抓取数据最重要的部分,就是要对`getURL`函数下载下来的内容进行解析为R能识别的`XML/HTML`树状结构。如果网页使用的标记语言不同,那么选择的解析函数也不同,一般可以根据网址的尾部会出现`html`或`xml`,或者网页源码的开头会注明。如果你要解析的是`html`网页,就需要使用`htmlParse`,如果是`xml`网页,就使用`xmlParse`函数,尽管它们之间可以参数设置相通,最好还是根据网页源码选择函数。不难看出,龙虎榜是`html`标记,所以使用`htmlParse`函数解析。

  1. ```{r}traderoot <- xmlRoot(trade)temp <- xmlChildren(traderoot)names(temp)tradehead <- xmlChildren(traderoot)$headxmlChildren(tradehead)$title```
复制代码


除了解析函数以外,其他整理函数都是通用函数,`xmlRoot`函数用于获取网页的顶级节点,顶级节点就是没有父节点的根节点,包括文档自身和子节点。`xmlChildren`函数用于查看节点的子节点,函数`names`在R中属于基础函数,以后会经常见到,用于查看对象的元素名称,可以查看根节点包括哪些子节点,发现根节点的下一级节点包括"head"和"body"两个子节点。如果使用`xmlChildren(temp)`查看temp的子节点就会报错,因为temp包含"head"和"body"两个平级的节点,函数不知道要查看哪一个的子节点,也就是说数只能顺藤摸瓜,不能脚踏两只船。比如可以通过`xmlChildren(tradehead)$title`查看"head"子节点“title”。

  1. ```{r}tradedata <- xpathSApply(traderoot, "//div[@id='container']/div[@class='mainFrame']",xmlValue) ```
复制代码


当然这样一条一条的查下去非常低效,可以在浏览器中右键选择(Ctrl+Shift+I)“审查元素”查看网页的树状结构。目标数据在“body”分支内,它下面有多个同名的“div”子节点,第一个“div”的类标记为`id='container'`这样就可以指定第一个类了,这个类下面又包括多个“div”子节点,但目标数据存储在类为`class="mainFrame"`的“div”子节点内,当在审查元素界面用鼠标指向这个节点时,网页上的表格被阴影覆盖(如图),既然如此就可以通过树状结构指向这个类,如`//div[@id='container']/div[@class='mainFrame']`,两个斜杠表示结构前面省略了一些父分支,`xpathSApply`函数用于截取指定树状结构下的分支,如果是表格的话`table//th`用于指定表格的名称,`table//td`指定表格的数据。
lhbtree.png

  1. ```{r}buydf <- readHTMLTable(trade, which = 1)names(buydf) <- c("序号", "交易营业部名称", "买入金额(万)", "占总成交比例", "卖出金额(万)", "占总成交比例", "净额(万)")```
复制代码


实际上针对龙虎榜的数据没必要按照套路抓取,它实际上是两个表格:买入金额最大的前5名和卖出金额最大的前5名。这样就没必要大费周章的一个节点一个节点的向下抓取。可以通过`readHTMLTable`读取网页中的表格,`readHTMLTable`的数据为`htmParse`函数解析的数据,`which`参数用于指定读取网页中第几个表格,由于转码后数据的列名出现乱码,这里通过`names`对各列重新命名。

  1. ```{r}saledf <- readHTMLTable(trade, which = 2)colnames(saledf) <- c("序号", "交易营业部名称", "买入金额(万)", "占总成交比例", "卖出金额(万)", "占总成交比例", "净额(万)")saledf <- saledf[-6,]```
复制代码


抓取“卖出金额最大的前5名”表格只需要将`readHTMLTable`的`which`参数改为2即可,最后我们需要删除表格2的最后一行,因为它仅仅是卖出和买入的汇总值。这样网页的重点数据已经入我瓮了,最后难免需要对数据清洗整形。

可以关注我们的公众号,很多关于R和python的书籍、数据、文章、代码。
关于我们,关注理性与文艺,用数据创作内容性的精致阅读,这里是数据分析挖掘人员与文艺青年的集结地,不做鼓吹,只踏踏实实的做一个又一个数据驱动的文章,用数据解读生活现象,实实在在的数据挖掘、分析、可视化,并分享十分清晰的思路和代码注释,并设计机器人减轻数据分析的负担,无论你感兴趣还是想参与都可以关注,请加微信公众号大音如霜 qrcode_for_gh_89f96c48034b_430.jpg


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:东方财富网 股票数据 东方财富 财富网 invisible 财富网 东方 抓取数据

已有 1 人评分经验 论坛币 收起 理由
李会超 + 80 + 20 精彩帖子

总评分: 经验 + 80  论坛币 + 20   查看全部评分

竟然没有人赞??不知运行过程怎么样,不过还是很好

使用道具

藤椅
jjxm20060807 发表于 2015-10-17 10:22:20 |只看作者 |坛友微信交流群
谢谢分享

使用道具

板凳
江流尚可 发表于 2015-10-17 15:59:48 |只看作者 |坛友微信交流群
运行效果不好啊  数据搞不出来

使用道具

报纸
ryoeng 在职认证  发表于 2015-10-18 08:27:56 来自手机 |只看作者 |坛友微信交流群
提示: 作者被禁止或删除 内容自动屏蔽

使用道具

地板
sssyunsheng 在职认证  发表于 2015-10-18 14:17:56 |只看作者 |坛友微信交流群
江流尚可 发表于 2015-10-17 15:59
运行效果不好啊  数据搞不出来
代码不知道问什么挤在一起了

使用道具

7
nieqiang110 学生认证  发表于 2015-10-18 22:11:32 |只看作者 |坛友微信交流群
hhhhhhhhhhhhhhh,太牛了

使用道具

8
winner13 发表于 2015-10-30 00:08:07 |只看作者 |坛友微信交流群
运行的不行,求指教

使用道具

9
jgchen1966 发表于 2015-10-30 12:13:21 |只看作者 |坛友微信交流群

使用道具

10
sssyunsheng 在职认证  发表于 2015-10-30 14:40:31 |只看作者 |坛友微信交流群
winner13 发表于 2015-10-30 00:08
运行的不行,求指教
关注我们公众号:大音如霜 或者加入qq群讨论:105646151

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 15:06