Соскребите html-таблицу из длинного списка URL-адресов и создайте один список фреймов данных

У меня есть список из 38 000+ URL-адресов. У каждого URL есть таблица, которую я хотел бы очистить. Например:

library(rvest)
library(magrittr)
library(plyr)


#Doing URLs one by one
url<-"http://www.acpafl.org/ParcelResults.asp?Parcel=00024-006-000"

##GET SALES DATA
pricesdata <- read_html(url) %>% html_nodes(xpath = "//table[4]") %>% html_table(fill=TRUE)
library(plyr)
df <- ldply(pricesdata, data.frame)

Я хотел бы обобщить это на все URL-адреса в Parcels_ID.txt.

#(1) Step one is to generate a list of urls that we want to scrape data from

parcels <- read.csv(file="Parcels_ID.txt", sep="\t", header=TRUE, stringsAsFactors=FALSE) #import the data
parcelIDs <- as.vector(parcels$PARCELID) #reformat the column as a vector containing parcel IDs as individual elements of the vector
parcels$url = paste("http://www.acpafl.org/ParcelResults.asp?Parcel=", parcelIDs, sep="") #paste the web address and the parcel ID together to get the link to the parcel on the website

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

#(2) Step to is to write a for loop that will scrape the tables from the individual pages

compiled<-list()
for (i in seq_along(parcels$url)){

  ##GET SALES DATA
  pricesdata <- read_html(parcels$url[i]) %>% html_nodes(xpath = "//table[4]") %>% html_table(fill=TRUE)

  compiled[[i]] <- ldply(pricesdata, data.frame)

}

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

Спасибо


person user3795577    schedule 04.12.2015    source источник
comment
Вы подсчитывали, сколько времени занимает обработка 1 страницы, а затем умножали это на 38 000? Если бы каждая страница занимала секунду, вам пришлось бы ждать более 10 часов.   -  person MrFlick    schedule 04.12.2015
comment
@MrFlick Правда ... Как вы думаете, есть ли способ ускорить это?   -  person user3795577    schedule 04.12.2015
comment
(a) Я бы попросил владельца сайта сделать дамп контента, чтобы не навредить его инфраструктуре. есть большая вероятность, что он генерируется из базы данных, и это может избавить вас от головной боли (б) если вы не хотите, чтобы они знали, что вы очищаете их содержимое, запрашивая другой формат, тогда вы можете запустить GNU Parallel? Если это так, вы можете сделать что-то вроде stackoverflow.com/questions/8634109/, а затем обработайте файлы на диске.   -  person hrbrmstr    schedule 05.12.2015
comment
я только что пошел по этому одному примеру URL. это определенно вызов базы данных в реальном времени, и массовая очистка без тайм-аута/задержки была бы для вас действительно ужасной. Похоже, что это сайт IIS с серверной частью SQL Server, и, судя по всему, это небольшая организация, так что это, вероятно, довольно маленький сервер. Учтите это при попытке непреднамеренной атаки на отказ в обслуживании.   -  person hrbrmstr    schedule 05.12.2015
comment
@hrbrmstr Я очень ценю совет. Доказывает, что немного знаний может быть вредным. Я не собираюсь причинять вред, поэтому полезно знать о последствиях. Можете ли вы объяснить, что такое непреднамеренная атака типа «отказ в обслуживании»?   -  person user3795577    schedule 05.12.2015
comment
@hrbrmstr Не могли бы вы предоставить более подробную информацию об использовании параллелизма GNU для этого вместе с этой ссылкой? Я никогда не использовал его раньше.   -  person user3795577    schedule 05.12.2015