Rcrawler 抓取不产生页面

Rcrawler scrape does not yield pages

我正在使用 Rcrawler 提取维基百科页面的信息框。我有一个音乐家列表,我想提取他们的姓名、出生日期、死亡日期、乐器、标签等。然后我想创建一个列表中所有艺术家的数据框作为行,数据存储为columns/vectors.

下面的代码没有抛出任何错误,但我也没有得到任何结果。代码中使用的xpath在我单独使用rvest时有效

我的代码有什么问题?

library(Rcrawler)
jazzlist<-c("Art Pepper","Horace Silver","Art Blakey","Philly Joe Jones")

Rcrawler(Website = "http://en.wikipedia.org/wiki/Special:Search/", no_cores = 4, no_conn = 4, 
     KeywordsFilter = jazzlist,
     ExtractXpathPat = c("//th","//tr[(((count(preceding-sibling::*) + 1) = 5) and parent::*)]//td",
                         "//tr[(((count(preceding-sibling::*) + 1) = 6) and parent::*)]//td"),
     PatternsNames = c("artist", "dob", "dod"), 
     ManyPerPattern = TRUE, MaxDepth=1 )

我可能是错的,但我怀疑您认为 Rcrawler 包的工作方式与其不同。您可能会混淆抓取和抓取。

Rcrawler 只是从给定的页面开始,然后从该页面抓取 any link。您可以使用 URL 过滤器或关键字过滤器来缩小路径,但它仍然需要通过爬网过程到达这些页面。它没有 运行 搜索。

您从维基百科搜索页面开始的事实表明您可能希望它 运行 搜索您在 jazzlist 中指定的术语,但它不会这样做.它会简单地跟随维基百科搜索页面中的所有 links,例如'Main Pages'、'Content'、'Featured Content',它最终可能会或可能不会找到您使用的其中一个术语,在这种情况下,它会根据您的xpath 参数。

您指定的术语将非常罕见,因此虽然它最终可能会通过来自 'Featured Pages' 的文章交叉 link 找到它们,但它需要非常长的时间。

我认为您想要的是 根本不使用 Rcrawler,而是从搜索词的循环中调用 rvest 函数。您只需要将这些术语附加到您提到的搜索 URL 中,并将 space 替换为下划线:

library(rvest)
target_pages = paste0('https://en.wikipedia.org/wiki/Special:Search/', gsub(" ", "_", jazzlist))

for (url in target_pages){
    webpage = read_html(url)
    # do whatever else you want here with rvest functions 
}

编辑:在下面添加了解决方案,根据他的评论

library(rvest)
target_pages = paste0('https://en.wikipedia.org/wiki/Special:Search/', gsub(" ", "_", jazzlist))

for (url in target_pages){
    webpage = read_html(url)
    info<-webpage %>% html_nodes(xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "plainlist", " " ))]') %>% html_text() temp<-data.frame(info, stringsAsFactors = FALSE) data = rbind(data,temp) 
}

从特定的维基百科 URL 列表中抓取数据

如果您想抓取具有常见模式的特定 URL 列表,请使用 ContentScraper 函数:

library(Rcrawler)
jazzlist<-c("Art Pepper","Horace Silver","Art Blakey","Philly Joe Jones")
target_pages = paste0('https://en.wikipedia.org/wiki/Special:Search/', gsub(" ", "_", jazzlist))
DATA<-ContentScraper(Url = target_pages , 
                     XpathPatterns = c("//th","//tr[(((count(preceding-sibling::*) + 1) = 5) and parent::*)]//td","//tr[(((count(preceding-sibling::*) + 1) = 6) and parent::*)]//td"),
                     PatternsName = c("artist", "dob", "dod"),
                     asDataFrame = TRUE)
View(DATA)

从维基百科链接列表中抓取和抓取数据

我费了点功夫,在维基百科上找到了一份 hard bop 音乐家的列表,我想你会对抓取所有这些艺术家数据感兴趣;在这种情况下,我们将使用 Rcrawler 功能自动收集和解析所有这些页面。

Rcrawler(Website = "https://en.wikipedia.org/wiki/List_of_hard_bop_musicians" ,
         no_cores = 4, no_conn = 4, MaxDepth = 1, 
         ExtractXpathPat = c("//th","//tr[(((count(preceding-sibling::*) + 1) = 5) and parent::*)]//td","//tr[(((count(preceding-sibling::*) + 1) = 6) and parent::*)]//td"),
         PatternsNames = c("artist", "dob", "dod"),
         crawlZoneXPath = "//*[@class='mw-parser-output']")
#transform data into dataframe
 df<-data.frame(do.call("rbind", DATA))
  • MaxDepth = 1:仅抓取起始页中的链接
  • crawlZoneXPath:仅抓取页面正文中的链接(艺术家列表)
  • ExtractXpathPat:要提取的数据的 XPath 模式

Rcrawler 创建者