Rvest-如何从论坛中收集所有标题

时间:2018-08-02 23:57:27

标签: r matrix web-scraping rvest

我在论坛上收集所有帖子标题时遇到问题。

library(rvest)
library(xml2)

url_page <-c("http://medyczka.pl/forum-gastrologiczne/")
all_titles <- matrix()
#Function
for (i in 1:5) {
web <-read_html(paste0(url_page,i))
post_title <- web %>% html_nodes(css='.title') %>%
  html_text() %>%
  as.character()
all_titles <- rbind(all_titles, post_title)
}
#Show me collected titles
str(all_titles)
head(all_titles)
#str(all_titles)
 #chr [1:6, 1] NA "Ból po operacji szczeliny odbytu" "Hemoroidy?" ...
 #- attr(*, "dimnames")=List of 2
  #..$ : chr [1:6] "" "post_title" "post_title" "post_title" ...
  #..$ : NULL

我应该有100行。但是,看起来该函数仅收集每1-5页的第一篇文章的标题。 我写错了什么?

2 个答案:

答案 0 :(得分:2)

不确定您的编码有误,但是我会做不同的事情。

首先,在给定基本URL和页码的情况下,编写一个函数以返回标题:

(已编辑)

get_titles <- function(base_url, page) {
  read_html(paste0(base_url, page)) %>% 
    html_nodes(".title") %>% 
    html_text()
}

现在使用purrr::map2_df通过以下功能创建数据框:

library(tidyverse)
library(rvest)

titles <- map2_df("http://medyczka.pl/forum-gastrologiczne/", 
                  1:5, 
                  ~tibble(titles = get_titles(.x, .y)))

titles现在是一个带有标题的1 x 100数据框。

glimpse(titles)

Observations: 100
Variables: 1
$ titles <chr> "Ból po operacji szczeliny odbytu", 
               "Biegunko podobne coś po kawie, nabial, ostrym jedzeniu", 
               "reg...

答案 1 :(得分:1)

您正在尝试将向量束缚到一个空矩阵中,R在知道您的意图时遇到了问题。最好以更清晰的方式定义目标的形状。在这里,我将all_titles定义为数据框架,并在绑定之前将post_title定义为数据框架。

url_page <-c("http://medyczka.pl/forum-gastrologiczne/")
all_titles <- data.frame()
#Function
for (i in 1:5) {
web <-read_html(paste0(url_page,i))
post_title <- web %>% html_nodes(css='.title') %>%
  html_text() 
all_titles <- rbind(all_titles, data.frame(post_title))
}

我还没有测试过,但是应该可以。在循环中使用rbind并不是很有效,但是由于循环只有5个周期和100个元素,因此对性能的影响很小。

提醒您,请阅读本网站上的用户协议并遵守任何限制。