Web Scraping с R на нескольких страницах / ссылках - PullRequest
0 голосов
/ 29 января 2020

У меня есть список из 5000 фильмов в файле Excel:

  1. Аватар
  2. Запутанный
  3. Возвращение Супермена
  4. Мстители: эндшпиль
  5. Человек из стали

И так далее ...

Мне нужно извлечь выходные коллекции этих фильмов. Коллекции выходного дня доступны на веб-сайте boxofficemojo.com .

С помощью следующего кода я могу получить коллекции выходных только для одного mov ie 'Avatar', так как URL, упомянутый в коде, содержит только детали «Аватара».

library(rvest) 

webpage <- read_html("https://www.boxofficemojo.com/release/rl876971521/weekend/?ref_=bo_rl_tab#tabs") 

weekend_collections <- webpage %>%
                            html_nodes(".mojo-field-type-rank+ .mojo-estimatable") %>%
                            html_text()

Другие фильмы будут иметь разные URL. 5000 различных коллекций выходных файлов mov ie будут находиться в 5000 различных URL.

Можно ли просто указать список фильмов и попросить r получить коллекции выходных для каждого mov * 1049? * без предоставления соответствующих URL-адресов фильмов?

Я могу добавить URL-адреса фильмов вручную и выполнить задание, но это не является хорошей идеей для вручную добавьте URL фильмов в код.

Так, как я могу получить коллекции выходных из этих 5000 фильмов?

Я новичок в Р. Нужна помощь.

1 Ответ

0 голосов
/ 29 января 2020

На этом сайте можно автоматизировать процесс поиска, поскольку достаточно просто сгенерировать строку поиска и проанализировать входящие html, чтобы перейти на страницу выходных.

Проблема в том, что поиск иногда генерирует несколько попаданий, поэтому вы не можете быть уверены, что получаете именно то, что нужно * mov ie. Вы можете только изучить заголовок впоследствии, чтобы узнать.

Вот функция, которую вы можете использовать. Вы предоставляете ему заголовок mov ie, и он попытается получить URL-адрес коллекций выходных для оригинального выпуска . Он выберет первое попадание на странице поиска, поэтому у вас нет гарантии, что это правильный mov ie.

get_weekend_url <- function(movie)
{
  site            <- "https://www.boxofficemojo.com"
  search_query    <- paste0(site, "/search/?q=")
  search_xpath    <- "//a[@class = 'a-size-medium a-link-normal a-text-bold']"
  release_xpath   <- "//option[text() = 'Original Release']"
  territory_xpath <- "//option[text() = 'Domestic']"
  weekend         <- "weekend/?ref_=bo_rl_tab#tabs"
  movie_url       <- url_escape(movie)                 %>%
                     {gsub("%20", "+", .)}             %>%
                     {paste0(search_query, .)}         %>%
                     read_html()                       %>%
                     html_nodes(xpath = search_xpath)  %>%
                     html_attr("href")

  if(!is.na(movie_url[1]))
  {
   release      <- read_html(paste0(site, movie_url[1]))   %>%
                   html_node(xpath = release_xpath)        %>%
                   html_attr("value")                      %>%
                   {paste0(site, .)}

  } else release <- NA  # We can stop if there is no original release found

  if(!is.na(release))
  {
    target <- read_html(release)                 %>%
              html_node(xpath = territory_xpath) %>%
              html_attr("value")                 %>%
              {paste0(site, ., weekend)}

  } else target <- "Movie not found"
  return(target)
}

Теперь вы можете использовать sapply, чтобы получить нужные URL:

movies <- c("Avatar",
            "Tangled",
            "Superman Returns",
            "Avengers : Endgame",
            "Man of Steel")

urls <- sapply(movies, get_weekend_url)
urls
#>                                                                            Avatar 
#>  "https://www.boxofficemojo.com/release/rl876971521/weekend/?ref_=bo_rl_tab#tabs" 
#>                                                                           Tangled 
#>  "https://www.boxofficemojo.com/release/rl980256257/weekend/?ref_=bo_rl_tab#tabs" 
#>                                                                  Superman Returns 
#> "https://www.boxofficemojo.com/release/rl4067591681/weekend/?ref_=bo_rl_tab#tabs" 
#>                                                                Avengers : Endgame 
#> "https://www.boxofficemojo.com/release/rl3059975681/weekend/?ref_=bo_rl_tab#tabs" 
#>                                                                      Man of Steel 
#> "https://www.boxofficemojo.com/release/rl4034037249/weekend/?ref_=bo_rl_tab#tabs" 

Теперь вы можете использовать их, чтобы получить таблицы для каждого мова ie:

css  <- ".mojo-field-type-rank+ .mojo-estimatable"
weekends  <- lapply(urls, function(x) read_html(x) %>% html_nodes(css) %>% html_text)

Что дает вам:

weekends
#> $`Avatar`
#>  [1] "Weekend\n            " "$77,025,481"           "$75,617,183"          
#>  [4] "$68,490,688"           "$50,306,217"           "$42,785,612"          
#>  [7] "$54,401,446"           "$34,944,081"           "$31,280,029"          
#> [10] "$22,850,881"           "$23,611,625"           "$28,782,849"          
#> [13] "$16,240,857"           "$13,655,274"           "$8,118,102"           
#> [16] "$6,526,421"            "$4,027,005"            "$2,047,475"           
#> [19] "$980,239"              "$1,145,503"            "$844,651"             
#> [22] "$1,002,814"            "$920,204"              "$633,124"             
#> [25] "$425,085"              "$335,174"              "$188,505"             
#> [28] "$120,080"              "$144,241"              "$76,692"              
#> [31] "$64,767"               "$45,181"               "$44,572"              
#> [34] "$28,729"               "$35,706"               "$36,971"              
#> [37] "$15,615"               "$16,817"               "$13,028"              
#> [40] "$10,511"              
#> 
#> $Tangled
#>  [1] "Weekend\n            " "$68,706,298"           "$56,837,104"          
#>  [4] "$48,767,052"           "$21,608,891"           "$14,331,687"          
#>  [7] "$8,775,344"            "$6,427,816"            "$9,803,091"           
#> [10] "$5,111,098"            "$3,983,009"            "$5,638,656"           
#> [13] "$3,081,926"            "$2,526,561"            "$1,850,628"           
#> [16] "$813,849"              "$534,351"              "$743,090"             
#> [19] "$421,474"              "$790,248"              "$640,753"             
#> [22] "$616,057"              "$550,994"              "$336,339"             
#> [25] "$220,670"              "$85,574"               "$31,368"              
#> [28] "$16,475"               "$5,343"                "$6,351"               
#> [31] "$910,502"              "$131,938"              "$135,891"             
#> 
#> $`Superman Returns`
#>  [1] "Weekend\n            " "$52,535,096"           "$76,033,267"          
#>  [4] "$21,815,243"           "$12,288,317"           "$7,375,213"           
#>  [7] "$3,788,228"            "$2,158,227"            "$1,242,461"           
#> [10] "$848,255"              "$780,405"              "$874,141"             
#> [13] "$1,115,228"            "$453,273"              "$386,424"             
#> [16] "$301,373"              "$403,377"              "$296,502"             
#> [19] "$331,938"              "$216,430"              "$173,300"             
#> [22] "$40,505"              
#> 
#> $`Avengers : Endgame`
#>  [1] "Weekend\n            " "$357,115,007"          "$147,383,211"         
#>  [4] "$63,299,904"           "$29,973,505"           "$17,200,742"          
#>  [7] "$22,063,855"           "$8,037,491"            "$4,870,963"           
#> [10] "$3,725,855"            "$1,987,849"            "$6,108,736"           
#> [13] "$3,118,317"            "$2,104,276"            "$1,514,741"           
#> [16] "$952,609"              "$383,158"              "$209,992"             
#> [19] "$100,749"              "$50,268"               "$70,775"              
#> [22] "$86,837"               "$12,680"              
#> 
#> $`Man of Steel`
#>  [1] "Weekend\n            " "$116,619,362"          "$41,287,206"          
#>  [4] "$20,737,490"           "$11,414,297"           "$4,719,084"           
#>  [7] "$1,819,387"            "$749,233"              "$466,574"             
#> [10] "$750,307"              "$512,308"              "$353,846"             
#> [13] "$290,194"              "$390,175"              "$120,814"             
#> [16] "$61,017"   

Если у вас есть 5000 фильмов для посмотрите, это займет длинный время, чтобы отправить и проанализировать все эти запросы. В зависимости от вашего соединения inte rnet, это может занять 2-3 секунды на mov ie. Это не плохо, но это может занять 4 часа времени обработки. Я бы рекомендовал начинать с пустого списка и записывать каждый результат в список по мере его получения, чтобы, если что-то сломалось через час или два, вы не потеряли все, что у вас есть.

...