• R语言
  • 求助:用httr2包怎么读取上交所的数据?

刚接触R语言爬虫,用rvest包试了几个例子都成功了,但是在读取上交所网页的数据时失败了,读进来的数据只有<table>标签,标签里的数据都没有。发现上交所的数据应该是每天更新的,因此猜测这是一个动态页面(纯小白,不懂网页方面的技术),网上查了动态网页可以用httr2包,简单看了下官网的教程后试了下还是读不出数据,跟rvest包的结果一样。是不是要请求网址后等几秒再读取数据呀,包里面好像没有实现这种功能的函数,特地来请教一下各位大神,

url <- "https://www.sse.com.cn/market/stockdata/overview/day/"
req <- request(url)
resp <- req_perform(req)
table <- resp_body_html(resp) |> 
  html_element("table") |> 
  html_table()

不是很懂html,自己尝试了一下,这个表格好像并不是这个url上的,其实是从另一个url上获取的数据。

url <- "https://query.sse.com.cn/commonQuery.do"
req <- request(url)
resp <- req %>%
    req_url_query(
        searchDate = "2021-12-24", 
        sqlId = "COMMON_SSE_SJ_GPSJ_CJGK_DAYCJGK_C", 
        stockType = "90"
    ) |>
    req_headers(
        Connection = "keep-alive", 
        Accept = "*/*", 
        `Accept-Encoding` = "gzip, deflate, br, zstd", 
        `Accept-Language` = "en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7", 
        `Content-Type` = "application/x-www-form-urlencoded", 
        Host = "query.sse.com.cn", 
        Referer = "https://www.sse.com.cn/", 
        `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36") |>
    req_perform()

resp_body_json(resp)

可以获得json版的数据,需要再自己处理一下

    fenguoerbian 的思路找了一下,奇怪日期为啥是21年,发现这个接口是历史数据,最多到21年,找了一下把 SQLid 换成 "COMMON_SSE_SJ_GPSJ_CJGK_MRGK_C" 就可以找最新的数据了。

    加上个format_result的函数把list 转换成data.frame, 数据应该跟网页一致了

    library(httr2)
    
    url <- "https://query.sse.com.cn/commonQuery.do"
    
    req <- request(url)
    resp <- req %>%
        req_url_query(
            searchDate = "2024-08-01", 
            sqlId = "COMMON_SSE_SJ_GPSJ_CJGK_MRGK_C", 
            stockType = "90",
            PRODUCT_CODE="01,02,03,11,17",
            type="inParams"
        ) |>
        req_headers(
            Connection = "keep-alive", 
            Accept = "*/*", 
            `Accept-Encoding` = "gzip, deflate, br, zstd", 
            `Accept-Language` = "en-US,en;q=0.9,zh;q=0.8,zh-CN;q=0.7", 
            `Content-Type` = "application/x-www-form-urlencoded", 
            Host = "query.sse.com.cn", 
            Referer = "https://www.sse.com.cn/", 
            `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36") |>
        req_perform()
    
    rslt = resp_body_json(resp)
    
    format_result = function(result){
        colsdef=data.table::fread(
    "
    col_cn col_en
    挂牌数 LIST_NUM
    市价总值(亿元) TOTAL_VALUE
    流通市值(亿元) NEGO_VALUE
    成交金额(亿元) TRADE_AMT
    成交量(亿股/亿份) TRADE_VOL
    平均市盈率(倍) AVG_PE_RATE
    换手率(%) TOTAL_TO_RATE
    流通换手率(%) NEGO_TO_RATE
    "
        )
        
        cols=colsdef$col_cn
        names(cols)= colsdef$col_en
        
        rslt2 = lapply(result,as.data.frame)
        names(rslt2) = c("主板A","主板B","科创板","股票回购","股票")
        
        rslt_final = do.call(rbind, rslt2)
        rslt_final=rslt_final[c(5,1,2,3,4),colsdef$col_en]
        
        col_old = colnames(rslt_final)
        colnames(rslt_final) = cols[col_old]
        
        
        return(rslt_final)
        
    }
    
    rslt.df = format_result(rslt$result)
    
    ## 转置
    as.data.frame(t(rslt.df))
    #>                        股票     主板A  主板B   科创板 股票回购
    #> 挂牌数                 2308      1691     43      574        0
    #> 市价总值(亿元)    446270.24 398292.29 838.92 47139.02      0.0
    #> 流通市值(亿元)     416208.8  381507.3 628.19 34073.32      0.0
    #> 成交金额(亿元)      2962.75   2572.86   1.26   388.63     1.65
    #> 成交量(亿股/亿份)    297.94    282.74   0.44    14.75     0.21
    #> 平均市盈率(倍)        12.25     11.58   6.43    31.67        -
    #> 换手率(%)            0.6639     0.646   0.15   0.8244      0.0
    #> 流通换手率(%)        0.7118    0.6744 0.2003   1.1406      0.0

    <sup>Created on 2024-08-07 with reprex v2.1.0</sup>

      tctcab 这个确实是我想要的数据,但是我完全没懂为什么要这样写,这些标头、查询,还有这个新的网址是怎么来的。请问R语言的爬虫怎么比较系统的学习,没找到像python这样的教材

        s609078902

        浏览器的控制面板(谷歌的话是按F12),打开network这个tab后重新刷新页面,就可以看到那些东西被加载了出来,这其中的一些元素点选之后可以看到旁边的header,query的具体内容。

        我没有学过爬虫,也不了解http协议等等,只是恰好曾经有个类似的经历这样扒过一个网站的数据,所以这次又如法炮制了一下。

        说实话我感觉真的要学的话,需要的并不是“R里面如何如何”,“Python里面如何如何”,而是先去了解http,浏览器是如何加载网页的这方面的知识,这个应该算是原理。等原理了解了,剩下到底是用R还是用Python去爬取,就基本都是调用接口的问题了。

        4 天 后

        xieshichen

        用searchDate运行没问题,不过发现股票回购那一列数据没了,看来人家的接口也是在不断调整