Rvest web scrape返回空字符

时间:2017-08-05 04:31:08

标签: r web-scraping rvest pubchem

我希望使用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只返回字符(空)。我使用SelectorGadget来获取HTML节点,但我注意到SelectorGadget给了我一个与Inspector在Google Chrome中的节点不同的节点。我在那行代码中尝试了".short .breakword"".summary-title short .breakword",但两者都没有给我我想要的东西。

Screenshot of SelectorGadget and Inspector

1 个答案:

答案 0 :(得分:3)

我最近使用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为我们提供了另一种查询方式使用化学翻译服务

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,则可以从页面中解析更多信息,但不是全部。例如,在 Literature Patents Biomolecular Interactions and Pathways 等部分中,这些部分中的信息将不会完全显示在JSON中信息。

从页面获取所有信息的最终和最全面的方法是使用Scrapy或PhantomJS之类的东西来呈现PubChem页面的完整html输出,然后使用rvest像您最初预期的那样抓取它。这是我仍在努力的事情,因为这是我第一次使用网络抓取工具。

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