Очистить Kickstarter с помощью R?

Я пытался очистить Kickstarter. Однако я не получаю результата, когда пытаюсь получить URL-адреса, относящиеся к проектам.

Это должен быть один из результатов:

https://www.kickstarter.com/projects/1534822242/david-bowie-hunger-city-photo-story?ref=category_ending_soon

и это мой код:

Код:

    main.page1 <- read_html(x ="https://www.kickstarter.com/discover/advanced?
    category_id=1&sort=end_date&seed=2498921&page=1")

    urls1 <- main.page1 %>% # feed `main.page` to the next step
            html_nodes(".block.img-placeholder.w100p") %>% # get the CSS nodes
            html_attr("href") # extract the URLs

Кто-нибудь видит, где я ошибаюсь?


person nemja    schedule 12.07.2017    source источник
comment
Похоже, что страница использует Ajax для заполнения деталей - блоки div .img-placeholder пусты (и, похоже, не имеют класса .block) при загрузке. См. html_nodes(main.page1,"div.img-placeholder")   -  person Spacedman    schedule 12.07.2017
comment
@Spacedman Вы знаете, как я могу поместить эти скрипты в фрейм данных в R?   -  person nemja    schedule 12.07.2017
comment
На самом деле похоже, что заполнители заполнены атрибутами data-project из другого div .... подождите ..,   -  person Spacedman    schedule 12.07.2017


Ответы (1)


Сначала объявите все используемые вами пакеты - мне пришлось поискать, чтобы понять, что мне нужны rvest:

> library(rvest)
> library(dplyr)

Получите свой HTML:

> main.page1 <- read_html(x ="https://www.kickstarter.com/discover/advanced?category_id=1&sort=end_date&seed=2498921&page=1")

В этом случае данные для каждого проекта хранятся в атрибуте data-project в группе блоков div. Некоторый Javascript (я подозреваю, что построен с использованием инфраструктуры React) в браузере обычно заполняет другие DIV и получает изображения, форматирует ссылки и т. Д. Но вы только что захватили необработанный HTML, так что он недоступен. Но необработанные данные .... Итак ....

Соответствующие блоки div выглядят как класс "react-disc-landing", поэтому он получает данные в виде текстовых строк:

> data = main.page1 %>% 
    html_nodes("div.react-disc-landing") %>% 
    html_attr("data-project")

Эти вещи выглядят как строки JSON:

> substr(data[[1]],1,80)
[1] "{\"id\":208460273,\"photo\":{\"key\":\"assets/017/007/465/9b725fdf5ba1ee63e8987e26a1d33"

Итак, давайте воспользуемся пакетом rjson для декодирования первого:

> library(rjson)
> jdata = fromJSON(data[[1]])

jdata теперь представляет собой очень сложный вложенный список. Используйте str(jdata), чтобы увидеть, что в нем. Я не уверен, что вам нужно, но, возможно, этот URL:

> jdata$urls$web$project
[1] "https://www.kickstarter.com/projects/1513052868/sense-of-place-by-jose-davila"

Если нет, то нужный URL должен быть где-то в этой структуре.

Повторите data[[i]], чтобы получить все ссылки.

Обратите внимание, что вам следует проверить T + C на сайте, что вам разрешено это делать, а также посмотреть, есть ли API, который вам действительно стоит использовать.

person Spacedman    schedule 12.07.2017
comment
Просто напомню, что строка read_html выдает мне эту ошибку: Error in open.connection(x, "rb"): Peer certificate cannot be authenticated with given CA certificates - person Mako212; 12.07.2017
comment
@ Mako212 это та же строка, что и в вопросе, поэтому она работает для меня, и я предполагаю, что задающий вопрос. Это должна быть ваша локальная установка / настройка сети. - person Spacedman; 12.07.2017
comment
Отличное решение! Теперь у меня осталась одна проблема ... Я хотел бы получить все 26 449 ссылок, но мне кажется, что я могу получить только 13. Даже когда я изменяю & page = 1 на другие числа, я получаю первые 13 ссылок. Это то же самое для вас, @Spacedman? Или я что-то не так сделал? - person nemja; 14.07.2017
comment
Это явно выходит за рамки T + C: не используйте какое-либо программное обеспечение или устройство (будь то ручное или автоматическое) для «сканирования» или «сканирования» какой-либо части Сайта. - person Spacedman; 14.07.2017