Как получить все действительные URL-адреса с веб-сайта?

Я выполняю проект веб-скрейпинга этого веб-сайта.

На данный момент я хотел бы извлечь имя исполнителя из такого URL-адреса: https://lsdb.eu/artists/view/225/

Поскольку есть исполнитель под номером 225, страница существует. Однако https://lsdb.eu/artists/view/226/ не существует, но существуют страницы с номерами выше 226.

Есть ли способ очистить веб-сайт, чтобы увидеть, какие https://lsdb.eu/artists/view/xxx/ URL-адреса действительны?


person iatowks    schedule 09.08.2017    source источник
comment
Вы можете обернуть очистку внутри try, чтобы она просто пропускала плохие URL-адреса и переходила к следующему. В качестве альтернативы httr::GET разрешает доступ к ответу сайта, поэтому GET("https://lsdb.eu/artists/view/225/")$status_code вернет 200 (хорошо), тогда как GET("https://lsdb.eu/artists/view/226/")$status_code вернет 404 (плохо).   -  person roarkz    schedule 10.08.2017


Ответы (1)


Сайт отвечает на HTTP-запросы HEAD, которые, как правило, более удобны для сайтов, поскольку обычно требуют меньше ресурсов (как минимум, содержимое не возвращается, что экономит время и пропускную способность). Вы можете сделать что-то вроде следующего:

library(httr)

is_valid_artist <- function(x) {
  httr::status_code(httr::HEAD(sprintf("https://lsdb.eu/artists/view/%s/", x)))
}

is_valid_artist("225")
## [1] 200

is_valid_artist("226")
## [1] 404 

is_valid_artist("42437")
## [1] 200

is_valid_artist("100000000")
## [1] 404

Если вы решите выполнить серию последовательных поисков, добавьте небольшую паузу между запросами, так как вы все равно можете нанести отказ сайту. Для получения полного контента предлагается 5-10 секунд, но для HEAD запросов вы можете с этической точки зрения сделать это 1 секундой (IMO).

person hrbrmstr    schedule 15.10.2017