【问题标题】:Extracting image from web using Rvest使用 Rvest 从 Web 中提取图像
【发布时间】:2021-12-26 08:15:48
【问题描述】:

我正在尝试使用 R 从 PGA 网站提取球员照片。以下是我获取图片网址的尝试,但它不显示图片或图片为空白,如下图所示。

if(!require(pacman))install.packages("pacman")
pacman::p_load('rvest', 'stringi', 'dplyr', 'tidyr', 'measurements', 'reshape2','foreach','doParallel','curl','httr','Iso','stringi','janitor')

PGA_url <- "https://www.pgatour.com"
pga_web=read_html(paste0(PGA_url,'/players.html'))
plyers_photo <- pga_web%>%html_nodes("[class='player-card']")%>%html_nodes('div.player-image-wrapper')%>%html_nodes('img')%>%html_attr('src')

谁能告诉我我做错了什么?

【问题讨论】:

    标签: r web-scraping screen-scraping rvest


    【解决方案1】:

    如果您检查页面源,您将看到您正在根据页面源检索内容,即默认 img 值。扫一扫,您可能会注意到相邻的 data-src 属性具有与正则表达式匹配的 png 的替代结尾:headshots_\d{5}\.png

    当 JavaScript 在浏览器中运行时,通过 rvest 的 xmlhttp 请求不会发生这种情况,这些 url 会动态更新,默认 png 结尾替换为 data-src 属性中的结尾。

    对于设置大小的小图像,要么用该属性的值替换你得到的结尾,要么使用直到并包括upload 的部分作为基础,并将其与提取的data-src 值结合起来提供大图像。

    也不需要所有那些链接的html_nodes() 调用。使用适当的 css 选择器列表的单个调用就可以了。另外,比起旧的html_nodes(),更喜欢维护的html_elements() 方法:

    library(rvest)
    library(magrittr)
    
    PGA_url <- "https://www.pgatour.com"
    pga_web <- read_html(paste0(PGA_url, "/players.html"))
    placeholder_link <- 'https://pga-tour-res.cloudinary.com/image/upload/'
    
    plyers_photo <- pga_web %>%
      html_elements(".player-card .player-image-wrapper img") %>%
      html_attr("data-src") %>% paste0(placeholder_link, .)
    

    【讨论】:

    • 嗨@QHarr,希望你做得很好。如果您使用的是 excel 2019,我想知道当您单击以下 excel 工作簿中的按钮时会发生什么?我正在使用 excel 2016,当我运行宏时,我会在消息框中获得一些表格内容以及一个数字。这是workbook
    • 无效使用 null。 lastPage 需要声明为Dim lastPage As mshtml.IHTMLDOMChildrenCollection@SIM
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2023-03-16
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多