Как прочитать данные JSON из списка URL-адресов и привести их в порядок данных? - PullRequest
1 голос
/ 09 ноября 2019

Я использую помощь https://ipstack.com для геокодирования IP-адресов и с трудом пытаюсь геокодировать все 1200 адресов за короткий промежуток времени.

С помощью R я собрал URL-адреса в список (например, http://api.ipstack.com/[IP address]?access_key=[access key]) и могу использовать read_json для чтения данных json каждого URL-адреса. Но я не смог разработать цикл для извлечения данных из каждого URL.

library(RCurl)
library(jsonlite)

x <- c("http://api.ipstack.com/178.140.119.217?access_key=[access_key]", "http://api.ipstack.com/68.37.21.125?access_key=[access_key]", "http://api.ipstack.com/68.10.255.89?access_key=[access_key]")

read_json(x)
Error in file(path) : invalid 'description' argument

Я ищу решение, которое сможет считывать несколько IP-адресов и затем прикреплять информацию к кадру данных.

* Редактировать 1: Все еще застрял, но яделая некоторый прогресс с циклом,

library(RCurl)
library(jsonlite)

url_lst = as.character(df$URL)

output = NULL
for (i in url_lst) { 
  x = as.data.frame(read_json(i))
  output = rbind(output,x)
 }

Однако это приводит к ошибке:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : arguments imply differing number of rows: 1, 0

Кроме того, код производит только 8 наблюдений, а не 1200.

* Редактировать 2: ответ Билла Эша дал мне больше, чем я, но похоже, что некоторые значения в данных JSON не позволяют коду успешно работать.

Код Билла Эша:

library(httr)
library(tibble)
library(purrr)
library(jsonlite)

ip_addresses <- core_members$ip_address

# a simple function
ip_locate <- function(your_vector_of_ip_addresses, access_key) {

  ip <- your_vector_of_ip_addresses

  map_df(ip, ~{
    out <- httr::GET(url = paste0("http://api.ipstack.com/", .,
                                  "?access_key=", access_key))
    resp <- fromJSON(httr::content(out, "text"), flatten = TRUE)
    tibble::tibble(ip = resp$ip, 
                   country = resp$country_name, 
                   region = resp$region_name, 
                   city = resp$city, 
                   zip = resp$zip, 
                   lat = resp$latitude, 
                   lng = resp$longitude)

  })

}


ip_info <- ip_locate(your_vector_of_ip_addresses = ip_addresses, 
                     access_key = "[access_key]")

# output

ip_info %>% 
  head()

Где начинается ошибка

ip_info <- ip_locate(your_vector_of_ip_addresses = ip_addresses, 
                     access_key = "[access_key]")

Error: All columns in a tibble must be 1d or 2d objects:
* Column `zip` is NULL
9.
stop(cnd) 
8.
abort(error_column_must_be_vector(names_x[is_xd], classes)) 
7.
check_valid_cols(x) 
6.
lst_to_tibble(xlq$output, .rows, .name_repair, lengths = xlq$lengths) 
5.
tibble::tibble(ip = resp$ip, country = resp$country_name, region = resp$region_name, 
city = resp$city, zip = resp$zip, lat = resp$latitude, lng = resp$longitude) 
4.
.f(.x[[i]], ...) 
3.
map(.x, .f, ...) 
2.
map_df(ip, ~{
out <- httr::GET(url = paste0("http://api.ipstack.com/", 
    ., "?access_key=", access_key))
resp <- fromJSON(httr::content(out, "text"), flatten = TRUE) ... 
1.
ip_locate(your_vector_of_ip_addresses = ip_addresses, access_key = "[access_key]")

Поскольку мне нужны только координаты с этих IP-адресов, я считаю, что это было решено. Надеюсь, кто-то захочет продолжить консультирование по этому вопросу, но я не буду больше это обновлять.

1 Ответ

0 голосов
/ 09 ноября 2019

Похоже, вы также можете оплатить массовый поиск.

С этой страницы документации:

Массовый поиск IP

API ipstack также позволяет запрашивать данные для нескольких адресов IPv4 или IPv6 одновременно. Для массовой обработки IP-адресов просто добавьте несколько разделенных запятыми IP-адресов к базовому URL-адресу API.

library(httr)
library(tibble)
library(purrr)
library(jsonlite)

# some ip addresses 
ip_addresses <- c("178.140.119.217", "68.37.21.125", "68.10.255.89")

# a simple function
ip_locate <- function(your_vector_of_ip_addresses, access_key) {

  ip <- your_vector_of_ip_addresses

  map_df(ip, ~{
    out <- httr::GET(url = paste0("http://api.ipstack.com/", .,
                    "?access_key=", access_key))
    resp <- fromJSON(httr::content(out, "text"), flatten = TRUE)
    tibble::tibble(ip = resp$ip, 
                   country = resp$country_name, 
                   region = resp$region_name, 
                   city = resp$city, 
                   zip = resp$zip, 
                   lat = resp$latitude, 
                   lng = resp$longitude)

  })

    }

# an example 
ip_info <- ip_locate(your_vector_of_ip_addresses = ip_addresses, 
          access_key = "had to edit out my key")

# output

ip_info %>% 
  head()

# A tibble: 3 x 7
  ip              country       region   city       zip      lat   lng
  <chr>           <chr>         <chr>    <chr>      <chr>  <dbl> <dbl>
1 178.140.119.217 Russia        Moscow   Moscow     101001  55.8  37.6
2 68.37.21.125    United States Michigan Southgate  48195   42.2 -83.2
3 68.10.255.89    United States Virginia Chesapeake 23323   36.8 -76.3

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...