首页 > 解决方案 > Rvest 'if (is_http) { 中的错误:参数的长度为零' 对于特定网站 - 为什么?

问题描述

library(rvest)
url = 'vzbvastgoed.nl'
html_nodes(html_session(url), 'body')

这是我的代码。对于不同的网站,它可以工作,但会引发错误:

if (is_http) { 中的错误:参数长度为零
request_perform(req, hu$handle$handle)
httr::GET(url, x$config, ..., handle = x$handle)
request_GET(session, url)
html_session(url) html_nodes(html_session(url), "body")

在线搜索和在 stackoverflow 上搜索并没有真正帮助:( 似乎是一个相当罕见的情况或未知。

标签: rrvest

解决方案


我可以复制这个问题:

library(rvest)
url = 'vzbvastgoed.nl'
session <- html_session(url)
#> Error in if (is_http) {: Argument hat Länge 0
html_nodes(session, 'body')
#> Error in html_nodes(session, "body"): Objekt 'session' nicht gefunden

似乎它没有正确解析 url,所以让我们尝试一下:

url = 'https://vzbvastgoed.nl'
session <- html_session(url)
#> Warning in request_GET(session, url): Forbidden (HTTP 403).
html_nodes(session, 'body')
#> Error in read_xml.response(x$response, ..., as_html = as_html): Forbidden (HTTP 403).

至少我们现在有一个重大错误(HTTP 403)。我的猜测是这个网站想要阻止自己收集和阻止不是来自浏览器的请求,因为这对我有用:

library(httr)
url = 'https://vzbvastgoed.nl'
session <- html_session(url, add_headers(`User-agent` = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1"))
html_nodes(session, 'body')
#> {xml_nodeset (1)}
#> [1] <body>\r\n<div id="maindiv">\r\n\t<div id="kop">\r\n\t\t <div id="zoekfor ...

当然,您必须问自己是否要像这样规避网站所有者的规定。但是,从技术上讲,它是有效的。

reprex 包(v0.3.0)于 2020-06-30 创建


推荐阅读