URL中不支持方案,尝试抓取图像时出错

kqlmhetl  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(320)

我正试图刮一个图像使用的R语言中的Ralger库。很遗憾,我得到了这个错误代码:URL中不支持方案。
示例:

library(ralger)

    setwd("C:/images")

    link= "https://fr.wikipedia.org/wiki/Robert_Jardillier"

    images_scrap(link, imgpath = getwd(), extn = "jpg" )

    Undefined Error: Error in download.file(img_urls_f[i], destfile = basename(img_urls_f[i]), : scheme not supported in URL '//upload.wikimedia.org/wikipedia/commons/thumb/3/38/Robert_Jardillier_1932.jpg/220px-Robert_Jardillier_1932.jpg'

    [1] NA
iqjalb3h

iqjalb3h1#

维基媒体资源是(一般?)链接,URL开头的https:部分。虽然它对浏览器完全有效,但它很容易混淆scraper,我们需要自己将该部分添加到请求中。ralger::images_scrap()是相当固定的,需要一些尴尬的变通方法,但也有ralger::images_preview(),只是列出图像,该列表可以在使用它下载之前“固定”:

library(dplyr)
library(ralger)
link <- "https://fr.wikipedia.org/wiki/Robert_Jardillier"

# download files to ./img_ralger
dir.create("img_ralger")
images_preview(link) %>% 
  # [1] "/static/images/icons/wikipedia.png"                                                                                                                                        
  # [2] "/static/images/mobile/copyright/wikipedia-wordmark-fr.svg"                                                                                                                 
  # [3] "/static/images/mobile/copyright/wikipedia-tagline-fr.svg"                                                                                                                  
  # [4] "//upload.wikimedia.org/wikipedia/commons/thumb/3/38/Robert_Jardillier_1932.jpg/220px-Robert_Jardillier_1932.jpg" 
  # ...
  grep("\\.jpg$", ., value = TRUE) %>% 
  paste0("https:", .) %>%
  lapply(\(url_) download.file(url_, destfile = file.path("img_ralger", basename(url_)), mode = "wb"))

维基百科媒体资源也可以通过API收集,而无需抓取文章:

wikipedia_jpg_list <- function(title_, loc_ = "fr"){
  media_list <- jsonlite::fromJSON(paste0("https://",loc_,".wikipedia.org/api/rest_v1/page/media-list/",title_))$items %>% as_tibble()
  media_list %>% 
    mutate(img_src = purrr::map_chr(srcset, ~ paste0("https:", .x$src[1]))) %>% 
    filter(grepl("\\.jpg$", img_src)) %>% 
    pull(img_src)
}

# download files to ./img_wikimedia_api
dir.create("img_wikimedia_api")
wikipedia_jpg_list("Robert_Jardillier") %>% 
  lapply(\(url_) download.file(url_, destfile = file.path("img_wikimedia_api", basename(url_)), mode = "wb"))

相关问题