我正在嘗試從https://nomics.com/獲取資產和交換資料。我想在 i 頁中獲取每頁(1??00 行)的排名、名稱、價格等。對于那里列出的所有交易所,我已經成功地做到了這一點。我在 Chrome(和 Brave)瀏覽器中使用 CSS 選擇器工具來獲取節點 ID。
交易所 MWE
# libraries & dependencies
library(rvest)
library(dplyr)
# website url
base_url <- "https://nomics.com/exchanges/"
# empty list to store page results
datalist <- list()
for(i in 1:6){
new_url <- paste0(base_url, i)
page = read_html(new_url)
rank = page %>% html_nodes(".n-pv12.f6-ns") %>% html_text()
name = page %>% html_nodes(".fw5.nowrap.truncate") %>% html_text()
impact_score = page %>% html_nodes(".n-ph6.f6") %>% html_text()
volume = page %>% html_nodes(".f6-ns .mono") %>% html_text()
volume_percent = page %>% html_nodes(".mono.n-dtc-1120") %>% html_text()
rating = page %>% html_nodes(".n-dtc-1120 td") %>% html_text()
trades = page %>% html_nodes(".n-pv18.n-dtc-650") %>% html_text()
trades_percent = page %>% html_nodes(".mono.n-dtc-1280") %>% html_text()
pairs = page %>% html_nodes(".n-pv18.n-dtc-768") %>% html_text()
fiat = page %>% html_nodes(".mono.n-dtc-1024") %>% html_text()
datalist[[i]] <- data.frame(rank, name, impact_score, volume, volume_percent, rating, trades, trades_percent, pairs, fiat)
}
# combine results and store as tibble
big_data = do.call(rbind, datalist)
tibble(big_data)
當我運行它時,我得到了一個很好的 tibble 與我所希望的一切。
加密貨幣資產 MWE
現在,當我嘗試對主頁本身的資產資料執行相同操作時,我似乎無法使用 CSS 選擇器工具選擇正確的節點。我嘗試了不同的 CSS 選擇器工具,在 chrome 中進入開發者螢屏并嘗試了不同的瀏覽器。我選擇的節點中似乎包含更多資料。正因為如此,我和他們發生了爭執。
對于 rank 變數,輸出是混亂的。有時會在實際排名本身后面添加另一個數字。對于其他變數,我可以過濾掉行。
# base url
base_url <- "https://nomics.com/"
page <- read_html(base_url)
### extract html nodes ###
# extract rank, output is messed up on the numbering
rank <- page %>% html_nodes(".flex-column.n-pl6") %>% html_text() %>% tibble(rank = .)
# extract names
name <- page %>% html_nodes(".overflow-visible") %>% html_text() %>% tibble(name = .)
name <- name[201:300,] # output is messy, filtering required rows
# extract price
price <- page %>% html_nodes(".n-dark-gray.f7-s.fw5") %>% html_text() %>% tibble(price = .)
price <- price[1:100,] # output is messy, filtering required rows
df <- rank %>% bind_cols(name, price)
似乎只有 rank 變數似乎搞砸了,我不知道如何糾正這個問題。我想我可以使用正則運算式或子集來解決這個問題,但我希望有另一種方法來解決這個問題
Tibbles 對我來說更容易爭吵,當我嘗試像我為交換所做的那樣回圈它時,它顯然會弄亂結果。
這里的任何人都知道為什么主頁上的結果和/exchanges 上的結果很混亂嗎?
更新 1
嘗試根據第一個答案回圈。沒有回圈,它適用于所有單獨的頁面。它運行正確,但不會將串列中的不同頁面子集或存盤/附加到 rbind。
# base url
base_url <- "https://nomics.com/"
# create empty list to store pages in
datalist <- list()
# create loop for i pages
for(i in 1:5){
# new url ( 1)
new_url <- paste0(base_url, i)
message("Retrieving page ", i)
# new html page
data <- read_html(new_url) %>%
html_element('#__NEXT_DATA__') %>%
html_text %>%
jsonlite::parse_json(simplifyVector = T)
listings[[i]] <- data$props$pageProps$data$currenciesTicker[,1:25]
}
big_data = do.call(rbind, listings)
tibble(big_data)
View(big_data)
``
uj5u.com熱心網友回復:
該資料存盤在腳本標簽中。您可以從腳本標簽中提取并擁有一個現成的資料框。
library(rvest)
library(jsonlite)
library(tidyverse)
data <- read_html('https://nomics.com/') %>%
html_element('#__NEXT_DATA__') %>%
html_text %>%
jsonlite::parse_json(simplifyVector = T)
listings <- data$props$pageProps$data$currenciesTicker
head(listings) %>% select(id, rank)
您可以將上述內容轉換為函式并使用 map_dfr 從所需的輸入 url 生成 1 個大資料幀。然后為您想要的任何列設定子集。
library(rvest)
library(jsonlite)
library(tidyverse)
get_df <- function(url) {
data <- read_html(url) %>%
html_element("#__NEXT_DATA__") %>%
html_text() %>%
jsonlite::parse_json(simplifyVector = T)
listings <- data$props$pageProps$data$currenciesTicker
return(listings)
}
urls <- paste0("https://nomics.com/", 1:5)
big_df <- map_dfr(urls, get_df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/492879.html
