2017-10-05 1 views
0

내 질문은 R이 URL 링크를 읽을 수있는 것과 관련이 있습니다. 내가 사용하는 예는 설명을위한 것입니다. 다음 웹 페이지를 읽고 싶습니다 (임의로 선택). 하나의 URL에서 다른 URL로 긁어 모으기 R

https://www.mcdb.ucla.edu/faculty

그것은 URL 링크와 교수 이름의 목록을 가지고

, 나는 예를 들면 다음과 유사한 웹 페이지를 읽고 각 URL 링크를 액세스하고 특정 키워드에 대한 검색을 할 수있는 스크립트를 구축을 위해 노력하고있다 그들의 출판물에 관한.

나는 현재 아래에 게시 한 특정 키워드에 대한 개별 웹 사이트를 스캔하는 스크립트가 있습니다.

library(rvest) 
    library(dplyr) 
    library(tidyverse) 
    library(stringr) 

    prof <- readLines("https://www.mcdb.ucla.edu/faculty/jsadams") 

    library(dplyr) 
    text_df <- data_frame(text = prof) 

    text_df <- as.data.frame.table(text_df) 


    keywords <- c("nonskeletal", "antimicrobial response") 
    text_df %>% 
     filter(str_detect(text, keywords[1]) | str_detect(text, keywords[2])) 

교수 웹 페이지의 "선택한 출판물"섹션에서 출판물 1, 2 및 4를 반환해야합니다.

저는 교수진 링크 (https://www.mcdb.ucla.edu/faculty)에서 각 교수 페이지를 읽고 각 교수가 위에 나열된 키워드로 출판물을 가지고 있는지 확인하려고합니다.

  1. 읽기 : https://www.mcdb.ucla.edu/faculty
  2. 액세스 각 링크 및 각 교수 페이지 읽기 :
  3. 반환을 경우 값 "키워드"= TRUE :
  4. 목록 교수 출판물 또는에서 "키워드"가 텍스트 :

나는 각 개별 페이지에 대해이 작업을 수행 할 수 있었지만 루프 또는 함수를 선호하므로 매번 교수 페이지 URL을 복사하여 붙여 넣지 않아도됩니다.

UCLA 나 그 웹 사이트의 교수와 아무런 관련이 없습니다. 내가 선택한 교수 URL은 교수 웹 페이지 교수의 첫 번째 교수가 된 것입니다.

답변

0

다음과 같이 접근합니다. 이것은 "빠르며 더러운"코드이지만 더 나은 것을위한 기반을 제공합니다.

먼저, 교수 이름과 페이지 링크를 가져 오는 올바른 선택자가 필요합니다. 정보와 데이터 프레임을 만듭니다

library(dplyr) 
library(rvest) 
library(tidytext) 

page <- read_html("https://www.mcdb.ucla.edu/faculty") 
table1 <- page %>% 
    html_nodes(xpath = "///table[1]/tr/td/a") 
names <- table1 %>% 
    html_text() %>% 
    unlist(use.names = FALSE) 
links <- table1 %>% 
    html_attrs() %>% 
    unlist(use.names = FALSE) 

data1 <- data.frame(name = names, href = links) 
head(data1) 

       name    href 
1  John Adams /faculty/jsadams 
2 Utpal Banerjee /faculty/banerjee 
3 Siobhan Braybrook /faculty/siobhanb 
4  Jau-Nian Chen /faculty/chenjn 
5  Amander Clark /faculty/clarka 
6  Daniel Cohn /faculty/dcohn 

다음, 당신은 href 열의 값을받는 함수를 필요로 직원 페이지를 가져와 키워드를 찾습니다. tidytext을 사용하여 모든 발행물을 개별 단어로 분리 한 다음 키워드가있는 행을 세는 방법을 사용했습니다. 이것은 "항균 반응"이 두 단어로 분리되어야 함을 의미하므로 다르게 적용 할 수 있습니다.

키워드가있는 경우 0보다 큰 수를 반환합니다.

get_pubs <- function(href) { 
    page <- read_html(paste0("https://www.mcdb.ucla.edu", href)) 
    pubs <- data.frame(text = page %>% 
           html_nodes("div.mcdb-faculty-pubs p") %>% 
           html_text(), 
        stringsAsFactors = FALSE) 
pubs <- pubs %>% 
    unnest_tokens(word, text) 
pubs %>% 
    filter(word %in% c("nonskeletal", "antimicrobial", "response")) %>% 
    nrow() 
} 

이제 각 href에 기능을 적용 할 수 있습니다 자신의 출판물에 적어도 하나의 키워드를 가지고 교수

data1 <- data1 %>% 
    mutate(count = sapply(href, function(x) get_pubs(x))) 

?

data1 %>% 
    filter(count > 0) 

       name    href count 
1  John Adams /faculty/jsadams  9 
2   Arjun Deb  /faculty/adeb  1 
3  Tracy Johnson /faculty/tljohnson  1 
4  Chentao Lin  /faculty/clin  1 
5  Jeffrey Long /faculty/jeffalong  1 
6 Matteo Pellegrini /faculty/matteop  1 
관련 문제