朋友让我用R语言的XML库写一个采集图片的爬虫程序。首先,我需要确认XML库是否适合这个任务。XML库主要用于解析XML和HTML内容,但R里面还有其他库如rvest可能更方便。不过朋友特别提到了XML库,所以必须用它。
可能朋友的需求是简单的图片下载,但可能需要更多的细节处理,比如过滤图片格式,限制下载数量等。代码示例中需要包含这些考虑,或者至少提到可能的改进点。

以下是使用R语言XML库编写的图片爬虫程序示例。该程序能够从指定网页抓取图片链接并下载保存到本地:
R
# 加载必要的库
library(XML)
library(RCurl) # 用于处理URL和下载文件
# 创建图片保存目录
dir.create("downloaded_images", showWarnings = FALSE)
# 定义图片爬取函数
crawl_images <- function(url) {
# 设置浏览器头信息(防止反爬)
user_agent <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
# 获取网页内容
webpage <- getURL(url, useragent = user_agent)
doc <- htmlParse(webpage, asText = TRUE)
# 使用XPath提取所有图片链接
img_nodes <- xpathSApply(doc, "//img/@src")
# 转换为字符向量
img_urls <- as.character(img_nodes)
# 处理相对路径
absolute_urls <- sapply(img_urls, function(x) {
ifelse(grepl("^https?://", x), x, paste0(url, x))
})
# 去重
unique_urls <- unique(absolute_urls)
# 下载图片
for(i in seq_along(unique_urls)) {
tryCatch({
# 生成文件名
filename <- paste0("downloaded_images/", basename(unique_urls[i]))
# 下载文件
download.file(unique_urls[i],
destfile = filename,
mode = "wb",
quiet = TRUE)
# 打印进度
cat(sprintf("正在下载:%s [%d/%d]\n",
basename(unique_urls[i]), i, length(unique_urls)))
}, error = function(e) {
cat(sprintf("下载失败:%s\n", unique_urls[i]))
})
# 添加延迟(防止请求过于频繁)
Sys.sleep(0.5)
}
}
# 使用示例(请替换为实际需要抓取的URL)
target_url <- "https://picsum.photos/" # 测试用图片网站
crawl_images(target_url)
cat("图片下载完成!请查看 downloaded_images 目录\n")
代码说明:
- 依赖库:
XML
:用于解析HTML文档RCurl
:用于处理HTTP请求和URL操作
- 主要功能:
- 自动创建保存图片的目录
- 模拟浏览器请求头(User-Agent)
- 自动处理相对路径和绝对路径
- 支持去重下载
- 包含错误处理机制
- 添加请求延迟避免被封禁
- 注意事项:
- 请遵守目标网站的
robots.txt
协议 - 不要进行高频请求(可调整
Sys.sleep
参数) - 某些网站可能需要额外处理反爬机制
- 图片版权属于原网站,请遵守相关法律法规
- 请遵守目标网站的
扩展改进建议:
- 添加代理支持
- 增加图片格式过滤功能
- 实现递归爬取多页面
- 添加并行下载功能
- 支持Cookie维持登录状态
请将示例中的target_url
替换为实际需要抓取的网站地址(注意遵守网站使用条款)。建议首次测试使用示例中的https://picsum.photos/
(一个允许测试的图片网站)。