私は解決策を見つけました。値が読み込まれるまでに時間がかかることに気がついたので、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> #
}
これがさらに進歩しますか?
一見したところで素早く修正されているように見えますが、この値は動的に読み込まれるようです(ソースコードを見ると、数字はどこにも表示されません)。例えば、 PhantomJSまたはRSeleniumをダウンロードし、その後ウェブサイトをダウンロード/処理する – TomS
PhantomJSを試してみたところ、ページ処理がブロックされているように見えるので、ここで問題が発生しました。だから、RSeleniumを使用してください(残念なことに私はこれについて知識がありません)。あるいは、簡単に掻き集めることができる総引用数の代わりに多数の文書を扱うかもしれません(sthが引用されている文書の数文書あたりの頻度ではありません) – TomS
こんにちはTomSさん、コメントありがとうございました。「ソースコードを見ると、どこにも表示されないことに気付きます。実際にhtmlソースコードでは、 'および 51971'を見つけました。 – Guglielmo