在R中检测Psychology Today治疗师目录URL有效性遇异常求助
检查Psychology Today目录URL有效性的R语言方案
需求说明
需要批量验证《今日心理学》(Psychology Today)治疗师目录的分页URL是否有效:
- 有效URL:如
https://www.psychologytoday.com/us/therapists/new-york/a?page=10,对应真实存在的分页页面 - 无效URL:如
https://www.psychologytoday.com/us/therapists/new-york/a?page=119,访问会被重定向到无分页的通用页面https://www.psychologytoday.com/us/therapists/new-york/a
最终目标是筛选出纽约地区姓氏以"A"开头的治疗师的所有有效分页URL,后续将复用逻辑处理其他字母开头的目录。
现有尝试的问题
尝试过两种常见的URL有效性检查方案,均出现误判:
- RCurl的
url.exists():对真实存在的URL返回FALSE - 基于httr的自定义检查函数:对所有测试URL(含3个有效URL)均返回
FALSE
问题根源在于:
- 部分网站会拦截
HEAD请求(自定义函数优先用HEAD) - 无效URL并非返回4xx/5xx状态码,而是返回3xx重定向到通用页面,常规的状态码判断无法区分有效/无效
解决方案
通过对比请求后的最终URL与原URL的核心路径来判断有效性:如果请求后被重定向到不带分页参数的通用页面,则判定为无效;否则为有效。
代码实现
# 加载所需包 pacman::p_load(httr, dplyr, stringr) # 设置浏览器UA,避免被反爬拦截 options(HTTPUserAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36") # 自定义URL有效性检查函数 is_valid_pt_url <- function(url) { # 发送GET请求,允许自动跟随重定向 res <- tryCatch( GET(url, followlocation = TRUE), error = function(e) return(FALSE) ) # 检查请求是否成功 if (http_error(res)) return(FALSE) # 提取原URL的基础路径(去掉page参数) base_url <- str_remove(url, "\\?page=\\d+") # 提取请求后的最终URL路径 final_url_path <- url_parse(res$url)$path # 对比:如果最终路径不等于基础路径,说明未被重定向到通用页面,URL有效 return(!identical(final_url_path, url_parse(base_url)$path)) } # 测试示例URL some_urls <- c( "https://www.psychologytoday.com/us/therapists/new-york/a?page=10", # 有效 "https://www.psychologytoday.com/us/therapists/new-york/a?page=4", # 有效 "https://www.psychologytoday.com/us/therapists/new-york/a?page=140",# 无效 "https://www.psychologytoday.com/us/therapists/new-york/a?page=3" # 有效 ) # 批量检查并输出结果 tibble( url = some_urls, is_valid = sapply(some_urls, is_valid_pt_url) )
逻辑说明
- UA设置:模拟浏览器请求,避免被网站的反爬机制拦截
- 重定向处理:自动跟随重定向,获取最终跳转后的URL
- 路径对比:
- 从原URL中移除
?page=xxx参数,得到通用页面的基础路径 - 对比最终URL的路径与基础路径:若一致,说明原URL被重定向到通用页面(无效);若不一致,说明原URL对应真实分页(有效)
- 从原URL中移除
内容的提问来源于stack exchange,提问作者Anna Jones
相关产品推荐
相关产品推荐

