2012-04-09 4 views
6

Я пытаюсь очистить все счета от двух страниц на веб-сайте французской нижней палаты парламента. Страницы охватывают 2002-2012 годы и составляют менее 1000 счетов каждый.Как оптимизировать скребок с getURL() в R

Для этого я соскрести с getURL через эту петлю:

b <- "http://www.assemblee-nationale.fr" # base 
l <- c("12","13") # legislature id 

lapply(l, FUN = function(x) { 
    print(data <- paste(b, x, "documents/index-dossier.asp", sep = "/")) 

    # scrape 
    data <- getURL(data); data <- readLines(tc <- textConnection(data)); close(tc) 
    data <- unlist(str_extract_all(data, "dossiers/[[:alnum:]_-]+.asp")) 
    data <- paste(b, x, data, sep = "/") 
    data <- getURL(data) 
    write.table(data,file=n <- paste("raw_an",x,".txt",sep="")); str(n) 
}) 

Есть ли способ, чтобы оптимизировать функцию getURL() здесь? Я не могу использовать параллельную загрузку пропускания async=TRUE варианта, который дает мне ту же ошибку каждый раз, когда:

Error in function (type, msg, asError = TRUE) : 
Failed to connect to 0.0.0.12: No route to host 

Есть идеи? Благодаря!

+1

'асинхронной = TRUE, уже по умолчанию, если вы даете несколько URL-адресов - но открытие более 500 одновременных подключений к одной и той же веб-сайт не может быть хорошей идеей ... –

+0

Хорошо. Ну, я не могу сильно изменить, как работает 'getURL()'. –

ответ

1

Попробуйте mclapply {многоядерный} вместо lapply.

«mclapply является распараллеливаемым lapply, он возвращает список те же длины, как X, каждый элемент которого является результатом применения ПОТЕХУ к соответствующему элементу X.» (http://www.rforge.net/doc/packages/multicore/mclapply.html)

Если это не работает, вы можете получить более высокую производительность, используя XML пакет. Такие функции, как xmlTreeParse, используют асинхронный вызов.

«Обратите внимание, что xmlTreeParse действительно позволяет гибридный стиль обработки, позволяет нам использовать обработчик узлы в дереве, как они быть преобразуется в объектах R. Это стиль событийных или асинхронных вызова «. (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse)

+0

Ницца! Я не знал «mclapply», но это крутое предложение. Поскольку я задал этот вопрос, я обнаружил ваш второй вариант (используя 'XML' вместо' getURL'), и это работает очень хорошо. На ваш взгляд, было бы излишним распараллеливать цикл, где я анализирую HTML с помощью 'htmlParse'? –

+0

Это, скорее всего, быстрее очистит данные, но при написании кода может быть чистая потеря времени, если ваш прирост скорости не очень значителен. Это зависит от размера вашего набора данных. – rsoren

+0

Это не достаточно, чтобы оправдать это. Благодаря :) –

-4

Зачем использовать R? Для больших работ по очистке вам лучше использовать то, что уже разработано для этой задачи. У меня были хорошие результаты с Down Them All, добавлен браузер. Просто скажите, с чего начать, как глубоко идти, какие шаблоны следовать, и где сбрасывать HTML.

Затем используйте R для чтения данных из файлов HTML.

Преимущества огромные - эти надстройки разработаны специально для задачи, поэтому они будут выполнять несколько загрузок (контролируемых вами), они отправят правильные заголовки, поэтому ваш следующий вопрос не будет «как установить строка пользовательского агента с RCURL? », и они могут справиться с повторной попыткой, когда некоторые из загрузок не удались, что неизбежно.

Конечно, недостатком является то, что вы не можете легко запустить этот процесс автоматически, и в этом случае, возможно, вам будет лучше с «завиванием» в командной строке или другой утилитой зеркалирования командной строки.

Честно говоря, у вас есть дела поважнее с вашим временем, чем веб-сайта написать код в R ...

+3

Я использую R для анализа, который следует за извлечением данных! Я делаю операцию полностью реплицируемой, поэтому третье приложение не будет делать. Например, я открыт для предложений с Python. –

+0

Почему Python в порядке, но с помощью «curl» в командной строке (возможно, называемой формой R через систему) нет? Вы просто попытаетесь дублировать функциональность зависания командной строки с помощью python или R, и это большое бессмысленное усилие. Вы все равно можете использовать R, только вы делаете это на загруженных и сохраненных файлах. Удачи в реплицируемой работе, основанной на очистке от веб-сайта ... – Spacedman

+4

О, 'curl' будет делать. Здесь есть хороший код для очистки для Ruby и Python, и для bash, конечно. Теперь R - это практический способ совместного использования кода соскабливания по коду статистики, особенно для пользователей, которые не используют код на регулярной основе. Что касается реплицируемости, то это парламентский сайт, их архивы, как правило, продолжаются. –

Смежные вопросы