使用rvest抓取意大利房产网页数据失败,请求排查代码问题
问题分析与解决方案
1. 核心问题
你的代码存在两个关键问题:
- 使用
html_element()(单元素提取方法)而非html_elements()(多元素提取),无法获取页面上所有房源的价格; - 目标网站有基础反爬机制,裸请求会返回空内容或无效页面,同时Selector Gadget抓取的class选择器可能已失效。
2. 修正后的代码
library(rvest) library(dplyr) library(httr) library(purrr) # 模拟浏览器请求头,避免被反爬拦截 headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) url <- "https://www.immobiliare.it/search-list/?idContratto=1&idCategoria=1&idTipologia%5B0%5D=7&idTipologia%5B1%5D=12&idTipologia%5B2%5D=13&idTipologia%5B3%5D=11&criterio=rilevanza&__lang=it&fkRegione=ven&idProvincia=VE&idNazione=IT&pag=1&dtCookie=v_4_srv_3_sn_9E341BF8AC6892004B9D2502432FB6E5_perc_100000_ol_0_mul_1_app-3Aea7c4b59f27d43eb_0" # 带请求头发起请求 page <- GET(url, headers) content <- content(page, as = "text") parsed_html <- read_html(content) # 先定位所有房源的卡片容器 property_cards <- parsed_html %>% html_elements("div.in-listingCard") # 从每个卡片中提取目标信息 property_data <- property_cards %>% map_dfr(function(card) { tibble( # 提取挂牌价格(当前页面有效class为in-listingCard__price) price = card %>% html_element("span.in-listingCard__price") %>% html_text2(), # 提取地址/位置 address = card %>% html_element("div.in-listingCard__address") %>% html_text2(), # 提取所有特征并合并为字符串 features = card %>% html_elements("li.in-listingCard__feature") %>% html_text2() %>% paste(collapse = "; ") ) }) print(property_data)
3. 关键说明
- 反爬处理:添加
User-Agent请求头模拟浏览器访问,绕过网站基础反爬拦截; - 元素定位逻辑:先抓取所有房源卡片容器,再从容器内提取子元素,比全局直接抓取更稳定,避免无关元素干扰;
- 选择器验证:如果后续class再次失效,可手动打开页面按F12检查元素,确认最新的class名称;
- 多页遍历:后续只需修改URL中的
pag=1参数为循环变量(如pag=i),重复上述抓取逻辑即可实现多页数据获取。
内容的提问来源于stack exchange,提问作者crossgamma
相关产品推荐
相关产品推荐

