JS代码下载Shiny网页应用中的数据

需求

141cdcbe17d8c7ff38ffd5589be88ca6.png

该文使用RNA-seq的数据做了病人组和控制组的信息挖掘工作。说好的数据共享,却是不知所踪。

  • INIA和COGA的网站?没有链接,根本找不到。

  • GEO?没有ID,去GEO搜索该文章也搜不到。

  • 发邮件给作者?一作邮箱查无此人。。

  • 用他们的Shiny app?根本没有下载的按钮。

23f1173652d210257bcf3bd6e0b418f6.png

其实在Shiny中加入下载按钮大概就是5分钟的事情,却要让用户花50分钟下载到这些数据。由于Shiny网页运用似乎没有明确的网页请求,也就是说无论点击哪个页面,该运用的网址都是固定的,觉得使用提交网页请求的方式爬取表格的内容不太可行。所以尝试使用JS代码的方式遍历所有页面,并且将每页的数据保存到本地。

思路

  1. 遍历所有页面

  2. 保存页面中的表格

  3. 下载表格

遍历所有页面

3a0ad27fb95921744eac814e916fa29e.png

查看该按钮的元素,会发现它是一个单独的class(类),名称为paginate_button next

59fbafe643e823e14ac6f563f406c986.png

所以可以使用以下代码获取该按钮并按键即可实现翻页的操作。

document.getElementsByClassName('paginate_button next')[0].click();

保存页面中的表格

同样审查表格的元素会发现,每一行都为同一类别tr(tablerow)

798d2f1c8868b2a78da7c0cdbb267fef.png

924ef660b5c879f2cf2383e5b6339677.png

因此,思路类似,找到tr的类,然后保存为用逗号分隔的格式,每行末尾用换行符分隔\n。

var csv = [];  
   var rows = document.querySelectorAll("table tr");  
   
   //merge the whole data in tabular form   
   for(var i=0; i<rows.length; i++) {  
    var row = [], cols = rows[i].querySelectorAll("td, th");  
    for( var j=0; j<cols.length; j++)  
       row.push(cols[j].innerText);  
    csv.push(row.join(","));  # 根据需要可换成\t
   }

需要注意的是,原表格中使用了逗号标记千分位,因此,如果继续使用逗号分隔列的话,就会出问题。

48dc4a9a5a9e48c15eb5633b441783b8.png

可以使用\t分隔列,也就是tsv的文件格式。

保存表格到本地

首先定义一个下载CSV的函数

function downloadCSV(csv, filename) {  
    var csvFile;  
    var downloadLink;  
     
    //define the file type to text/csv  
    csvFile = new Blob([csv], {type: 'text/csv'});  
    downloadLink = document.createElement("a");  
    downloadLink.download = filename;  
    downloadLink.href = window.URL.createObjectURL(csvFile);  
    downloadLink.style.display = "none";  
  
    document.body.appendChild(downloadLink);  
    downloadLink.click();  
}

再将之前储存表格的变量保存即可。

downloadCSV(csv.join("\n"), filename);

最后

将以上代码组装在for循环中就可以了。思路有两种:

  1. 遍历表格,保存每个表格。需要注意的问题:

    1. 每次保存都需要选择保存路径和文件名。

    2. 遍历表格需要加一个sleep的功能,否则翻页一次翻到底。

  2. 遍历表格,存储每个表格的内容到一个变量,之后保存表格。需要注意的问题:

    1. 遍历表格需要加一个sleep的功能,否则翻页一次翻到底。

    2. 表头不需要每次都保存到变量。

此外还可以将此功能做成一个按钮,显示在页面上,如上该推送所示。但也不是必须的,因为可以直接在console中运行JS的代码。

7bcbc82a724a5ead258acace39f5f93f.png

最最后

在着手写for循环之前,发现不需要遍历每个页面,在一个地方稍作改动即可。

cdade1de75f18b7df69dc91077c841b5.png

c9df7dd47b79cb78d2833f5800f115af.png

这里把100改成15000(因为一共有差不多14000+行),所有数据将呈现在一个页面中,用保存和下载表格的代码即可下载到该表格。正准备分析数据之际,收到了文章senior author的回信,给我分享了数据😓

参考:

https://www.javatpoint.com/javascript-create-and-download-csv-file

752ab4b63f27df892cd3fc87e8245909.png

8aaa403333607cb3216e9c33efd37e53.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值