Разница в поведении функции readLines () в R 3.6 по сравнению с 3.5.x - PullRequest
4 голосов
/ 03 мая 2019

Мы использовали readLines (), чтобы получить код для веб-страницы, а затем проанализировали элементы XML, чтобы извлечь его фрагменты. При обновлении до 3.6 мы заметили, что некоторые скрипты не работают. Как оказалось, readLines в некоторых случаях не извлекает всю страницу.

На R 3.5.3:

> length(readLines("https://masternodes.online"))

[1] 7717
Warning message:
In readLines("https://masternodes.online") :
  incomplete final line found on 'https://masternodes.online'

На той же машине, R 3.6.0:

> length(readLines("https://masternodes.online"))

[1] 4957
Warning message:
In readLines("https://masternodes.online") :
  incomplete final line found on 'https://masternodes.online'

Может кто-нибудь объяснить причину несоответствия? Похоже, что это не проблема домашней страницы, относящейся к IP, или чего-то подобного, поскольку эти тесты проводились на одном компьютере.

Разница между двумя результатами: https://www.diffchecker.com/TezbTMeY

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Я подозреваю, что причиной могут быть разные пользовательские агенты.

readLines("https://www.whatismybrowser.com/detect/what-is-my-user-agent") -> z
grep("Your User Agent is", z) -> w
z[seq(w, w+4)]

На linux R 3.5.3 это показывает R (3.5.3 x86_64-pc-linux-gnu x86_64 linux-gnu).

На R 3.6.0 mac это показывает libcurl/7.54.0.

Использование httr::get

z <- rawToChar(httr::GET("https://www.whatismybrowser.com/detect/what-is-my-user-agent")$content)

Пользовательский агент - libcurl/7.54.0 r-curl/3.3 httr/1.4.0.

А с помощью httr на сайте:

z <- httr::GET("https://masternodes.online")$content

возвращает 4957 строк независимо от версии R.

Обратите внимание, что вы также можете изменить пользовательский агент вручную и подтвердить:

ua <- user_agent("R (3.5.3 x86_64-pc-linux-gnu x86_64 linux-gnu)")
z <- rawToChar(httr::GET("https://masternodes.online", ua)$content)

Хотя синтаксический анализ немного отличается от readLines, он выглядит так же.

1 голос
/ 03 мая 2019

Как и предположил @thc, причиной проблемы являются различные пользовательские агенты. Из журнала изменений R 3.6.0

The default ‘user agent’ has been changed when accessing http:// and https:// sites using libcurl. (A site was found which caused libcurl to infinite-loop with the previous default.)

Откат к ранее использовавшемуся пользовательскому агенту вернет изменение в возвращенных данных.

length(readLines(url("https://masternodes.online",headers=c("User-Agent"=options("HTTPUserAgent")[[1]]))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...