robotstxt返回FALSE时,如何绕过剑桥公卫网站的爬取限制?
剑桥市COVID-19 Shiny网站爬取方案
1. 优先用模拟用户操作导出数据
这是最合规的方式——既然手动复制是允许的,用工具模拟点击下载按钮和手动操作没有区别,完全符合网站的公共数据服务意图:
- 用
RSelenium或playwright启动浏览器,模拟访问网站、点击下载按钮的流程 - 示例代码(RSelenium):
library(RSelenium) library(tidyverse) # 启动Chrome驱动(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = sample(4000:5000, 1)) remDr <- driver[["client"]] # 打开目标网站 remDr$navigate("https://cityofcambridge.shinyapps.io/COVID19/") # 等待页面加载完成(可根据实际情况调整等待时间) Sys.sleep(3) # 定位下载按钮(需替换为实际按钮的CSS选择器,可通过浏览器开发者工具查看) download_btn <- remDr$findElement(using = "css", value = ".btn-download") download_btn$clickElement() # 等待下载完成,读取文件 download_path <- file.path(Sys.getenv("HOME"), "Downloads") latest_file <- list.files(download_path, pattern = "covid.*\\.csv", full.names = TRUE) %>% arrange(file.mtime(.)) %>% last() covid_data <- read_csv(latest_file) # 清理资源 remDr$close() driver$server$stop()
2. 针对静态内容的爬取(忽略robotstxt)
如果页面部分数据是静态渲染的,可直接用httr+rvest请求,同时模拟浏览器UA,忽略robotstxt限制:
library(rvest) library(httr) # 设置浏览器用户代理,避免被识别为爬虫 ua <- "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" # 发送请求 resp <- GET("https://cityofcambridge.shinyapps.io/COVID19/", user_agent(ua)) page <- read_html(resp) # 解析数据(示例:提取页面标题) page_title <- page %>% html_element("title") %>% html_text()
注意:Shiny应用大多是动态渲染,这种方法可能拿不到实际的表格数据,还是模拟浏览器更可靠。
3. 合规性注意事项
- 控制请求频率:每天只爬一次,和手动更新频率一致,别给服务器加负担
- 数据仅用于内部分析,不要商用,符合网站的公共服务定位
- 最好直接联系剑桥市公共卫生部门,询问是否有官方数据接口,这是最稳妥的长期方案
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

