Rcurl: url.exists возвращает false, если URL существует
Пытаясь загрузить информацию с определенной веб-страницы, и хотя она прекрасно открывается в любом браузере, RCurl говорит, что ее не существует:
url.exists("http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA")
[1] FALSE
Те же результаты при использовании ".de".
url.exists("http://www.transfermarkt.de/liga-mx-clausura/startseite/wettbewerb/MEX1")
[1] FALSE
Он также возвращает ошибку при использовании других функций RCurl
> htmlParse("http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA")
Error: failed to load HTTP resource
> htmlTreeParse("http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA")
Error: failed to load HTTP resource
> htmlParse(getURL("http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA"))
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr>
<center>nginx</center>
</body>
</html>
Почему это происходит? Как успешно использовать htmlParse с этой веб-страницей?
РЕДАКТИРОВАТЬ:
Я знакомлюсь с пакетом httr, и это прекрасно работает:
content(GET("http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA"))
1 ответ
Похоже, что этот веб-сервер возвращает ошибку 403 Forbidden, когда ваш HTTP-запрос не содержит строку агента пользователя. RCurl по умолчанию не передает user-agent. Вы можете установить один с useragent=
параметр.
myurl<-"http://www.transfermarkt.es/liga-mx-apertura/startseite/wettbewerb/MEXA"
url.exists(myurl, useragent="curl/7.39.0 Rcurl/1.95.4.5")
# [1] TRUE
htmlTreeParse(getURL(myurl, useragent="curl/7.39.0 Rcurl/1.95.4.5"))
httr
Пакет немного лучше, чем RCurl для выполнения HTTP-запросов на мой взгляд (и он устанавливает строку user-agent по умолчанию). Вот соответствующий код
library(httr)
GET(myurl)