Rでウェブをスクレイピングしているときにエラーを取り除く方法は?
Aug 22 2020
このウェブサイトをスクレイピングしていると、ティブル列に互換性のあるサイズが必要であるというエラーメッセージが表示されます。
この場合はどうすればよいですか?
library(rvest)
library(tidyverse)
url <- "https://www.zomato.com/tr/toronto/drinks-and-nightlife?page=5"
map_dfr(
.x = url,
.f = function(x) {
tibble(
url = x,
place = read_html(x) %>%
html_nodes("a.result-title.hover_feedback.zred.bold.ln24.fontsize0") %>%
html_attr("title"),
price = read_html(x) %>%
html_nodes("div.res-cost.clearfix span.col-s-11.col-m-12.pl0") %>%
html_text()
)
}
) -> df_zomato
前もって感謝します。
回答
2 Dave2e Aug 22 2020 at 20:26
問題は、すべてのレストランが完全な記録を持っていないことが原因です。この例では、リストの13番目のアイテムに価格が含まれていなかったため、価格ベクトルには14アイテムが含まれ、場所ベクトルには15アイテムが含まれていました。
この問題を解決する1つの方法は、共通の親ノードを見つけて、それらのノードをhtml_node()
関数で解析することです。html_node()
NAであっても、常に値を返します。
library(rvest)
library(dplyr)
library(tibble)
url <- "https://www.zomato.com/tr/toronto/drinks-and-nightlife?page=5"
readpage <- function(url){
#read the page once
page <-read_html(url)
#parse out the parent nodes
results <- page %>% html_nodes("article.search-result")
#retrieve the place and price from each parent
place <- results %>% html_node("a.result-title.hover_feedback.zred.bold.ln24.fontsize0") %>%
html_attr("title")
price <- results %>% html_node("div.res-cost.clearfix span.col-s-11.col-m-12.pl0") %>%
html_text()
#return a tibble/data,frame
tibble(url, place, price)
}
readpage(url)
上記のコード例では、同じページを複数回読んでいたことにも注意してください。これは遅く、サーバーに追加の負荷をかけます。これは、「サービス拒否」攻撃と見なされる可能性があります。
ページを一度メモリに読み込んでから、そのコピーを操作することをお勧めします。
更新
複数のページに関する質問に答えます。上記の関数を関数でラップしてからlapply
、返されたデータフレーム(またはtibbles)のリストをバインドします
dfs <- lapply(listofurls, function(url){ readpage(url)})
finalanswer <- bind_rows(dfs)