पृष्ठांकन और अनेक पेज संभालना
पृष्ठांकित परिणामों पर लूप चलाएँ और स्क्रैप किए गए डेटा को एक डेटासेट में मिलाएँ।
पृष्ठांकन और अनेक पेज संभालना, CoddyKit पर R Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह R Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
पृष्ठांकन को समझना
कई वेबसाइटें सामग्री को अनेक पृष्ठों में बाँटती हैं। URL-आधारित पृष्ठांकन में URL के अंत में पृष्ठ संख्या जोड़ी जाती है (जैसे, ?page=2 या /page/2/)। URL प्रोग्राम के माध्यम से बनाने के लिए इस प्रतिरूप की पहचान कीजिए।
library(rvest)
# Common URL pagination patterns:
# Pattern 1: query parameter
# https://site.com/products?page=1
# https://site.com/products?page=2
# Pattern 2: path segment
# https://site.com/products/page/1/
# https://site.com/products/page/2/
# Build URLs for pages 1 to 5
base_url <- 'https://books.toscrape.com/catalogue/page-'
page_urls <- paste0(base_url, 1:5, '.html')
page_urls
# [1] 'https://books.toscrape.com/catalogue/page-1.html'
# [2] 'https://books.toscrape.com/catalogue/page-2.html' ...sprintf से URL प्रतिरूप बनाना
sprintf() और paste0() दोनों URL स्ट्रिंग बनाते हैं, लेकिन शून्य भरने और फ़ॉर्मैटिंग पर sprintf() अधिक नियंत्रण देता है। वेबसाइट की URL संरचना के अनुरूप किसी भी फ़ंक्शन का उपयोग कीजिए।
# Various URL building approaches
# paste0 for simple concatenation
pages <- 1:5
urls_v1 <- paste0('https://site.com/list?p=', pages)
urls_v1[1] # 'https://site.com/list?p=1'
# sprintf for formatted strings
urls_v2 <- sprintf('https://site.com/page/%02d/', pages)
urls_v2[1] # 'https://site.com/page/01/'
# With multiple parameters
urls_v3 <- sprintf('https://site.com/items?page=%d&size=20', pages)
urls_v3[3] # 'https://site.com/items?page=3&size=20'
# glue package alternative
# glue('https://site.com/page/{pages}')map() से कई पृष्ठ स्क्रैप करना
purrr::map() URL के एक सदिश पर स्क्रैपिंग फ़ंक्शन लागू करता है और परिणामों की सूची लौटाता है। एक डेटा फ़्रेम में विलय करने के लिए इसे dplyr::bind_rows() के साथ मिलाकर उपयोग कीजिए।
library(rvest)
library(purrr)
# Define a function to scrape one page
scrape_page <- function(url) {
# In real code: page <- read_html(url)
# Here we simulate with local HTML
page <- read_html(sprintf(
'<ul><li class="item">Item %d-A</li><li class="item">Item %d-B</li></ul>',
url, url
))
data.frame(
title = html_text2(html_elements(page, '.item')),
page = url
)
}
# Apply over pages 1 and 2 (simulated with numbers)
results <- map(1:2, scrape_page)
do.call(rbind, results)शिष्ट स्क्रैपिंग: Sys.sleep()
सर्वर को तेज़ी से अनुरोध भेजना अशिष्ट है और इससे अनुरोध-दर सीमित हो सकती है या IP प्रतिबंधित हो सकता है। सर्वर का सम्मान करने के लिए अनुरोधों के बीच Sys.sleep() जोड़िए। सामान्यतः 1–2 सेकंड की देरी पर्याप्त होती है।
library(rvest)
# Polite scraping with delays between requests
scrape_with_delay <- function(urls, delay = 1.5) {
results <- vector('list', length(urls))
for (i in seq_along(urls)) {
cat(sprintf('Scraping page %d of %d\n', i, length(urls)))
# results[[i]] <- read_html(urls[[i]])
Sys.sleep(delay) # Wait before next request
}
results
}
# Also: randomize delay to appear more human-like
random_delay <- function(min = 1, max = 3) {
Sys.sleep(runif(1, min = min, max = max))
}
random_delay()
cat('Always be polite to servers you scrape')उपयोगकर्ता एजेंट निर्धारित करना
वर्णनात्मक User-Agent हेडर निर्धारित करके अपने स्क्रैपर की विनम्रता से पहचान कराइए। सर्वर इसका उपयोग बॉट की पहचान करने के लिए करते हैं। अच्छे User-Agent में आपका नाम और संपर्क जानकारी होनी चाहिए, ताकि साइट के स्वामी आपसे संपर्क कर सकें।
library(rvest)
# Default user agent reveals R/rvest
# Better: set a descriptive, honest UA
ua <- paste0(
'MyResearchBot/1.0 ',
'(Academic research; ',
'contact: researcher@university.edu)'
)
# With httr/httr2 for UA control:
# library(httr2)
# response <- request(url) |>
# req_headers('User-Agent' = ua) |>
# req_perform()
# html <- read_html(resp_body_string(response))
# Or use polite package for full compliance:
# library(polite)
# session <- bow('https://example.com', user_agent = ua)
cat('Honest UA: better for everyone')robots.txt का सम्मान करना
robots.txt क्रॉलर को बताता है कि कौन-से पथ प्रतिबंधित हैं। robotstxt पैकेज की सहायता से आप स्क्रैपिंग से पहले प्रोग्राम के माध्यम से जाँच सकते हैं कि कोई URL अनुमत है या नहीं।
library(rvest)
# library(robotstxt) # uncomment to use
# Check if scraping is allowed:
# rtxt <- robotstxt(domain = 'books.toscrape.com')
# rtxt$check(paths = '/catalogue/', bot = '*')
# TRUE means allowed
# Robots.txt typically looks like:
# User-agent: *
# Disallow: /admin/
# Disallow: /private/
# Allow: /catalogue/
# Crawl-delay: 2
# The polite package combines UA + robots.txt + delays:
# library(polite)
# session <- bow('https://books.toscrape.com')
# page <- scrape(session)
cat('Always check robots.txt before large-scale scraping')पृष्ठांकन लिंक का अनुसरण करना
URL का अनुमान लगाने के बजाय, प्रत्येक पृष्ठ पर दिए गए वास्तविक 'Next' लिंक का अनुसरण कीजिए। html_attr(html_element(page, 'a.next'), 'href') अगले पृष्ठ का लिंक गतिशील रूप से खोजता है और गैर-क्रमिक पृष्ठांकन प्रतिरूपों को संभालता है।
library(rvest)
# Pattern: follow 'next' links dynamically
scrape_all_pages <- function(start_url, max_pages = 10) {
all_data <- list()
url <- start_url
i <- 1
while (!is.null(url) && i <= max_pages) {
# page <- read_html(url)
# data <- extract_data(page)
# all_data[[i]] <- data
# next_link <- html_attr(html_element(page, 'li.next a'), 'href')
# url <- if (!is.na(next_link)) xml2::url_absolute(next_link, url)
# else NULL
cat(sprintf('Would scrape page %d: %s\n', i, url))
url <- NULL # Stop in this demo
i <- i + 1
}
do.call(rbind, all_data)
}
scrape_all_pages('https://books.toscrape.com')rvest के साथ session_follow_link()
rvest का session() एक स्थिति-संरक्षण करने वाला ब्राउज़िंग सत्र बनाता है, जो कुकी और इतिहास बनाए रखता है। session_follow_link() किसी लिंक पर जाता है—यह लॉगिन की आवश्यकता वाली या पृष्ठों के बीच स्थिति बनाए रखने वाली वेबसाइटों के लिए उपयोगी है।
library(rvest)
# Stateful session with rvest
# s <- session('https://example.com/login')
# s <- session_submit(s,
# html_form(read_html(s))[[1]],
# list(username='me', password='pw')
# )
# After login, navigate:
# page2 <- session_follow_link(s, 'Products')
# page3 <- session_back(page2) # go back
# session_history(page2) # show history
# For simple cases, follow href directly:
# href <- html_attr(html_element(page, 'a.next'), 'href')
# next_page <- session_jump_to(s, href)
cat('session() maintains cookies across requests')अंतिम पृष्ठ का पता लगाना
रुकने का समय पहचानिए: जाँचिए कि 'Next' बटन मौजूद है या नहीं, वर्तमान पृष्ठ पर मौजूद वस्तुओं की संख्या अपेक्षित संख्या से कम है या नहीं, अथवा पृष्ठ संख्या ज्ञात कुल संख्या से अधिक हो गई है या नहीं। विशेष स्थितियों को सहजता से संभालिए।
library(rvest)
# Strategy 1: Check if 'Next' link exists
has_next <- function(page) {
next_link <- html_element(page, 'li.next a')
!is.na(html_attr(next_link, 'href'))
}
# Strategy 2: Compare item count to expected page size
page_size <- 20
check_done <- function(items_on_page) {
items_on_page < page_size
}
# Strategy 3: Read total from pagination text
# e.g., 'Page 1 of 50' -> extract 50
extract_total_pages <- function(page) {
text <- html_text2(html_element(page, '.current'))
as.integer(gsub('.*of (\\d+).*', '\\1', text))
}
cat('Always plan your stopping condition')स्क्रैपिंग त्रुटियों को संभालना
नेटवर्क त्रुटियाँ, समय-सीमा समाप्त होना और 404 जैसी स्थितियाँ आएँगी। विफलताओं को सहजता से संभालने और कौन-से पृष्ठ विफल हुए, इसका अभिलेख रखने के लिए अनुरोधों को tryCatch() में लपेटिए, ताकि बाद में उन्हें फिर से आज़माया जा सके।
library(rvest)
safe_scrape <- function(url) {
tryCatch({
# page <- read_html(url)
# data <- extract_data(page)
# return(data)
cat(sprintf('Scraping: %s\n', url))
data.frame(url = url, status = 'ok')
}, error = function(e) {
cat(sprintf('FAILED: %s -> %s\n', url, e$message))
data.frame(url = url, status = 'error')
})
}
urls <- c('https://example.com/page/1',
'https://example.com/page/2')
results <- lapply(urls, safe_scrape)
do.call(rbind, results)स्क्रैप किए गए पृष्ठों को कैश करना
पार्स करने से पहले डाउनलोड किए गए HTML को डिस्क पर सहेजिए। इस तरह, यदि पार्सिंग विफल हो जाए, तो आपको उसे दोबारा डाउनलोड नहीं करना पड़ेगा। दोबारा पढ़ने की प्रक्रिया नेटवर्क के बजाय डिस्क से होगी—विकास के दौरान यह विनम्र और तेज़ तरीका है।
library(rvest)
scrape_cached <- function(url, cache_dir = 'cache') {
dir.create(cache_dir, showWarnings = FALSE)
# Create a filename from URL hash
fname <- file.path(cache_dir,
paste0(digest::digest(url), '.html'))
if (file.exists(fname)) {
cat('Loading from cache\n')
return(read_html(fname))
}
cat('Downloading...\n')
# page <- read_html(url)
# xml2::write_html(page, fname)
# return(page)
cat('Cached to:', fname, '\n')
}
# Without digest: use URLencode or gsub
url <- 'https://example.com/page/1'
fname <- gsub('[^a-z0-9]', '_', tolower(url))
cat(fname)त्वरित जाँच
विनम्र और सुदृढ़ बहु-पृष्ठ स्क्रैपिंग की अपनी समझ जाँचिए।
पुनरावलोकन: पृष्ठांकन और शिष्ट स्क्रैपिंग
मुख्य बातें: paste0() या sprintf() से पृष्ठ URL बनाइए। अनेक URL पर स्क्रैपिंग लागू करने के लिए purrr::map() का उपयोग कीजिए। अनुरोधों के बीच हमेशा Sys.sleep() जोड़िए। robotstxt पैकेज से robots.txt की जाँच कीजिए। html_attr() या session_follow_link() से 'Next' लिंक का गतिशील रूप से अनुसरण कीजिए। Next लिंक न मिलने की जाँच करके अंतिम पृष्ठ का पता लगाइए। त्रुटियों से बेहतर ढंग से निपटने के लिए अनुरोधों को tryCatch() में लपेटिए। विकास के दौरान HTML को डिस्क पर कैश कीजिए।
# Multi-page scraping template:
# urls <- paste0(base, 1:n_pages)
# results <- purrr::map(urls, function(url) {
# Sys.sleep(runif(1, 1, 2)) # polite delay
# page <- read_html(url)
# extract_data(page) # your parser
# })
# df <- dplyr::bind_rows(results)
# Key principles:
# 1. Respect robots.txt
# 2. Add delays (Sys.sleep)
# 3. Set honest User-Agent
# 4. Cache HTML during development
# 5. Handle errors with tryCatch
cat('Polite scraping = sustainable scraping')एआई शिक्षक के साथ R सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 43
- पाठ
- 159
अक्सर पूछे जाने वाले प्रश्न
क्या “पृष्ठांकन और अनेक पेज संभालना” पाठ निःशुल्क है?
हाँ — R Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “पृष्ठांकन और अनेक पेज संभालना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“पृष्ठांकन और अनेक पेज संभालना” में मैं क्या सीखूँगा?
पृष्ठांकित परिणामों पर लूप चलाएँ और स्क्रैप किए गए डेटा को एक डेटासेट में मिलाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ R Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या R Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर R Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“पृष्ठांकन और अनेक पेज संभालना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस R Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर R Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- HTML संरचना और CSS चयनकर्ता
- html_element() और html_text() की मूल बातें
- तालिकाएँ और लिंक स्क्रैप करना
- पृष्ठांकन और अनेक पेज संभालना