मैं एक एकल प्रोजेक्ट पर काम कर रहा हूं जो वेबस्क्रैपिंग के लिए आरवेस्ट पैकेज का उपयोग करके स्टॉक डेटा उत्पन्न करने और इसे डेटाटेबल में संग्रहीत करने के साथ शुरू होता है।

लूप एक वेबसाइट से स्टॉक टिकर के एक हिस्से को खींचता है और इसे डेटाफ़्रेम में संग्रहीत करता है। मेरा कोड अत्यंत पुरातन है (मुझे लगता है), आंशिक रूप से वेबसाइट के व्यवस्थित होने के कारण। वेबसाइट पृष्ठों पर प्रतीकों को वर्णानुक्रम में व्यवस्थित करती है, प्रत्येक पृष्ठ पर अलग-अलग संख्या में टिकर (1 पृष्ठ प्रति अक्षर) - हाँ मुझे प्रति पृष्ठ कितने गिनना था। मैं काम के साथ समाप्त हुआ लेकिन बहुत धीरे-धीरे चलता हूं:

#GET AMEX tickers
alphabet <- c('A','B','C','D','E','F','G','H','I','J','K',
          'L','M','N','O','P','Q','R','S','T','U','V',
          'W','X','Y','Z')
#start at 2
lengths <- c(65,96,89,125,161,154,86,62,173,83,26,43,62,51,
         37,126,25,81,149,52,77,74,34,50,8,11)

amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/",toupper(alphabet),".htm",
 sep = "")

iterator <- 0
for(j in 1:26){
  url <- amexurls[j]
  for(k in 2:lengths[j]){

html <- read_html(as.character(url))
iterator 
test <- html_nodes(html,as.character(paste0("tr:nth-child(",k,") a")))
test <- toString(test)
test <-  gsub("<[^>]+>", "", test)
amexsymbols[k-2+iterator] <- test

  }
  iterator <- iterator + lengths[j] + 1
}

उपरोक्त लूप को चलने में एक घंटे से अधिक समय लगता है। मुझे लगता है कि यह मुख्य रूप से इंटरनेट पर कई कॉलों के कारण हो सकता है।

मैं आर की दक्षता को अधिकतम करने के लिए वैश्वीकरण और अन्य तरकीबों को समझने के बारे में बेहतर होने की कोशिश कर रहा हूं, खासकर इस तरह की एक बड़ी परियोजना पर।

जिन चीजों को मैंने आजमाया/देखा है:

-मैंने लूप के शरीर से उतना ही निकाल लिया है (विशेष रूप से पेस्ट0 लाइन

-डेटाफ्रेम से डेटाटेबल पर स्विच करना

- एक बहुत पुरानी पोस्ट में, उपयोगकर्ता @Gregor (फिर से धन्यवाद) ने मुझे दिखाया कि मैं एक वेक्टरकृत फ़ंक्शन होने के नाते पेस्ट0 का लाभ उठा सकता हूं, और इसलिए amexurls लूप के लिए स्टोर करने के लिए उपयोग नहीं करता है - लेकिन दुर्भाग्य से यह कोड का धीमा हिस्सा नहीं है

यह बहुत बड़े वेब स्क्रैपिंग कोड का एक अंश मात्र है। अगर मैं इस खंड को अनुकूलित कर सकता हूं, तो मैं इसे बाकी हिस्सों पर लागू कर सकता हूं। मेरे कोड या टिप्स/ट्रिक्स में किसी भी सुधार की बहुत सराहना की जाएगी। आपके समय के लिए धन्यवाद।

1
SoloMatt 22 फरवरी 2019, 21:44

1 उत्तर

सबसे बढ़िया उत्तर

फ़ायरवॉल प्रतिबंधों के कारण, मैं अभी इसका परीक्षण नहीं कर सकता। लेकिन मैं डेटा एकत्र करने के लिए rvest से html_table() फ़ंक्शन का उपयोग करके कुछ प्रयास करने की अनुशंसा करता हूं। यह मैन्युअल रूप से प्रत्येक पृष्ठ पर स्टॉक की संख्या निर्दिष्ट करने और प्रत्येक पंक्ति के माध्यम से अलग-अलग लूपिंग करने से कहीं अधिक गतिशील होगा।

library(rvest)

amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/", LETTERS,".htm")

ldf <- list()
iterator <- 0

for(url in amexurls){
  iterator <- iterator + 1
  html <- read_html(url)
  ldf[[iterator]] <- html_table(html_nodes(html, "table")[[2]])
}

df <- do.call(rbind, ldf)
1
Matt Jewett 22 फरवरी 2019, 19:45