I'm a phone reviewer - these are the 5 early Prime Day phone deals I'd recommend
Back to Tutorials
techTutorialintermediate

I'm a phone reviewer - these are the 5 early Prime Day phone deals I'd recommend

June 2, 20266 views6 min read

Learn to build a web scraper that extracts and analyzes Amazon Prime Day phone deals, ranking them by discount percentage to identify the best offers.

Introduction

In this tutorial, you'll learn how to programmatically scrape and analyze phone deal data from Amazon Prime Day using Python. This skill is valuable for phone reviewers, price comparison tools, and anyone interested in tracking tech deals. We'll build a web scraper that extracts phone deal information from Amazon's Prime Day page and analyzes the data to identify the best deals.

Prerequisites

  • Python 3.7 or higher installed on your system
  • Basic understanding of Python programming concepts
  • Knowledge of web scraping concepts and HTML structure
  • Required Python libraries: requests, BeautifulSoup, pandas, and lxml

Step-by-step instructions

1. Setting up Your Development Environment

1.1 Install Required Libraries

First, we need to install the necessary Python libraries for web scraping and data analysis. Open your terminal or command prompt and run:

pip install requests beautifulsoup4 pandas lxml

This command installs all the required packages for our phone deal scraper. Requests handles HTTP requests, BeautifulSoup parses HTML content, pandas manages our data analysis, and lxml is a fast XML parser used by BeautifulSoup.

1.2 Create Project Structure

Create a new directory for your project and set up the following files:

  • phone_deal_scraper.py - Main scraping script
  • deal_analyzer.py - Data analysis module
  • prime_day_data.json - Output file for scraped data

2. Building the Web Scraper

2.1 Initialize the Scraper Script

Start by creating the main scraping script that will fetch and parse Amazon Prime Day phone deals:

import requests
from bs4 import BeautifulSoup
import json
import time

# Set headers to mimic a real browser
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
}

def scrape_prime_day_deals(url):
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        soup = BeautifulSoup(response.content, 'lxml')
        return soup
    except requests.RequestException as e:
        print(f"Error fetching page: {e}")
        return None

The headers are crucial for avoiding being blocked by Amazon's anti-bot measures. We're mimicking a real browser to appear legitimate to the server.

2.2 Extract Phone Deal Information

Now, add the function to extract specific phone deal details:

def extract_phone_deals(soup):
    deals = []
    # This selector targets phone product items on Amazon
    phone_items = soup.find_all('div', {'data-component-type': 's-search-result'})
    
    for item in phone_items:
        try:
            # Extract product title
            title_element = item.find('h2', class_='a-size-mini a-spacing-none a-color-base s-line-clamp-2')
            title = title_element.get_text(strip=True) if title_element else 'N/A'
            
            # Extract current price
            price_element = item.find('span', class_='a-price-whole')
            price = price_element.get_text(strip=True) if price_element else 'N/A'
            
            # Extract original price
            original_price_element = item.find('span', class_='a-price a-text-price')
            original_price = original_price_element.get_text(strip=True) if original_price_element else 'N/A'
            
            # Extract discount percentage
            discount_element = item.find('span', class_='a-size-small a-color-success')
            discount = discount_element.get_text(strip=True) if discount_element else 'N/A'
            
            # Extract product URL
            link_element = item.find('a', class_='a-link-normal s-no-outline')
            link = 'https://www.amazon.com' + link_element['href'] if link_element else 'N/A'
            
            deal = {
                'title': title,
                'current_price': price,
                'original_price': original_price,
                'discount': discount,
                'url': link
            }
            deals.append(deal)
            
        except Exception as e:
            print(f"Error extracting deal data: {e}")
            continue
    
    return deals

This function searches for specific HTML elements that contain phone deal information. We're targeting Amazon's structured search result format to extract product details reliably.

2.3 Main Execution Flow

Complete your scraper with the main execution logic:

def main():
    # Replace with actual Prime Day URL
    url = 'https://www.amazon.com/s?k=phone+deals&i=electronics&rh=n%3A172282%2Cn%3A661250011&ref=nb_sb_noss_2'
    
    print("Starting Prime Day phone deal scraping...")
    soup = scrape_prime_day_deals(url)
    
    if soup:
        deals = extract_phone_deals(soup)
        
        # Save to JSON file
        with open('prime_day_data.json', 'w') as f:
            json.dump(deals, f, indent=2)
        
        print(f"Successfully scraped {len(deals)} deals")
        return deals
    else:
        print("Failed to scrape deals")
        return []

if __name__ == '__main__':
    main()

This main function orchestrates the scraping process and saves the results to a JSON file for further analysis.

3. Data Analysis and Deal Ranking

3.1 Create Analysis Module

Develop a separate module to analyze the scraped data and rank deals:

import pandas as pd
import json
from datetime import datetime

def analyze_deals(filename='prime_day_data.json'):
    # Load scraped data
    with open(filename, 'r') as f:
        deals = json.load(f)
    
    # Convert to DataFrame
    df = pd.DataFrame(deals)
    
    # Clean price data
    df['current_price_numeric'] = df['current_price'].str.replace('$', '').str.replace(',', '').astype(float)
    df['original_price_numeric'] = df['original_price'].str.replace('$', '').str.replace(',', '').astype(float)
    
    # Calculate savings
    df['savings'] = df['original_price_numeric'] - df['current_price_numeric']
    
    # Calculate discount percentage
    df['discount_percentage'] = (df['savings'] / df['original_price_numeric']) * 100
    
    # Sort by discount percentage
    df_sorted = df.sort_values('discount_percentage', ascending=False)
    
    # Display top 5 deals
    top_deals = df_sorted.head(5)
    
    print("Top 5 Prime Day Phone Deals:")
    print(top_deals[['title', 'current_price', 'discount_percentage', 'savings']])
    
    return top_deals

This analysis module converts the raw scraped data into a structured format using pandas, making it easier to calculate savings and rank deals by discount percentage.

3.2 Integrate Analysis with Scraper

Update your main script to include analysis:

from deal_analyzer import analyze_deals

# ... existing code ...

def main():
    # ... existing scraping code ...
    
    if soup:
        deals = extract_phone_deals(soup)
        
        # Save to JSON file
        with open('prime_day_data.json', 'w') as f:
            json.dump(deals, f, indent=2)
        
        print(f"Successfully scraped {len(deals)} deals")
        
        # Analyze deals
        top_deals = analyze_deals()
        
        return deals
    else:
        print("Failed to scrape deals")
        return []

The integration allows you to both scrape and analyze deals in a single execution, providing immediate insights into the best offers.

4. Running and Testing Your Scraper

4.1 Execute the Scraper

Run your scraper with:

python phone_deal_scraper.py

This command executes your web scraping script, which will fetch Amazon Prime Day phone deals and save them to a JSON file.

4.2 Review Results

After execution, examine the generated JSON file and console output. The analysis module will display the top 5 deals ranked by discount percentage, helping you identify the most attractive offers.

5. Enhancing Your Scraper

5.1 Add Error Handling

Improve your scraper's robustness by adding comprehensive error handling:

# Add to your scraping function
try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()
    response.encoding = 'utf-8'
    soup = BeautifulSoup(response.content, 'lxml')
    return soup
except requests.Timeout:
    print("Request timed out")
    return None
except requests.RequestException as e:
    print(f"HTTP request failed: {e}")
    return None

Timeout handling prevents your script from hanging indefinitely on slow connections.

5.2 Add Rate Limiting

Implement delays between requests to avoid overwhelming Amazon's servers:

import time

# Add this after each request
# Wait 1-2 seconds between requests
time.sleep(1 + random.random())

Rate limiting respects web server resources and helps prevent your IP from being temporarily blocked.

Summary

This tutorial demonstrated how to build a web scraper that extracts and analyzes Amazon Prime Day phone deals. You learned to scrape product information using requests and BeautifulSoup, clean and analyze the data with pandas, and create a ranking system based on discount percentages. This skill is valuable for phone reviewers, price comparison tools, and anyone interested in tracking tech deals. The scraper can be extended to include additional features like email notifications for specific deals or integration with price tracking services.

Source: ZDNet AI

Related Articles