Build Your First Web Scraper: A Step-by-Step Python Tutorial

Ready to move from theory to practice? In this hands-on tutorial, I’ll show you how to build a functional web scraper using Python—even if you’re new to programming. By the end, you’ll have a working scraper that extracts real data from a website.

What We’re Building Today

We’ll create a simple scraper that extracts book titles and prices from Books to Scrape—a practice website designed for learning web scraping.

What you’ll need:

  • Basic understanding of Python (if you know what a variable and a loop are, you’re ready)
  • Python installed on your computer
  • A text editor (VS Code, Sublime, or even Notepad will work)

Step 1: Setting Up Your Environment

First, let’s install the necessary libraries. Open your terminal or command prompt and run:

pip install requests beautifulsoup4

Here’s what these libraries do:

  • Requests: Fetches web pages (like typing a URL in your browser)
  • Beautiful Soup: Parses HTML and helps us find the data we want

Step 2: Understanding the Target Website

Before we write any code, we need to understand the website’s structure. Visit http://books.toscrape.com/ and right-click on a book title, then select “Inspect” or “Inspect Element.”

You’ll see the HTML structure. Notice that each book is in an article tag with class product_pod. The title is in an h3 tag, and the price is in a p tag with class price_color.

This investigation step is crucial—you can’t scrape what you don’t understand!

Step 3: Writing the Scraper Code

Create a new Python file called book_scraper.py and let’s start coding:

# Import the libraries we installed
import requests
from bs4 import BeautifulSoup

# Step 1: Send a request to the website
url = "http://books.toscrape.com/"
response = requests.get(url)

# Check if the request was successful
if response.status_code == 200:
    print("Successfully connected to the website!")
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")
    exit()

# Step 2: Parse the HTML content
soup = BeautifulSoup(response.content, 'html.parser')

# Step 3: Find all book containers
books = soup.find_all('article', class_='product_pod')

print(f"Found {len(books)} books on the page")
print("\n" + "="*50 + "\n")

# Step 4: Extract data from each book
for index, book in enumerate(books, 1):
    # Extract the title
    title_tag = book.h3.a
    title = title_tag['title']  # The title is stored in the 'title' attribute
    
    # Extract the price
    price_tag = book.find('p', class_='price_color')
    price = price_tag.text
    
    # Print the results
    print(f"Book #{index}:")
    print(f"  Title: {title}")
    print(f"  Price: {price}")
    print("-" * 30)

print("\nScraping complete!")

Step 4: Running Your Scraper

Save your file and run it from the terminal:

python book_scraper.py

If everything works correctly, you should see output like this:

Successfully connected to the website!
Found 20 books on the page

==================================================

Book #1:
  Title: A Light in the Attic
  Price: £51.77
------------------------------
Book #2:
  Title: Tipping the Velvet
  Price: £53.74
------------------------------
... and so on for all 20 books

Congratulations! You’ve just built your first working web scraper!

Step 5: Saving Data to a CSV File

Displaying data in the terminal is nice, but saving it to a file is more useful. Let’s enhance our scraper to save the data to a CSV file:

# Add this import at the top
import csv

# ... (keep all the previous code until the loop)

# Create a list to store all book data
all_books_data = []

for book in books:
    title = book.h3.a['title']
    price = book.find('p', class_='price_color').text
    
    # Remove the £ symbol and convert to float for potential calculations
    price_value = float(price.replace('£', ''))
    
    all_books_data.append({
        'title': title,
        'price': price,
        'price_value': price_value
    })

# Save to CSV file
filename = 'books_data.csv'
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['title', 'price', 'price_value']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    writer.writeheader()  # Write the column headers
    writer.writerows(all_books_data)  # Write all the book data

print(f"\nData saved to {filename}")
print(f"Total books scraped: {len(all_books_data)}")

# Bonus: Calculate average price
if all_books_data:
    total = sum(book['price_value'] for book in all_books_data)
    average = total / len(all_books_data)
    print(f"Average book price: £{average:.2f}")

Run the updated script, and you’ll get a books_data.csv file that you can open in Excel or Google Sheets!

Common Issues and Troubleshooting

Problem: “I get a 403 Forbidden error”
Solution: Some websites block basic requests. Try adding headers to mimic a browser:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)

Problem: “The data looks messy or has extra characters”
Solution: Clean the text with Python’s string methods:

title = book.h3.a['title'].strip()  # Removes extra whitespace
price = book.find('p', class_='price_color').text.strip()

Problem: “My script works but it’s very slow”
Solution: Websites appreciate slower scraping. Add a delay between requests if scraping multiple pages:

import time
time.sleep(1)  # Wait 1 second between requests

Taking It Further: Your Next Steps

Now that you have a working scraper, here’s what you can try next:

  1. Scrape multiple pages: Books to Scrape has multiple pages. Can you modify the script to scrape all of them?
  2. Extract more data: Try getting book ratings or availability information.
  3. Try a different website: Practice makes perfect. Find another simple site and try scraping it.
  4. Learn about more advanced tools: When you’re ready, explore Scrapy for larger projects or Selenium for JavaScript-heavy sites.

When to Consider Professional Help

While building your own scraper is great for learning, businesses often need:

  • Reliability: Professional services handle website changes automatically
  • Scale: Scraping thousands of pages requires robust infrastructure
  • Complex sites: Some websites have advanced anti-bot protection
  • Time savings: Sometimes it’s more cost-effective to outsource

Final Thoughts

You’ve just taken your first step into the world of web scraping! Remember these key principles:

  1. Always be ethical: Respect robots.txt and don’t overload servers
  2. Start simple: Master the basics before tackling complex sites
  3. Practice regularly: The best way to learn is by doing

Happy scraping! Remember: With great scraping power comes great responsibility. Always use your skills ethically and respect website owners.

Get Your Web Scrapers Today!

Ready to unlock the power of data?

From the blog

Insights on retail pricing strategy

🚀 Start Your Data Project

Get a Free Data Sample

See exactly what our data looks like before you commit. No credit card required, no spam — unsubscribe anytime.

  • Custom sample matching your target cuisines and cities
  • Full JSON/CSV export of live menus
  • Dedicated food data expert walkthrough
  • POC turnaround within 24 hours

Start Extracting Data Today

Tell us your requirements and get a custom quote within 2 Working Hours.