无法通过rvest与follow_link实现网页爬取自动化 求批量爬取方案
全流程自动化爬取实现方案
核心问题解决逻辑
你之前手动输入姓名匹配follow_link的模式完全可以替换,结合你已经发现的「所有资料页链接类名为td-name」的线索,根本不需要人工逐条录入文本匹配,直接通过类名批量提取链接地址即可,同时解决xpath匹配不准、分页手动跳转的问题。
分步实现代码
1. 依赖加载
所有爬取操作基于rvest包实现,不需要额外加载复杂爬虫框架:
library(rvest) library(dplyr) library(purrr) library(stringr)
2. 封装单列表页爬取函数
这个函数会自动从当前列表页抓取所有td-name类下的详情链接,自动跳转提取字段,不需要手动输入任何姓名:
# 输入参数:列表页完整URL;输出:当前页所有样本的结构化数据 crawl_single_list_page <- function(list_page_url) { # 建立当前列表页的会话 current_list <- html_session(list_page_url) # 自动提取当前页所有详情页链接,替代原来手动follow_link的操作 all_profile_links <- current_list %>% html_nodes('.td-name a') %>% # 直接匹配你找到的类名,不需要匹配链接文本 html_attr('href') # 批量遍历每个详情链接,提取目标字段 map_dfr(all_profile_links, function(profile_link) { # 跳转至详情页 profile_detail <- current_list %>% jump_to(profile_link) # 在这里补充你需要提取的所有字段,比如姓名、定价、工作者特征 tibble( name = profile_detail %>% html_nodes('h1') %>% html_text(trim = T), # 示例:替换成你实际需要的字段节点,比如定价的类、特征描述的类 # avg_price = profile_detail %>% html_nodes('.你找到的定价类名') %>% html_text(trim = T), scraped_timestamp = Sys.time() ) # 加随机延迟,避免请求过快被封IP Sys.sleep(runif(1, 1, 2)) }, .progress = T) }
3. 批量处理全量分页,覆盖2000个样本
你之前手动拼接page=2的逻辑可以批量生成,不需要逐页手动访问:
- 先打开第一页的分页导航,数清楚总共有多少个分页(比如每页20条样本,2000条就是100页)
- 按照站点的分页URL规则,循环生成所有分页的地址,批量运行爬取函数
# 替换成你实际统计的总页码数 total_page_count <- 100 # 按照站点的URL规则生成全部分页链接 all_list_pages <- str_glue( "https://www.theeroticreview.com/reviews/newreviewsList.asp?Valid=1&mp=0&SortBy=3&searchreview=1&gCity=region1-us-rhode-island&gDistance=0&gCityName=Rhode%20Island%20(State)&page={1:total_page_count}" ) # 合并所有分页的爬取结果,形成完整数据集 full_research_dataset <- map_dfr(all_list_pages, crawl_single_list_page)
常见问题修复
- 关于"no links have text with"报错:完全使用类名匹配提取链接的方式后,不再依赖链接文本匹配,这个报错会彻底消失
- 关于xpath匹配不准:优先使用CSS类选择器(即
html_nodes('.类名')的写法),比手动拼接的xpath兼容性更高;如果必须使用xpath,直接在浏览器开发者工具里选中目标元素,右键复制现成的xpath即可,不要手动编写 - 反爬风险:请求间隔设置1-2秒的随机延迟,不要短时间高频访问站点,避免IP被封禁
爬取过程请严格遵守站点的访问规则,研究数据仅用于学术用途,严格遵循研究伦理要求。
内容的提问来源于stack exchange,提问作者thenotsopolitecanadian
相关产品推荐
相关产品推荐

