Очистите ссылки на данные страницы с помощью JavaScript от R - PullRequest
1 голос
/ 20 сентября 2019

Пожалуйста, помогите мне.

Я новичок в веб-очистке в R. Я хочу собрать ссылку на таблицы данных загрузки на этой странице (http://burkinafaso.opendataforafrica.org/). Мой проектчтобы сделать эти данные более доступными.

Вот сайт: http://burkinafaso.opendataforafrica.org/

На странице Donnée У меня есть список секторов. Сельское хозяйство: 43 таблицы PublicСправка: 7 таблиц ...

Когда я нажимаю Сельское хозяйство , я получаю список наборов данных. https://drive.google.com/open?id=1cInWz62HjbcpgJ00rK-8Q-0p71mC59hq

  1. Я хочу получить список этихtitle.
  2. Для каждого заголовка получите ссылку для загрузки набора данных.

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

library(RCurl)
library(XML)
library(rvest)
URL <- "http://burkinafaso.opendataforafrica.org/"
pg <- read_html(URL)
p <- html_children(pg)[1]
pp <- html_children(pg)[2]
html_structure(p)
html_structure(pp)
library(RCurl)
library(XML)
library(rvest)
URL <- "http://burkinafaso.opendataforafrica.org/data/#topic=Agriculture"
pg <- read_html(URL)
p <- html_children(pg)[1]
pp <- html_children(pg)[2]
html_structure(p)
html_structure(pp)

Например, я пробовал этот код для ссылок в тегах. Но я не получаю разные ссылки для скачивания.

URL <- "http://burkinafaso.opendataforafrica.org/data/#topic=Agriculture"
pg <- read_html(URL)
all.url <- html_attr(html_nodes(pg, "a"), "href")
all.url <- as.data.frame(all.url)

Как результат я ожидаю, Для каждого итма список таблиц и ссылок для скачивания. Например:

для Public Aid (7):

label links

Ссылки на скачивание Aide extérieure par 1995–2006 (в миллионах FCFA) Ссылки на скачивание Aide extérieure par type (в миллионах FCFA)

Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 20 сентября 2019

Веб-трафик и вызов API:

Итак, если вы начнете, например, с

http://burkinafaso.opendataforafrica.org/data/#menu=topic

Вы можете увидетьсписок всех ссылок верхнего уровня вместе с количеством их наборов данных.Если бы мы нажали на Aide Publique (7), мы бы увидели 7 разделов, которые, если вы нажмете на любой из них, представят вам Select dataset.

Если вы отслеживаете веб-трафик при первом кликеВы увидите запрос API POST для получения данных для Aide Publique (7):

enter image description here

Если мы дополнительно проверим запрос, мы сможем наблюдать строку запросапараметры в URL и полезной нагрузке запроса:

enter image description here

Параметры - это, в основном, некоторая информация о нас, которую мы, вероятно, можем удалить;и небольшие эксперименты с полезной нагрузкой показывают, что если исключить полезную нагрузку, мы фактически получим все темы, а не только Aide Publique (7).


Ответ API:

Теперь, ответом является json и массив, но в R это означает список.Рассмотрим в качестве примера часть одного элемента в списке:

image

Сравнение этой информации с фактическими ссылками набора данных, например

enter image description here

Нажатие на Select DataSet приводит к конечному URL-адресу

http://burkinafaso.opendataforafrica.org/nthpfqd/aide-ext%C3%A9rieure-par-secteur-de-1995-%C3%A0-2006-en-millions-de-fcfa

Быстрое сравнение с элементом списка 1 (предыдущее изображение json) показываетчто это, если мы считаем, что этот новый URL декодирован:

http://burkinafaso.opendataforafrica.org/nthpfqd/aide-extérieure-par-secteur-de-1995-à-2006-en-millions-de-fcfa

имеет формат:

'http://burkinafaso.opendataforafrica.org/{item["id"]}/{item["title"]}'

значение, в циклеповерх объекта ответа json мы можем сгенерировать окончательные ссылки, объединяя базовую строку с текущим элементом id и текущим элементом title.Мы также можем извлечь заголовок из текущего элемента name.Мы можем использовать purrr и map_df для обработки цикла и окончательной генерации информационного кадра и httr для создания POST.


R:

library(httr)
library(purrr)

r <- content(POST("http://burkinafaso.opendataforafrica.org/api/1.0/meta/dataset"))

df <- map_df(r, function(item) {

  data.frame(title = item$name,
             url = paste0("http://burkinafaso.opendataforafrica.org/", item$id,'/',item$title),
             stringsAsFactors=FALSE)
})

View(df)

Py:

import requests
import pandas as pd

r = requests.post('http://burkinafaso.opendataforafrica.org/api/1.0/meta/dataset').json()
df = pd.DataFrame([(item['name'], f'http://burkinafaso.opendataforafrica.org/{item["id"]}/{item["title"]}') for item in r]
                  ,columns = ['Title','Url'])
print(df)
...