Tolong bantu saya.

Saya baru mengenal web scraping di R. Saya ingin mengumpulkan tautannya unduh tabel data di halaman ini (http://burkinafaso.opendataforafrica.org/). Proyek saya adalah membuat data ini lebih mudah diakses.

Berikut websitenya : http://burkinafaso.opendataforafrica.org/

Di halaman Donnée saya memiliki daftar sektor. Pertanian: 43 meja Bantuan Publik: 7 tabel ...

Ketika saya mengklik Pertanian saya mendapatkan daftar dataset. https://drive.google.com/open?id=1cInWz62HjbcpgJ00rK-8Q- 0p71mC59hq

  1. Saya ingin mendapatkan daftar judul-judul ini.
  2. Untuk setiap judul, dapatkan tautan unduhan kumpulan data.

Saya mencoba kode di bawah ini untuk melihat struktur situs. Tetapi saya tidak melihat arsitektur yang memungkinkan saya mengekstrak tautan ini.

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)

Misalnya, saya mencoba kode ini untuk tautan dalam tag. Tetapi saya tidak mendapatkan tautan unduhan yang berbeda.

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)

Sebagai hasil yang saya harapkan, Untuk setiap daftar tabel dan tautan unduhan. Sebagai contoh:

Untuk Bantuan Umum (7):

Tautan label

Tautan unduhan Aide extérieure par secteur de 1995 2006 (dalam jutaan de FCFA) Tautan unduhan aide extérieure par type (dalam jutaan de FCFA)

Tolong bantu saya.

1
Armel Soubeiga 20 September 2019, 15:47

1 menjawab

Jawaban Terbaik

Lalu lintas web dan panggilan API:

Jadi, jika Anda memulai , misalnya, dengan

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

Anda dapat melihat daftar semua tautan tingkat atas beserta jumlah kumpulan datanya. Jika kami mengeklik Aide Publique (7), kami akan melihat 7 bagian yang, jika Anda mengeklik salah satunya, akan menampilkan Select dataset.

Jika Anda memantau lalu lintas web saat melakukan klik pertama itu, Anda akan melihat permintaan API POST dibuat untuk mengambil data untuk Aide Publique (7):

enter image description here

Jika kami memeriksa permintaan lebih lanjut, kami dapat mengamati parameter string kueri di url dan payload permintaan:

enter image description here

Params pada dasarnya adalah beberapa info tentang kami yang mungkin dapat kami hapus; dan sedikit eksperimen dengan payload menunjukkan, jika kita mengecualikan payload, kita sebenarnya mendapatkan semua topik dan bukan hanya Aide Publique (7).


Tanggapan API:

Sekarang, responsnya adalah json dan merupakan array tetapi dalam R itu berarti daftar. Melihat bagian dari satu item dalam daftar sebagai contoh:

Perbandingan info itu versus tautan kumpulan data aktual, mis.

enter image description here

Mengklik Select DataSet menghasilkan url akhir dari

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

Perbandingan cepat dengan item daftar 1 (gambar json sebelumnya) menunjukkan bahwa ini jika kami menganggap url baru ini didekodekan:

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

Adalah formatnya:

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

Artinya, dalam satu lingkaran di atas objek respons json kita dapat menghasilkan tautan terakhir dengan menggabungkan string dasar dengan item saat ini id dan item saat ini title. Kami juga dapat mengekstrak judul dari item saat ini name. Kita dapat menggunakan purrr dan map_df untuk menangani loop dan pembuatan kerangka data akhir dan httr untuk membuat POST.


P:

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)
1
QHarr 20 September 2019, 19:41