R语言爬取谷歌图片时image_urls为空的解决方法咨询
解决谷歌图片爬取时image_urls为空的问题
核心原因
谷歌图片页面自带反爬机制,直接用read_html请求会被识别为非浏览器访问,返回的页面结构和实际浏览器展示的不一致;同时当前页面的图片URL存储字段已发生变化,.rg_i元素的data-src不再是有效源地址字段。
具体解决步骤
1. 模拟浏览器请求,绕过反爬拦截
使用httr包添加浏览器请求头,避免被谷歌拦截:
library(rvest) library(httr) # 构造模拟Chrome浏览器的请求头 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" ) # 发送请求并解析页面 page <- GET("https://www.google.com/search?q=Djeco%20DD04490%20image&tbm=isch&tbs=isz:lt,islt:0.5", headers) %>% content("text") %>% read_html()
2. 调整选择器与URL提取字段
当前谷歌图片的原图地址通常存储在img.rg_i标签的data-iurl属性中,调整提取逻辑:
# 提取有效图片URL并过滤空值 image_urls <- page %>% html_nodes("img.rg_i") %>% html_attr("data-iurl") %>% na.omit()
如果data-iurl取不到值,可尝试提取src属性(返回的是缩略图地址):
thumb_urls <- page %>% html_nodes("img.rg_i") %>% html_attr("src") %>% na.omit()
3. 获取更多图片(可选)
谷歌图片默认每页加载20张,可通过URL的start参数分页获取更多结果:
# 获取第21-40张图片 page_2 <- GET("https://www.google.com/search?q=Djeco%20DD04490%20image&tbm=isch&tbs=isz:lt,islt:0.5&start=20", headers) %>% content("text") %>% read_html() image_urls_2 <- page_2 %>% html_nodes("img.rg_i") %>% html_attr("data-iurl") %>% na.omit() # 合并所有URL all_image_urls <- c(image_urls, image_urls_2)
4. 批量下载图片示例
拿到有效URL后,用download.file批量保存:
# 创建存储文件夹 dir.create("djeco_images", showWarnings = FALSE) # 循环下载,捕获异常避免中断 for (i in seq_along(all_image_urls)) { tryCatch({ download.file( url = all_image_urls[i], destfile = file.path("djeco_images", paste0("djeco_", i, ".jpg")), mode = "wb", # 二进制模式确保图片完整性 quiet = TRUE ) }, error = function(e) { message(paste("下载第", i, "张图片失败:", e$message)) }) }
注意事项
- 谷歌反爬机制会频繁更新,若上述选择器失效,可通过浏览器开发者工具(F12)查看当前页面的图片元素属性,调整提取逻辑。
- 控制请求频率,避免短时间内发送大量请求导致IP被封禁。
内容的提问来源于stack exchange,提问作者nba2020
相关产品推荐
相关产品推荐

