2017-09-23 12 views
0

私は、このページから3つの異なる数(黄色で、絵を参照)を取得する必要があります:私はrvestinspectorgadgetを使用してこのコードを使用しrvestで掻き分ける方法は?

https://www.scopus.com/authid/detail.uri?authorId=7006040753

を:

site=read_html("https://www.scopus.com/authid/detail.uri?authorId=7006040753") 
hindex=site %>% html_node(".row3 .valueColumn span")%>% html_text() 
documents=site %>% html_node("#docCntLnk")%>% html_text() 
citations=site %>% html_node("#totalCiteCount")%>% html_text() 
print(citations) 

私はh-indexdocumentsを得ることができますが、引用は機能しません

私を助けることができますか?

+0

一見したところで素早く修正されているように見えますが、この値は動的に読み込まれるようです(ソースコードを見ると、数字はどこにも表示されません)。例えば、 PhantomJSまたはRSeleniumをダウンロードし、その後ウェブサイトをダウンロード/処理する – TomS

+0

PhantomJSを試してみたところ、ページ処理がブロックされているように見えるので、ここで問題が発生しました。だから、RSeleniumを使用してください(残念なことに私はこれについて知識がありません)。あるいは、簡単に掻き集めることができる総引用数の代わりに多数の文書を扱うかもしれません(sthが引用されている文書の数文書あたりの頻度ではありません) – TomS

+0

こんにちはTomSさん、コメントありがとうございました。「ソースコードを見ると、どこにも表示されないことに気付きます。実際にhtmlソースコードでは、 'および 51971'を見つけました。 – Guglielmo

答えて

0

私は解決策を見つけました。値が読み込まれるまでに時間がかかることに気がついたので、PhnatomJSスクリプトにタイムアウトを少し入れました。 (https://www.r-bloggers.com/web-scraping-javascript-rendered-sites/に賛辞)は、次のようになります

setwd("path/to/phantomjs/bin") 
system('phantomjs readexample.js') # call PhantomJS script (stored in phantomjs/bin) 

totalCiteCount <- "rendered_page.html" %>% # "rendered_page.html" is created by PhantomJS 
    read_html() %>% 
    html_nodes("#totalCiteCount") %>% 
    html_text() 

## totalCiteCount 
## [1] "52018" 

対応PhantomJSスクリプトファイル「readexample.js」:今では、次のRコードで私のマシン上で動作

var webPage = require('webpage'); 
var url ='https://www.scopus.com/authid/detail.uri?authorId=7006040753'; 
var fs = require('fs'); 
var page = webPage.create(); 
var system = require('system'); 

page.settings.userAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'; 

page.open(url, function (status) { 
     setTimeout(function() { 
       fs.write('rendered_page.html', page.content, 'w'); 
      phantom.exit(); 
    }, 2500); 
}); 

コードがスローされますRのエラーに続いて、少なくとも値が正しく掻き取られます。 PhantomJSを使用して

> system('phantomjs readexample.js') TypeError: undefined is not a constructor (evaluating 'mutation.addedNodes.forEach') 

    https://www.scopus.com/gzip_N1846232499/bundles/SiteCatalystTop.js:73 :0 in forEach https://www.scopus.com/gzip_N1846232499/bundles/SiteCatalystTop.js:73 ReferenceError: Can't find variable: SDM 

    https://www.scopus.com/gzip_N1729184664/bundles/AuthorProfileTop.js:73 in sendIndex https://www.scopus.com/gzip_N1729184664/bundles/AuthorProfileTop.js:67 in loadEvents 

(あなたがあなたのマシン上で管理者権限を持っていない場合はそうも動作します)あなたが何かをインストールする必要はありませんように非常に便利です。単にdownload .zipファイルを開き、任意のフォルダに展開します。その後、R(setwd())の作業ディレクトリを "phantomjs/bin"フォルダに設定すると動作します。

また、R内のPhantomJSスクリプト(必要に応じて繰り返し)を変更することもできます。ループ内の別のURLをスクリプトに渡します。例:

for (i in 1:n_urls) { 

    url_var <- urls[i] # assuming you have created a var "urls" with multiple URLs before 
    lines <- readLines("readexample.js") 
    lines[2] <- paste0("var url ='", url_var ,"';") # exchange code line with new URL 
    writeLines(lines, "readexample.js") # new url is stored in the PhantomJS script 

    system('phantomjs readexample.js') 

    # <any code> # 

} 

これがさらに進歩しますか?

+0

Great TomS!私はあなたの解決策を試してみましょう... ありがとうございます。 – Guglielmo

+0

スーパー!!!繰り返しを試してみました...それは完全に動作します!トムありがとう! – Guglielmo

関連する問題