首页 > 数据库 >一个函数抓取代谢组学权威数据库HMDB的所有表格数据

一个函数抓取代谢组学权威数据库HMDB的所有表格数据

时间:2023-05-07 23:38:20浏览次数:45  
标签:25 25254000 组学 抓取 Increase details HMDB Blood



爬虫是都不陌生的一个概念,比如百度、谷歌都有自己的爬虫工具去抓取网站、分析、索引,方便我们的查询使用。

在我们浏览网站、查询信息时,如果想做一些批量的处理,也可以去分析网站的结构、抓取网页、提取信息,然后就完成了一个小爬虫的写作。

网页爬虫需要我们了解URL的结构、HTML语法特征和结构,以及使用合适的抓取、解析工具。我们这篇先看一个简单的处理,给一个直观的感受:一个函数抓取网页的表格。以后再慢慢解析如何更加定制的获取信息。

HMDB (人类代谢组数据库)收录了很多代谢组的数据,用于代谢组学、临床化学、生物标志物开啊和基本教育等。数据联通化学、临床、分子生物学3个层次,共有114,099个代谢物。

网站提供了多种浏览和查询功能,可以关注不同的疾病、通路、BMI、年龄、性别相关代谢组学。

一个函数抓取代谢组学权威数据库HMDB的所有表格数据_ci

下图展示的是BMI相关代谢物的数据。

一个函数抓取代谢组学权威数据库HMDB的所有表格数据_ci_02

如果我们想把这个表格下载下来,一个办法是一页页的拷贝,大约拷贝十几次,工作量不算太大,但有些无趣。另外一个办法就是这次要说的抓取网页。

R的XML包中有个函数readHTMLTable专用于识别HTML中的表格 (table标签),从而提取元素。具体使用如下:

# Load the package required to read website
library(XML)

# wegpage address 
url <- "http://www.hmdb.ca/bmi_metabolomics"

# header=T, 使第一行或thead属性的内容为标题
df1 <- readHTMLTable(url, header=T, stringsAsFactors = F)

# 初次使用,不了解输出格式时可使用str查看
str(df1)
> str(df1)
List of 1
 $ NULL:'data.frame':  25 obs. of  7 variables:
  ..$ V1: chr [1:25] "Butyrylcarnitine (HMDB0002013)" "Alpha-ketoisovaleric acid (HMDB0000019)" "2-Hydroxy-3-methylbutyric acid (HMDB0000407)" "3-Methyl-2-oxovaleric acid (HMDB0000491)" ...
  ..$ V2: chr [1:25] "" "" "" "" ...
  ..$ V3: chr [1:25] "Increase" "Increase" "Increase" "Increase" ...
  ..$ V4: chr [1:25] "Blood" "Blood" "Blood" "Blood" ...
  ..$ V5: chr [1:25] "9.95e-10" "2.87e-08" "1.19e-05" "1.68e-05" ...
  ..$ V6: chr [1:25] "25254000" "25254000" "25254000" "25254000" ...
  ..$ V7: chr [1:25] "details" "details" "details" "details" ...
# The readHTMLTable returns list, we need to extract our data frame. In this example, the first element is our data frame, so we can extract it like this:
head(df1[[1]])  # extract the first element of list
#df1[["NULL"]]  # extract list element based on element names (第一个元素的名字是NULL)
1               Butyrylcarnitine (HMDB0002013)    Increase Blood 9.95e-10
2      Alpha-ketoisovaleric acid (HMDB0000019)    Increase Blood 2.87e-08
3 2-Hydroxy-3-methylbutyric acid (HMDB0000407)    Increase Blood 1.19e-05
4     3-Methyl-2-oxovaleric acid (HMDB0000491)    Increase Blood 1.68e-05
5                    Ketoleucine (HMDB0000695)    Increase Blood 6.05e-05
6   (S)-3-Hydroxyisobutyric acid (HMDB0000023)    Increase Blood 6.88e-05
        V6      V7
1 25254000 details
2 25254000 details
3 25254000 details
4 25254000 details
5 25254000 details
6 25254000 details

这样我们就获得了第一页的表格,如果想获得随后的页的呢?鼠标移动经过分页的标签,可以看到URL的规律。

一个函数抓取代谢组学权威数据库HMDB的所有表格数据_ci_03

http://www.hmdb.ca/bmi_metabolomics?page=num,每一页就是变换下num;对首页来说,可以写page=1也可以省略,为了批量,一般写上。

# 294是在网页直接看到的总条数,25是每页显示的条数。(也是可以自动解析判断的)
pages = 1:ceiling(294 / 25)

url <- "http://www.hmdb.ca/bmi_metabolomics?page="

# 获得URL集合
url_all <- paste(url, pages, sep="")

a = sapply(url, readHTMLTable, header=T, stringsAsFactors=F)

# 合并获得的结果
b = do.call("rbind",a)

# 重命名行
rownames(b) <- 1:nrow(b)

这样就获得了所有的表格。

有两点需要注意

  1. 为了给被抓取的网站带去较大的访问压力,每抓取一次,最后间歇一段时间。这需要我们自定义一个函数,封装下readHTMLTable
  2. HMDB数据库提供了全数据下载功能,相比于抓取,下载下来数据,自己筛选合并是更好的方式。

一个函数抓取代谢组学权威数据库HMDB的所有表格数据_ci_04

问题解决

可能是因为网速或其它问题,有时直接把url提供给readHTMLTable不一定可以获取结果,下面提供了2额外的方式,供使用。

# Load the package required to read website
library(XML)

# wegpage address 
url <- "http://www.hmdb.ca/bmi_metabolomics"

# method one: for people who is luckiest (not me, so sad)
df1 <- readHTMLTable(url, header=T, stringsAsFactors = F)
  # Error: failed to load external entity "url"

# method two: use RCurl package, for people who is much luckier (only work on my laptop, not the computer in the office, crying)
library(RCurl)
xmldoc <- getURL(url)
df2 <- readHTMLTable(xmldoc, stringsAsFactors = F)

# method three: use httr package, for people who is not lucky
library(httr)
tabs <- GET(url)
df3 <- readHTMLTable(rawToChar(tabs$content), as.data.frame = T, stringsAsFactors = F)

标签:25,25254000,组学,抓取,Increase,details,HMDB,Blood
From: https://blog.51cto.com/u_16077014/6252721

相关文章

  • WireShark抓包工具抓取查看指定的软件进程网络包的方法
    一、查询应用的端口 1、打开【任务管理器】,点击【查看】—>【选择列】,选中【PID(进程标识符)】2、记录想要查询端口号的PID,比如:打开【运行】—>输入【cmd】,打开【命令处理器】 输入【netstat-ano|findstr6600】52330和52331即为IExplorer的端口号; 二、wiresh......
  • 网页抓取--1(原网页+Javascript返回数据)
     有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。一、抓取原网页。这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:第一步:打开这个网页......
  • 后缀数组学习笔记
    概念后缀数组,即对于一个串,它的每个后缀按字典序排序后得到的数组。有两个数组要求:\(SA_i\):排名为\(i\)的后缀的开头位置\(RK_i\):以\(i\)为开头的后缀的排名朴素sort排序一下优化倍增优化:我们进行\(\logn\)次排序,第\(k\)次取所有后缀的前\(2^k\)个字符进行......
  • drony 配置 burp 抓取 指定 app 数据包
    drony 配置burp抓取指定app数据包优势:可以抓取指定app数据包 下载并安装到安卓手机上,繁体版https://apps.evozi.com/apk-downloader/?id=org.sandroproxy.drony 打开Drony,并右滑至SETTING标签页,选择Networks,点击当前在用的wifi名,进入Networkdetails设置页 ......
  • 手把手教你对抓取的文本进行分词、词频统计、词云可视化和情感分析
    今日鸡汤苍苍竹林寺,杳杳钟声晚。大家好,我是Python进阶者。前言前几天星耀群有个叫【小明】的粉丝在问了一道关于Python处理文本可视化+语义分析的问题,如下图所示。他要构建语料库,目前通过Python网络爬虫抓到的数据存在一个csv文件里边,现在要把数据放进txt里,表示不会,然后还有后面的......
  • 在linux中如何读取使用tcpdump命令抓取保存的tcpdump capture file类型的数据文件
    笔者在之前的文章中,说明了如何在linux使用tcpdump命令进行抓包,以及将抓包结果保存到文件具体操作,可以参考:https://www.cnblogs.com/5201351/p/17357444.html如果是使用tcpdump命令,-wxxxxxx.dump这种方式保存的文件,我们可以通过file命令发现其文件类型[root@localhostqq-52......
  • 淘宝app端商品采集接口分享 商品详情图抓取 高并发请求
    接口名称:item_get_app请求方式:POST、GET返回数据格式:json请求示例:#coding:utf-8"""Compatibleforpython2.xandpython3.xrequirement:pipinstallrequests"""from__future__importprint_functionimportrequests#请求示例url默认请求参数已经做URL编......
  • 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取
    前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法。本文的总体思路如下:找到正确的URL,获取源码;利用bs4解析源码,获取歌曲名和歌曲ID;调用网易云歌曲API,获取歌词;将歌词写入文件,并存入本地。本文的目的是获取网易云......
  • 使用Fiddler抓取WebSockets协议包
    背景服务端通过SignalR用WebSockets通讯方式,与显示屏进行交互,除了显示屏软件上日志入口,也能通过抓包抓取对应报文。同时,可通过工具模拟与显示屏软件推送信息。那HTTP和WebSocket有什么区别呢?引用网友写的描述HTTP建立在TCP协议基础上而WebSocket通常建立在TCP上,也说明了为什......
  • 小白用chatgpt编写python 爬虫程序代码 抓取网页数据(js动态生成网页元素)
    jS动态生成,由于呈现在网页上的内容是由JS生成而来,我们能够在浏览器上看得到,但是在HTML源码中却发现不了一、注意:代码加入了常规的防爬技术    如果不加,如果网站有防爬技术,比如频繁访问,后面你会发现什么数据都取不到1.1 模拟请求头: 这里入进入一步加强,随机,主要是User-Agen......