Maak een Ruby-script om gegevens te scrapen van een website
description
Gebruikers kunnen geautomatiseerd gegevens van websites extraheren, waardoor tijd en moeite worden bespaard. Het script wordt aangepast aan hun specifieke behoeften en bevat functies voor het omgaan met veelvoorkomende scraping-uitdagingen.
prompt
try_prompt
Help me een Ruby-script schrijven dat gegevens scrapt van de volgende website: {{website_url}}. Geef aan welke gegevens ik wil extraher ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld Ruby-script dat gegevens van een e-commerce website scrapt, specifiek de productnamen. Het script ondersteunt paginering en bevat foutafhandeling:
```ruby
require 'nokogiri'
require 'httparty'
# Basis URL van de website
BASE_URL = 'https://voorbeeld.com'
# Methode om een pagina te scrapen
def scrape_page(page_number)
url = "#{BASE_URL}/pagina/#{page_number}"
begin
response = HTTParty.get(url, timeout: 10)
if response.code == 200
parse_products(response.body)
else
puts "Fout bij het ophalen van pagina #{page_number}: HTTP #{response.code}"
nil
end
rescue SocketError => e
puts "Netwerkfout bij pagina #{page_number}: #{e.message}"
nil
rescue Net::OpenTimeout, Net::ReadTimeout => e
puts "Timeout bij pagina #{page_number}: #{e.message}"
nil
rescue StandardError => e
puts "Onverwachte fout op pagina #{page_number}: #{e.message}"
nil
end
end
# Methode om productnamen te extraheren uit HTML
def parse_products(html)
doc = Nokogiri::HTML(html)
product_names = []
# Pas deze selector aan op basis van de daadwerkelijke HTML-structuur
# Bijvoorbeeld: alle producttitels bevinden zich in <h2 class="product-title">
doc.css('h2.product-title').each do |product|
product_names << product.text.strip
end
product_names
end
# Paginering
page_number = 1
loop do
puts "Scrapen van pagina #{page_number}..."
product_names = scrape_page(page_number)
break if product_names.nil? || product_names.empty?
product_names.each do |name|
puts "Product: #{name}"
end
# Voorbeeld: stop na 10 pagina's of pas het aan naar behoefte
break if page_number >= 10
page_number += 1
end
puts "Scraping voltooid."
```
**Toelichting:**
- Het script gebruikt `HTTParty` voor HTTP-verzoeken en `Nokogiri` voor HTML-parsing.
- Pas de CSS-selector `'h2.product-title'` aan afhankelijk van de daadwerkelijke structuur van de website.
- Het script gaat door tot pagina 10, maar je kunt dat aanpassen of dynamisch maken door te stoppen bij een lege pagina.
- Foutafhandeling is opgenomen voor netwerkproblemen, timeouts en andere onverwachte fouten.
Zorg dat je de benodigde gems hebt geïnstalleerd:
```bash
gem install nokogiri httparty
```
**Let op:** Controleer altijd de robots.txt en de gebruiksvoorwaarden van de website voordat je gaat scrapen.
provider: deepseek
model: deepseek-chat
Hier is een Ruby-script dat productnamen van een e-commerce website scrapet met paginering en foutafhandeling:
```ruby
require 'nokogiri'
require 'open-uri'
require 'csv'
class EcommerceScraper
BASE_URL = 'https://voorbeeld.com'
def initialize
@product_names = []
end
def scrape_products
page_number = 1
while true
begin
puts "Bezig met scrapen van pagina #{page_number}..."
# Bouw de URL voor de huidige pagina
url = page_number == 1 ? BASE_URL : "#{BASE_URL}?page=#{page_number}"
# Open de webpagina met timeout
html = URI.open(url,
read_timeout: 10,
open_timeout: 10,
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
).read
# Parse de HTML
doc = Nokogiri::HTML(html)
# Zoek naar productnamen - PAS DIT SELECTOR AAN OP BASIS VAN DE WERKELIJKE WEBSITE
product_elements = doc.css('.product-name, .title, h3') # Voorbeeld selectors
if product_elements.empty?
puts "Geen producten gevonden op pagina #{page_number}. Einde van paginering."
break
end
# Extraheer productnamen
products_on_page = product_elements.map do |element|
element.text.strip
end.compact.reject(&:empty?)
if products_on_page.empty?
puts "Geen productnamen gevonden op pagina #{page_number}"
break
end
@product_names.concat(products_on_page)
puts "Gevonden #{products_on_page.size} producten op pagina #{page_number}"
# Controleer of er een volgende pagina is
next_page_link = doc.css('a.next, a[rel="next"], .pagination .next').first
break unless next_page_link
page_number += 1
# Voorkom oneindige loops
if page_number > 50
puts "Maximum aantal pagina's (50) bereikt"
break
end
# Korte pauze om de server niet te overbelasten
sleep(1)
rescue OpenURI::HTTPError => e
puts "HTTP Fout: #{e.message}"
break
rescue Net::ReadTimeout => e
puts "Timeout fout: #{e.message}"
break
rescue SocketError => e
puts "Netwerk fout: #{e.message}"
break
rescue StandardError => e
puts "Onverwachte fout: #{e.message}"
break
end
end
save_to_csv
display_results
end
def save_to_csv
return if @product_names.empty?
CSV.open('product_namen.csv', 'w') do |csv|
csv << ['Productnaam']
@product_names.each do |name|
csv << [name]
end
end
puts "Productnamen opgeslagen in product_namen.csv"
end
def display_results
if @product_names.any?
puts "\n=== GESCRAPTE PRODUCTNAMEN ==="
@product_names.each_with_index do |name, index|
puts "#{index + 1}. #{name}"
end
puts "\nTotaal aantal producten: #{@product_names.size}"
else
puts "Geen productnamen gevonden"
end
end
end
# Gebruik de scraper
begin
scraper = EcommerceScraper.new
scraper.scrape_products
rescue => e
puts "Fout tijdens uitvoering: #{e.message}"
end
```
**Belangrijke aanpassingen die je moet maken:**
1. **CSS Selectors**: Pas de selectors in `doc.css('.product-name, .title, h3')` aan op basis van de werkelijke HTML-structuur van de website.
2. **Paginering**: Controleer hoe de paginering werkt op de website en pas de URL-constructie en volgende-pagina detectie aan.
3. **Installatie benodigde gems**:
```bash
gem install nokogiri
```
**Kenmerken van dit script:**
- ✅ **Paginering**: Houdt automatisch meerdere pagina's bij
- ✅ **Foutafhandeling**: Behandelt timeouts, HTTP-fouten en netwerkproblemen
- ✅ **Rate limiting**: Pauzeert tussen requests
- ✅ **CSV export**: Slaat resultaten op in een bestand
- ✅ **Timeout bescherming**: Voorkomt hangende requests
- ✅ **User-Agent**: Gebruikt een realistische browser-identiteit
**Let op**: Controleer altijd de `robots.txt` van de website en respecteer de servicevoorwaarden. Sommige websites staan scraping niet toe.

