Rvest 网络抓取 returns 空字符

Rvest web scrape returns empty character

我希望使用 R 从化学数据库中抓取一些数据,目前主要是 nameCAS 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 仅 returns 字符(空)。我正在使用 SelectorGadget 获取 HTML 节点,但我注意到 SelectorGadget 给我的节点与 Inspector 在 Google Chrome 中所做的不同。我在那行代码中尝试了 ".short .breakword"".summary-title short .breakword",但都没有给我想要的东西。

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

虽然有一些解决方法。将所需信息获取到 R 中的最简单方法是使用名为 webchem.

的 R 包

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

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

可以使用此 api can be found here. 提取的化合物属性的完整列表不幸的是,没有 属性 通过此 api 获取 CAS 编号,但是 webchem 为我们提供了另一种查询方式,使用 Chemical Translation Service.

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 抓取就像您最初打算的那样。这是我仍在努力的事情,因为这也是我第一次使用网络抓取工具。

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