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)