【发布时间】:2018-01-16 15:09:20
【问题描述】:
我正在网页上抓取页面
http://catalog.ihsn.org/index.php/catalog#_r=&collection=&country=&dtype=&from=1890&page=1&ps=100&sid=&sk=&sort_by=nation&sort_order=&to=2017&topic=&view=s&vk=
从这个网址,我通过以下代码建立了一个数据框:
dflist <- map(.x = 1:417, .f = function(x) {
Sys.sleep(5)
url <- ("http://catalog.ihsn.org/index.php/catalog#_r=&collection=&country=&dtype=&from=1890&page=1&ps=100&sid=&sk=&sort_by=nation&sort_order=&to=2017&topic=&view=s&vk=")
read_html(url) %>%
html_nodes(".title a") %>%
html_text() %>%
as.data.frame()
}) %>% do.call(rbind, .)
为了获取我感兴趣的所有数据,我重复了相同的代码,它似乎工作得很好,尽管由于 Sys.sleep() 的原因当然有点慢。
一旦我尝试抓取应包含在数据框中的单个项目描述,我的问题就出现了。
例如,第一个项目描述在
http://catalog.ihsn.org/index.php/catalog/7118/study-description
第二个项目描述在
http://catalog.ihsn.org/index.php/catalog/6606/study-description
等等。
我的问题是我找不到动态方法来抓取所有项目的页面并将它们插入数据框中,因为 URL 中的数字不是渐进式的,也不是链接末尾的。
为了让事情更清楚,这是我正在抓取的网站的结构:
1.http://catalog.ihsn.org/index.php/catalog#_r=&collection=&country=&dtype=&from=1890&page=1&ps=100&sid=&sk=&sort_by=nation&sort_order=&to=2017&topic=&view=s&vk=
1.1. http://catalog.ihsn.org/index.php/catalog/7118
1.1.a http://catalog.ihsn.org/index.php/catalog/7118/related_materials
1.1.b http://catalog.ihsn.org/index.php/catalog/7118/study-description
1.1.c. http://catalog.ihsn.org/index.php/catalog/7118/data_dictionary
我已经成功爬到 1 级。但不能达到 1.1.b 级。 (study-description) 是我感兴趣的,因为 URL 的动态元素(在本例中为:7118)在该级别网站的 6000 多个页面中并不一致。
【问题讨论】:
-
目前还不清楚您的问题是什么。如果您在尝试抓取描述时清楚地包括您的问题,这将有助于我们为您提供帮助。
-
我的问题是我找不到动态方法来抓取所有项目的页面并将它们插入数据框中,因为 URL 中的数字不是渐进式的,也不是链接末尾的。
-
您可以使用
html_attr("href")代替html_text获取各个网址,然后使用purrr来遍历该列表。 -
谢谢,这可能是一个想法,但是您指的是哪个命令
purrr命令? -
您可以只使用
map或apply系列函数并创建一个辅助函数来遍历网址
标签: r dataframe web-scraping