R Academy · Ders

Sayfalandırmayı ve Birden Fazla Sayfayı İşleme

Sayfalandırılmış sonuçlar üzerinde döngü kurun ve kazınmış verileri tek bir veri kümesinde birleştirin.

4. ders / 413 adım

Sayfalandırmayı ve Birden Fazla Sayfayı İşleme, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.

Sayfalandırmayı Anlama

Birçok web sitesi içeriği birden fazla sayfaya böler. URL tabanlı sayfalandırma, URL'ye bir sayfa numarası ekler (ör. ?page=2 veya /page/2/). URL'leri program aracılığıyla oluşturmak için deseni belirleyin.

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 ile URL Desenleri Oluşturma

sprintf() ve paste0() URL dizeleri oluşturur; ancak sprintf(), sıfırlarla doldurma ve biçimlendirme üzerinde daha fazla denetim sağlar. Sitenin URL yapısına uyan işlevi kullanın.

# 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() ile Birden Fazla Sayfayı Tarama

purrr::map(), bir tarama işlevini URL vektörü üzerinde uygular ve sonuçlardan oluşan bir liste döndürür. Tek bir veri çerçevesinde birleştirmek için dplyr::bind_rows() ile birlikte kullanın.

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)

Kibar Tarama: Sys.sleep()

Bir sunucuya hızlı aralıklarla istek göndermek kaba bir davranıştır ve hız sınırlamasını veya IP engellemelerini tetikleyebilir. Sunucuya saygı göstermek için istekler arasına Sys.sleep() ekleyin. Genellikle 1-2 saniyelik bir gecikme yeterlidir.

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')

Kullanıcı Aracısı Ayarlama

Açıklayıcı bir User-Agent başlığı ayarlayarak tarayıcınızı uygun biçimde tanıtın. Sunucular bunu botları tanımlamak için kullanır. İyi bir User-Agent, site sahiplerinin sizinle iletişim kurabilmesi için adınızı ve iletişim bilgilerinizi içerir.

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 Dosyasına Uygun Davranma

robots.txt, tarayıcıların hangi yolları kullanamayacağını belirtir. robotstxt paketi, tarama işleminden önce bir URL'ye izin verilip verilmediğini program aracılığıyla denetlemenizi sağlar.

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')

Sayfalandırma Bağlantılarını İzleme

URL'leri tahmin etmek yerine her sayfadaki gerçek 'Sonraki' bağlantısını izleyin. html_attr(html_element(page, 'a.next'), 'href'), sonraki sayfanın bağlantısını dinamik olarak bulur ve sıralı olmayan sayfalandırma desenlerini de işler.

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 ile session_follow_link()

rvest'in session() işlevi, çerezleri ve geçmişi koruyan durum bilgili bir tarama oturumu oluşturur. session_follow_link() bir bağlantıya gider; oturum açma gerektiren veya sayfalar arasında durumu koruyan siteler için kullanışlıdır.

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')

Son Sayfayı Belirleme

Ne zaman duracağınızı bilin: 'Sonraki' düğmesinin var olup olmadığını, geçerli sayfadaki öğe sayısının beklenenden az olup olmadığını veya sayfa numarasının bilinen toplamı aşıp aşmadığını denetleyin. Sınır durumlarını düzgün biçimde işleyin.

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')

Tarama Hatalarını İşleme

Ağ hataları, zaman aşımına uğramalar ve 404 hataları meydana gelebilir. Başarısızlıkları düzgün biçimde işlemek ve daha sonra yeniden deneyebilmek için istekleri tryCatch() içine alın ve hangi sayfaların başarısız olduğunu kaydedin.

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)

Taranan Sayfaları Önbelleğe Alma

Ayrıştırmadan önce indirilen HTML'yi diske kaydedin. Böylece ayrıştırma başarısız olursa yeniden indirme yapmanız gerekmez. Yeniden okumalar ağdan değil diskten yapılır; bu da geliştirme sırasında hem nazik hem hızlı bir yaklaşımdır.

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)

Hızlı Kontrol

Kibar ve sağlam çok sayfalı tarama konusundaki anlayışınızı test edin.

Özet: Sayfalandırma ve Kibar Tarama

Temel çıkarımlar: Sayfa URL'lerini paste0() veya sprintf() ile oluşturun. Taramayı birçok URL üzerinde uygulamak için purrr::map() kullanın. İstekler arasına her zaman Sys.sleep() ekleyin. robots.txt dosyasını robotstxt paketiyle denetleyin. 'Sonraki' bağlantılarını html_attr() veya session_follow_link() ile dinamik olarak izleyin. Eksik bir Sonraki bağlantısını denetleyerek son sayfayı belirleyin. Hatalara dayanıklılık için istekleri tryCatch() içine alın. Geliştirme sırasında HTML'yi diske önbelleğe alın.

# 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')
Başlamak ücretsiz

Yapay zeka eğitmeniyle R öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
43
Dersler
159

Sıkça Sorulan Sorular

“Sayfalandırmayı ve Birden Fazla Sayfayı İşleme” dersi ücretsiz mi?

Evet — “Sayfalandırmayı ve Birden Fazla Sayfayı İşleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.

“Sayfalandırmayı ve Birden Fazla Sayfayı İşleme” dersinde ne öğreneceğim?

Sayfalandırılmış sonuçlar üzerinde döngü kurun ve kazınmış verileri tek bir veri kümesinde birleştirin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

R Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Sayfalandırmayı ve Birden Fazla Sayfayı İşleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu R Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. HTML Yapısı ve CSS Seçicileri
  2. html_element() ve html_text() Temelleri
  3. Tabloları ve Bağlantıları Kazıma
  4. Sayfalandırmayı ve Birden Fazla Sayfayı İşleme
← R Academy Sayfasına Dön