2017-10-05 6 views
0

私の質問は、RがURLリンクを読むことができるかどうかです。私が使用している例は、説明の目的のためだけです。私が読んでいる(ランダムに選ばれた)次のウェブページがあるとします。あるURLから別のURLへの掻爬R

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

それは、私は、例えば次のようなWebページを読み、各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])) 

これは、教授のWebページの「選択された出版物」の下での出版物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を使用して、すべての出版物を個々の単語に分解し、キーワードが出現する行を数えて、別のアプローチをとってみました。これは、「抗菌応答」が2つの別々の単語でなければならないことを意味します。

キーワードのいずれかが存在する場合、この関数は> 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に関数を適用することができます彼らの出版物に少なくとも1つのキーワードを持っていた教員

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 
関連する問題