【问题标题】:Web Scraping with R: problem with "data.frame" function and number of rows使用 R 进行网页抓取:\"data.frame\" 函数和行数问题
【发布时间】:2022-12-31 22:55:48
【问题描述】:

简而言之,我想从这个site 中抓取有关电影的信息。我正在使用 Selector Gadget 来抓取它,我写下了这段代码:

library(dplyr)
library(tidyverse)
library(rvest)
library(readr)
library(purrr)

link = "https://www.imdb.com/search/title/?title_type=feature&num_votes=25000,&genres=adventure&sort=user_rating,desc"
page = read_html(link)

film_name = page %>% html_nodes(".lister-item-header a") %>% html_text()
year = page %>% html_nodes(".text-muted.unbold") %>% html_text()
rating = page %>% html_nodes(".ratings-imdb-rating strong") %>% html_text()
gross_income %>% html_nodes(".ghost~ .text-muted+ span") %>% html_text()
duration = page%>% html_nodes(".runtime") %>% html_text()

IMDB_Adventure_Movies_Rank = data.frame(film_name, year, rating, duration, gross_income, stringsAsFactors = FALSE)

R控制台给出以下错误:

Error in data.frame(film_name, year, rating, duration, gross_income, stringsAsFactors = FALSE) : 
  gli argomenti implicano un numero differente di righe: 50, 44

错误是因为在该网站上,50 部影片中有 6 部没有报告收入。

我试过这个解决方案,但是值没有按正确的顺序排列,因为 R 为每部电影分配了错误的收入

length(gross_income) = length(film_name)

我的问题是:如果电影没有报告收入,我如何创建一个表,R 返回 NA 或 null,而不是给我错误?
我看到有人遇到了同样的问题,解决方案是使用purrr包和possibly()函数。但是,我是 R 的新手,我无法理解答案以及如何使用possibly()

【问题讨论】:

    标签: r dataframe web-scraping rvest


    【解决方案1】:

    我们可以得到收入的电影,

    link = "https://www.imdb.com/search/title/?title_type=feature&num_votes=25000,&genres=adventure&sort=user_rating,desc"
    df = read_html(link) %>% html_nodes('#main div div.lister.list.detail.sub-list div div.lister-item-content p.sort-num_votes-visible') %>% html_text()
     [1] "
                    Votes:
                    1,766,474
        |                Gross:
                    $377.85M
                
            "
     [2] "
                    Votes:
                    1,788,217
        |                Gross:
                    $315.54M
                
            "
     [3] "
                    Votes:
                    2,253,349
        |                Gross:
                    $292.58M
                
            "
     [4] "
                    Votes:
                    1,595,898
        |                Gross:
                    $342.55M
                
            "
    

    我们现在获得每部电影的票数和收入。我们将使用正则表达式过滤收入。

    library(stringi)
    stri_extract_first_regex(df, "(?<=\$).*")
     [1] "377.85M" "315.54M" "292.58M" "342.55M" "6.10M"   "188.02M" "290.48M" "10.06M"  "210.61M" "322.74M" "678.82M" NA        "187.71M" "422.78M" "190.24M"
    [16] "858.37M" "209.73M" "223.81M" "2.38M"   "85.16M"  "248.16M" "47.70M"  "293.00M" "415.00M" "120.54M" "191.80M" "197.17M" "309.13M" NA        "56.95M" 
    [31] "44.82M"  "13.28M"  NA        NA        "1.43M"   "356.46M" "381.01M" "4.71M"   "380.84M" "402.45M" "1.23M"   "12.10M"  "44.91M"  NA        "5.01M"  
    [46] "1.03M"   "5.45M"   "8.18M"   NA        "59.10M" 
    

    【讨论】:

      【解决方案2】:

      我建议您考虑使用imdbapiimdbapi 是一个方便访问 IMDB Api 的包。您将需要获得一个 API 密钥,但其成本相当低。

      library("imdbapi")
      res_film <-
          find_by_title("Top Gun: Maverick", api_key = <Your API KEY>)
      

      在处理已建立的数据源(例如 Eurostat)时,IMDB 的世界银行建议依赖维护的数据包和可用的 API。通过使用 rvest 从站点抓取数据,您将不得不完成许多不必要的工作并解决 API 和包创建者已经解决的问题。


      还有一个替代方案 Open Movie Database 可以为您提供一些具有相当高限制的免费查询,以及 offers a dedicated R package。很可能你应该能够免费获得你需要的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2014-12-28
        相关资源
        最近更新 更多