कोर्स
जब आपको वेब स्क्रैपिंग करनी हो, तो आप आमतौर पर Hadley Wickham के rvest पैकेज का उपयोग करेंगे। यह पैकेज किसी वेबपेज को जनरेट करने वाले HTML कोड को लाने के लिए एक आसान, तैयार समाधान प्रदान करता है। हालाँकि, जब वेबसाइट या वेबपेज वह डेटा दिखाने के लिए JavaScript का उपयोग करता है जिसमें आपकी रुचि है, तो rvest पैकेज में आवश्यक कार्यक्षमता नहीं होती। एक समाधान PhantomJS का उपयोग करना है।
(R में और डेटा इम्पोर्ट करने का अभ्यास करना चाहते हैं? इस ट्यूटोरियल को आज़माएँ।)
आवश्यक पैकेज लोड करें
पहले चरण के रूप में, आपको इस विश्लेषण के लिए आवश्यक सभी पैकेजों को वर्कस्पेस में लोड करना होगा (यदि आपने ये पैकेज अभी तक अपने लोकल सिस्टम पर इंस्टॉल नहीं किए हैं, तो उन्हें उपलब्ध कराने के लिए install.packages() का उपयोग करें):
library(rvest)
library(stringr)
library(plyr)
library(dplyr)
library(ggvis)
library(knitr)
options(digits = 4)
R के साथ Javascript द्वारा जनित डेटा स्क्रैप करना
अगला चरण PhantomJS का उपयोग करके TechStars डेटा इकट्ठा करना है। निम्नलिखित बेसिक .js फ़ाइल देखें:
// scrape_techstars.js
var webPage = require('webpage');
var page = webPage.create();
var fs = require('fs');
var path = 'techstars.html'
page.open('http://www.techstars.com/companies/stats/', function (status) {
var content = page.content;
fs.write(path,content,'w')
phantom.exit();
});
यह स्क्रिप्ट मूल रूप से अंतर्निहित जावास्क्रिप्ट कोड के अपना काम करने के बाद HTML पेज को रेंडर करती है, जिससे आप सभी तालिकाओं सहित HTML पेज को प्राप्त कर सकें। इस विश्लेषण के बाकी हिस्से के लिए R में ही बने रहने के लिए, हम सुझाव देते हैं कि आप PhantomJS को चालू करने के लिए system() फ़ंक्शन का उपयोग करें (आपको PhantomJS डाउनलोड और इंस्टॉल करना होगा और इसे अपनी working directory में रखना होगा):
# phantomJS को techstars स्क्रैप करने दें, आउटपुट techstars.html में लिखा जाएगा
system("./phantomjs scrape_techstars.js")
इस छोटे से डिटूर के बाद, अंततः आपके लोकल सिस्टम पर एक HTML फ़ाइल, techstars.html, मौजूद है, जिसे rvest के साथ स्क्रैप किया जा सकता है। Techstars वेबपेज के निरीक्षण से पता चलता है कि जिन तालिकाओं में हमारी रुचि है वे css class batch वाले divs में स्थित हैं:
batches <- html("techstars.html") %>%
html_nodes(".batch")
class(batches)
[1] "XMLNodeSet"
अब आपके पास XMLNodeSet ऑब्जेक्ट्स की एक सूची है: प्रत्येक ऑब्जेक्ट में एक TechStars बैच का डेटा होता है। इनमें हम बैच के स्थान, वर्ष, मौसम (सीज़न) की जानकारी पा सकते हैं, साथ ही कंपनियों के बारे में—उनका मौजूदा मुख्यालय, वर्तमान स्थिति और उन्होंने कुल कितना फंडिंग जुटाया। नीचे दिए गए डेटा संग्रह और सफाई के चरणों पर हम विस्तार से नहीं जाएंगे; आप स्वयं कोड चला सकते हैं और देख सकते हैं कि वे क्या करते हैं। आप देखेंगे कि प्रत्येक जानकारी को अच्छी तरह से फ़ॉर्मेट करने के लिए कुछ कस्टम क्लीनिंग की जा रही है:
batch_titles <- batches %>%
html_nodes(".batch_class") %>%
html_text()
batch_season <- str_extract(batch_titles, "(Fall|Spring|Winter|Summer)")
batch_year <- str_extract(batch_titles, "([[:digit:]]{4})")
# लोकेशन जानकारी वह सब है जो बैच शीर्षक में वर्ष या सीज़न की जानकारी नहीं है
batch_location <- sub("\\s+$", "",
sub("([[:digit:]]{4})", "",
sub("(Fall|Spring|Winter|Summer)","",batch_titles)))
# बैच जानकारी के साथ डेटा फ्रेम बनाएं।
batch_info <- data.frame(location = batch_location,
year = batch_year,
season = batch_season)
breakdown <- lapply(batches, function(x) {
company_info <- x %>% html_nodes(".parent")
companies_single_batch <- lapply(company_info, function(y){
as.list(gsub("\\[\\+\\]\\[\\-\\]\\s", "", y %>%
html_nodes("td") %>%
html_text()))
})
df <- data.frame(matrix(unlist(companies_single_batch),
nrow=length(companies_single_batch),
byrow=T,
dimnames = list(NULL, c("company","funding","status","hq"))))
return(df)
})
# breakdown में बैच जानकारी जोड़ें
batch_info_extended <- batch_info[rep(seq_len(nrow(batch_info)),
sapply(breakdown, nrow)),]
breakdown_merged <- rbind.fill(breakdown)
# सभी जानकारी मर्ज करें
techstars <- tbl_df(cbind(breakdown_merged, batch_info_extended)) %>%
mutate(funding = as.numeric(gsub(",","",gsub("\\$","",funding))))
core R, rvest, plyr और dplyr फ़ंक्शंस के संयोजन के साथ, अब हमारे पास techstars डेटा फ्रेम है; सभी TechStars कंपनियों का एक डेटा सेट, जिसमें सभी सार्वजनिक रूप से उपलब्ध जानकारी साफ़-सुथरे फ़ॉर्मेट में है:
techstars
## Source: local data frame [535 x 7]
##
## company funding status hq location year season
## 1 Accountable 110000 Active Fort Worth, TX Austin 2013 Fall
## 2 Atlas 1180000 Active Austin, TX Austin 2013 Fall
## 3 Embrace 110000 Failed Austin, TX Austin 2013 Fall
## 4 Filament Labs 1490000 Active Austin, TX Austin 2013 Fall
## 5 Fosbury 300000 Active Austin, TX Austin 2013 Fall
## 6 Gone! 840000 Active San Francisco, CA Austin 2013 Fall
## 7 MarketVibe 110000 Acquired Austin, TX Austin 2013 Fall
## 8 Plum 1630000 Active Austin, TX Austin 2013 Fall
## 9 ProtoExchange 110000 Active Austin, TX Austin 2013 Fall
## 10 Testlio 1020000 Active Austin, TX Austin 2013 Fall
## .. ... ... ... ... ... ... ...
names(techstars)
## [1] "company" "funding" "status" "hq" "location" "year"
## [7] "season"
निष्कर्ष
उपरोक्त टूल्स और कोड के संयोजन का उपयोग करके, हम उस वेबसाइट से डेटा स्क्रैप करने में सफल रहे जो अपना डेटा जनरेट करने के लिए JavaScript स्क्रिप्ट का उपयोग करती है। जैसा कि देखा जा सकता है, यह एक बहुत ही संरचित प्रक्रिया है, जिसे एक बार प्रारंभिक कोड उपलब्ध होने पर आसानी से किया जा सकता है। R सीखना चाहते हैं और डेटा साइंस व R के ट्यूटोरियल और कोर्स ढूँढ रहे हैं? DataCamp देखें