R: Проверьте наличие url, проблемы с httr: GET() и url.exists()

У меня есть список из примерно 13 000 URL-адресов, которые я хочу извлечь из информации, однако, не каждый URL-адрес существует. На самом деле большинство нет. Я только что пробовал передавать все 13 000 URL-адресов через html(), но это занимает много времени. Я пытаюсь понять, как проверить, действительно ли существуют URL-адреса, прежде чем разбирать их на html(). Я попытался использовать функции httr и GET(), а также функции rcurls и url.exists(). По какой-то причине url.exist() всегда возвращает значения FALSE, даже если URL-адрес существует, и способ, которым я пользуюсь GET(), всегда возвращает успех, я думаю, что это происходит потому, что страница перенаправляется.

Следующие URL-адреса представляют тип страниц, которые я обрабатываю, первый не существует

urls <- data.frame('site' = 1:3, 'urls' = c('https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
                            'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202',
                            'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339'))

urls$urls <- as.character(urls$urls)

Для GET() проблема заключается в том, что второй URL-адрес фактически не существует, но он перенаправляется и, следовательно, возвращает "успех".

 urls$urlExists <- sapply(1:length(urls[,1]), 
                     function(x) ifelse(http_status(GET(urls[x, 'urls']))[[1]] == "success", 1, 0))

Для url.exists(), я получаю три FALSE, даже если первый и третий URL-адреса существуют.

 urls$urlExists2 <- sapply(1:length(urls[,1]), function(x) url.exists(urls[x, 'urls']))

Я проверил эти два сообщения 1, 2, но я бы предпочел не использовать useragent просто потому, что я не уверен, как найти мой или он изменится для разных людей, используя этот код на других компьютерах. Поэтому сделать код сложнее подбирать и использовать другим. Ответы обеих должностей предлагают использовать GET() в httr. Похоже, что GET(), вероятно, является предпочтительным методом, но мне нужно будет выяснить, как справиться с проблемой перенаправления.

Может ли кто-нибудь предложить хороший способ в R, чтобы проверить наличие URL-адреса, прежде чем разбирать их до html()? Я также был бы рад за любую другую предложенную работу по этой проблеме.

UPDATE:

После просмотра возвращаемого значения из GET(), я выяснил, как работать, см. ответы для деталей.

Ответ 1

С помощью httr используйте url_success() и перенаправление после выключения:

library(httr)

urls <- c(
  'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
  'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202',
  'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339'
)

sapply(urls, url_success, config(followlocation = 0L), USE.NAMES = FALSE)

Ответ 2

После предложения от @TimBiegeleisen я посмотрел, что было возвращено из funtion GET(). Кажется, что если url существует GET(), он вернет этот URL-адрес в качестве значения, но если он перенаправлен, возвращается другой URL-адрес. Я просто изменил код, чтобы посмотреть, соответствует ли url, возвращаемый GET() тем, который я отправил.

urls$urlExists <- sapply(1:length(urls[,1]), function(x) ifelse(GET(urls[x, 'urls'])[[1]] == urls[x,'urls'], 1, 0))

Мне было бы интересно узнать о лучших методах, которые люди используют для одного и того же.

Ответ 3

url_success(x) устарела; используйте вместо этого !http_error(x).

Так что обновите решение от Хадли.

> library(httr)
> 
> urls <- c(  
> 'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010',
> 'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202',
> 'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339'
> )
> 
> !sapply(urls, http_error)