在 R 的 httr 中轮换代理并解析下载的 HTML
按每个 httr 请求轮换代理行,并把下载到的字节交给 xml2 和 rvest。
把代理选择留在下载操作本身。httr 返回页面后,解析该响应的字节,而不是把 URL 再交给另一个下载器。
给定向量 urls 和含 host 与整数 port 列的非空 data frame proxies:
pages <- vector("list", length(urls))
stopifnot(nrow(proxies) > 0L)
for (i in seq_along(urls)) {
row <- ((i - 1L) %% nrow(proxies)) + 1L
response <- httr::GET(
urls[[i]],
httr::use_proxy(proxies$host[[row]], proxies$port[[row]]),
httr::timeout(30)
)
httr::stop_for_status(response)
pages[[i]] <- xml2::read_html(httr::content(response, as = "raw"))
}
对于经由公开中间方允许的公开页面请求,HTTP 代理列表为 host 和 port 列提供候选。索引从第一行代理循环到最后一行,再回到开头。每次调用都有自己的代理配置;R 进程可以继续运行。
得到的页面包含已解析的 HTML 文档。对这些文档应用 rvest::html_elements 与所需的提取函数。若改为把 URL 交给 read_html,则会以该路径自身的网络配置重新发起抓取。
对于需要认证的代理,通过 use_proxy 的 username 和 password 参数传入所选账户。不同的端点并不保证不同的公网出口 IP,因此要依据服务实际的出口行为来挑选代理池。