【问题标题】:Rcurl: url.exists returns false when url does existRcurl:当 url 确实存在时,url.exists 返回 false
【发布时间】:2015-03-18 18:44:35
【问题描述】:

尝试从特定网页下载信息,尽管它在任何浏览器中都可以正常打开,但 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"))

【问题讨论】:

    标签: r rcurl httr


    【解决方案1】:

    当您的 HTTP 请求不包含用户代理字符串时,该网络服务器似乎返回 403 Forbidden 错误。 RCurl 默认不传递用户代理。您可以使用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 包在发出 HTTP 请求方面比 RCurl 好一点(默认情况下它设置了一个用户代理字符串)。这是对应的代码

    library(httr)
    GET(myurl)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2011-10-19
      • 2017-08-16
      • 2010-10-29
      • 2016-01-13
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多