• R语言
  • 请问如何抓取上海证券交易所网页上的上市公司列表?

上海证券交易所在这个界面列出了其上市公司的名单

上交所上市公司代码列表



其网页上的数据结构是这样的:

证券代码 证券简称
600000 浦发银行
600004 白云机场
600005 武钢股份
600006 东风汽车
600007 中国国贸
600008 首创股份
600009 上海机场
600010 包钢股份
600011 华能国际
600012 皖通高速
600015 华夏银行
600016 民生银行
600017 日照港
600018 上港集团
600019 宝钢股份
600020 中原高速
600021 上海电力
600022 山东钢铁
600023 浙能电力
600026 中海发展
600027 华电国际
600028 中国石化
600029 南方航空
600030 中信证券
600031 三一重工
600033 福建高速
600035 楚天高速
600036 招商银行
600037 歌华有线
600038 中直股份
600039 四川路桥
600048 保利地产
600050 中国联通
600051 宁波联合
600052 浙江广厦
600053 中江地产
600054 黄山旅游
600055 华润万东
600056 中国医药
600057 象屿股份
600058 五矿发展
600059 古越龙山
600060 海信电器
600061 国投安信
600062 华润双鹤
600063 皖维高新
600064 南京高科
600066 宇通客车
600067 冠城大通
600068 葛洲坝

但是它所有的数据分散在22个页面上,请问如何用R读取这22个页面上的列表数据,然后存储在一个数据集中?


---

顺便也问下怎么提取深交所的数据吧,因为发现这两个网站的结构似乎不一样。

深交所上市公司代码列表

深交所的数据在177个页面上。
https://github.com/miemiekurisu/stockdata

找一下我以前帖子的说明吧=w=
require(RCurl)
require(XML)
require(rvest)

url <- "http://www.sse.com.cn/assortment/stock/list/name/"
page <- htmlParse(url, encoding = "utf-8")
table_stock <- getNodeSet(page, "//div[@id='dateList']/table")
html_table(table_stock)[[1]]
   证券代码 证券简称
1    600000 浦发银行
2    600004 白云机场
3    600005 武钢股份
4    600006 东风汽车
5    600007 中国国贸
6    600008 首创股份
7    600009 上海机场
8    600010 包钢股份
9    600011 华能国际
10   600012 皖通高速
11   600015 华夏银行
12   600016 民生银行
13   600017   日照港
14   600018 上港集团
15   600019 宝钢股份
16   600020 中原高速
17   600021 上海电力
18   600022 山东钢铁
19   600023 浙能电力
20   600026 中海发展
21   600027 华电国际
22   600028 中国石化
23   600029 南方航空
24   600030 中信证券
25   600031 三一重工
26   600033 福建高速
27   600035 楚天高速
28   600036 招商银行
29   600037 歌华有线
30   600038 中直股份
31   600039 四川路桥
32   600048 保利地产
33   600050 中国联通
34   600051 宁波联合
35   600052 浙江广厦
36   600053 中江地产
37   600054 黄山旅游
38   600055 华润万东
39   600056 中国医药
40   600057 象屿股份
41   600058 五矿发展
42   600059 古越龙山
43   600060 海信电器
44   600061 国投安信
45   600062 华润双鹤
46   600063 皖维高新
47   600064 南京高科
48   600066 宇通客车
49   600067 冠城大通
50   600068   葛洲坝
不谢
[未知用户]

运行出现下面的问题,请问是怎么回事?
> html_table(table_stock)[[1]]
Error in UseMethod("html_table") : 
  no applicable method for 'html_table' applied to an object of class "XMLNodeSet"
[未知用户]
这个是python做的吧?有用R语言实现的吗?我不懂python
[未知用户]
你的包装对了吗?这么简单的爬虫都不会
[未知用户]
惭愧!

刚又在宿舍电脑上试了下,应该是包没装好。
ERROR: dependency ‘xml2’ is not available for package ‘rvest’
* removing ‘/home/peter/R/x86_64-pc-linux-gnu-library/3.2/rvest’
Warning in install.packages :
  installation of package ‘rvest’ had non-zero exit status
[未知用户]

我在办公室电脑上又试了以下,也没提示说找不到包,但是还是出错.

> require(RCurl)
> require(XML)
> require(rvest)
> 
> url <- "http://www.sse.com.cn/assortment/stock/list/name/"
> page <- htmlParse(url, encoding = "utf-8")
> table_stock <- getNodeSet(page, "//div[@id='dateList']/table")
> html_table(table_stock)[[1]]
Error in UseMethod("html_table") : 
  no applicable method for 'html_table' applied to an object of class "XMLNodeSet"
> 

try this:
url <- 'http://www.sse.com.cn/js/common/ssesuggestdata.js;pv25b1d75434c14a1f'
 
 page <- readLines(url, encoding = 'UTF-8')
 head(page)
 code.tmp <- strsplit(page, '\"')
 code.tmp[[5]][c(2,4)]
no package needed :devil:
[未知用户]
果然可以!谢谢!

有几个小问题:

1、下面这个链接
http://www.sse.com.cn/js/common/ssesuggestdata.js;pv25b1d75434c14a1f

你是怎么找到的?

一般去上证的官网找股票代码,会是这个网址吧

http://www.sse.com.cn/assortment/stock/list/name/

但是用这个网址的话,是不能获取结果的。
不过如果直接在浏览器地址栏输入

http://www.sse.com.cn/js/common/ssesuggestdata.js;pv25b1d75434c14a1f

网站会说“页面无法找到 ”。

2、 如何知道有用的信息是从code.tmp的第五个元素开始的?是目测,还是这里有什么规则?
我用的是目测,用head(code.tmp)发现的

> head(code.tmp)
[[1]]
[1] "//staticDate=2015-10-23 18:00:02 "

[[2]]
character(0)

[[3]]
[1] "function get_data(){"

[[4]]
[1] "var _t = new Array();"

[[5]]
[1] "_t.push({val:" "600000"        ",val2:"        "浦发银行"     
[5] ",val3:"        "pfyx"          "});"          

[[6]]
[1] "_t.push({val:" "600004"        ",val2:"        "白云机场"     
[5] ",val3:"        "byjc"          "});"