2

我正在寻找使用 R 的化学数据库中的一些数据,主要是name,CAS Numbermolecular weight现在。但是,我无法rvest提取我正在寻找的信息。这是我到目前为止的代码:

library(rvest)
library(magrittr)

# Read HTML code from website
# I am using this format because I ultimately hope to pull specific items from several different websites
webpage <- read_html(paste0("https://pubchem.ncbi.nlm.nih.gov/compound/", 1))

# Use CSS selectors to scrape the chemical name
chem_name_html <- webpage %>%
                  html_nodes(".short .breakword") %>%
                  html_text()

# Convert the data to text
chem_name_data <- html_text(chem_name_html)

但是,当我尝试创建时name_html,R 只返回字符(空)。我正在使用SelectorGadget获取 HTML 节点,但我注意到这SelectorGadget给了我一个与 Inspector 在 Google Chrome 中所做的不同的节点。我在这行代码中都试过了".short .breakword"".summary-title short .breakword"但都没有给我我想要的东西。

SelectorGadget 和 Inspector 的屏幕截图

4

1 回答 1

3

我最近在使用rvest刮 PubChem 时遇到了同样的问题。问题是当您向下滚动页面时,页面上的信息是使用 javascript 呈现的,因此rvest只能从页面中获取最少的信息。

不过有一些解决方法。将所需信息导入 R 的最简单方法是使用名为webchem.

如果您要查找名称、CAS 编号和分子量,则可以执行以下操作:

library(webchem) chem_properties <- pc_prop(1, properties = c('IUPACName', 'MolecularWeight'))

可以在此处找到可以使用此 api 提取的复合属性的完整列表。不幸的是,没有通过此 api 获取 CAS 编号的属性,但webchem为我们提供了另一种使用化学翻译服务查询的方法。

chem_cas <- cts_convert(query = '1', from = 'CID', to = 'CAS')

第二种从页面获取信息的方法更健壮但不太容易使用,即从 JSON api 获取信息。

library(jsonlite) chem_json <- read_json(paste0("https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/data/compound/", "1", "/JSON/?response_type=save$response_basename=CID_", "1"))

使用该命令,您将获得一个列表列表,我必须编写一个复杂的脚本来解析我需要从页面中获取的信息。如果您熟悉 JSON,则可以从页面解析更多信息,但不是全部。例如,在文献专利生物分子相互作用和途径等部分中,这些部分中的信息不会完全显示在 JSON 信息中。

从页面获取所有信息的最后也是最全面的方法是使用诸如 Scrapy 或 PhantomJS 之类的东西来呈现 PubChem 页面的完整 html 输出,然后rvest按照您最初的意图使用它来抓取它。这是我仍在努力的事情,因为这也是我第一次使用网络爬虫。

我仍然是这个领域的初学者,但希望这对你有所帮助。

于 2017-09-05T19:08:59.637 回答