【发布时间】:2022-08-03 09:24:28
【问题描述】:
我正在尝试抓取网站上每个名称的名称、地址和经度/纬度坐标(例如www.mywebsite.com)。我使用以下代码根据this SO post 获取地址和名称
library(tidyverse)
library(rvest)
library(httr)
library(XML)
# Define function to scrape 1 page
get_info <- function(page_n) {
cat(\"Scraping page \", page_n, \"\\n\")
page <- paste0(\"mywebsite.com\",
page_n, \"?extension\") %>% read_html
tibble(title = page %>%
html_elements(\".title a\") %>%
html_text2(),
adress = page %>%
html_elements(\".marker\") %>%
html_text2(),
page = page_n)
}
# Apply function to pages 1:10
df_1 <- map_dfr(1:10, get_info)
# Check dimensions
dim(df_1)
[1] 90
由于我不知道如何修改上面的代码来提取坐标,所以我编写了一个单独的脚本来抓取它们:
# Recognize pattern in websites
part1 = \"www.mywebsite.com\"
part2 = c(0:55)
part3 = \"?extension\"
temp = data.frame(part1, part2, part3)
# Create list of websites
temp$all_websites = paste0(temp$part1, temp$part2, temp$part3)
# Scrape
df_2 <- list()
for (i in 1:10)
{tryCatch({
url_i <-temp$all_websites[i]
page_i <-read_html(url_i)
b_i = page_i %>% html_nodes(\"head\")
listanswer_i <- b_i %>% html_text() %>% strsplit(\"\\\\n\")
df_2[[i]] <- listanswer_i
print(listanswer_i)
}, error = function(e){})
}
# Extract long/lat from results
lat_long = grep(\"LatLng\", unlist(df_2[]), value = TRUE)
df_2 = data.frame(str_match(lat_long, \"LatLng(\\\\s*(.*?)\\\\s*);\"))
最后,抓取前 10 页的姓名/地址会产生 90 个条目,但抓取相同的 10 页的经度/纬度会产生 96 个条目:
dim(df_1)
[1] 90
dim(df_2)
[1] 96 3
有人可以帮我理解为什么会这样,我能做些什么来解决这个问题?
最后,我会制作一个看起来像这样的决赛桌(使用 df_1 和 df_2):
id name address long lat
1 1 name1 address1 long1 lat1
2 2 name2 address2 long2 lat2
3 3 name3 address3 long3 lat3
谢谢!
笔记:我了解某些名称可能缺少纬度/经度,并且可能无法使 \"df_1\" 的尺寸与 \"df_2\" 的尺寸匹配。如果是这种情况,是否有可能找出哪些名称缺少其纬度/经度(例如,在这些情况下将纬度/经度条目替换为 NULL)?例如 - 假设纬度/经度不适用于 \"name3\":
id name address long lat
1 1 name1 address1 long1 lat1
2 2 name2 address2 long2 lat2
3 3 name3 address3 NA NA
-
如果您对我在下面提供的答案有任何疑问,请告诉我(即,如果它不是可接受的答案)。您应该特别注意的一件事是“为什么问题不是页面”中的要点。
-
@socialscientist:非常感谢你的回答——我真的很感激!我正在重新阅读您写的所有内容,以确保我理解正确!
-
我看到你修改了你的问题的内容,添加了一个全新的部分,询问如何从你的抓取输出中生成一个整洁的数据集。这与您提出的问题完全不同(这就是为什么两个对象的维度不同)。请删除此添加以遵循每个帖子一个问题的规则。您始终可以创建另一个帖子,询问如何从您的输出移动到该输出。
-
@socialscientist:我并不是要添加一个新部分——我只是想提供一些关于最终结果应该如何的参考。如果您愿意 - 我可以删除它。
-
您的问题是关于两种不同的 Webscraping 方法如何产生两种不同的结果,之前以“有人可以帮助我理解为什么会发生这种情况以及我能做些什么来解决这个问题吗?”作为对比,“我该如何抓取这个网站产生这个特定的结果?\”是一个完全不同的问题。建议将其放在一个单独的问题中,以便其他人可以更有效地帮助您,并且您的帖子将来对其他人有更多用处。
标签: html r loops web-scraping data-manipulation