WebshareMain Website
Web Scraping
Python

Updated on

October 5, 2026

How to Scrape eBay: Listings, Reviews & Product Data

ebay_scraping

eBay contains a large amount of marketplace data, including product listings, prices, seller information, availability, and reviews. You can collect this information programmatically, but larger scraping projects require careful request handling, page parsing, and infrastructure planning.

This guide covers what eBay data you can scrape, legal factors to consider before using an eBay scraper, and steps to build a scraping workflow. You’ll also learn how to scrape eBay listings and reviews, and scale with proxies.

Disclaimer: This guide is informational and not legal advice, so review eBay's current terms, robots directives, applicable laws, and your intended use of the data before starting any scraping project. Also, the selectors and page structures in this guide reflect how eBay's pages looked in September 2026. eBay can change its markup at any time, so treat the code as a practical walkthrough rather than something guaranteed to work as written, and inspect the live page before relying on any selector.

TL;DR

  • eBay scraping involves requesting publicly accessible pages and extracting structured information from the HTML or rendered page.
  • Common data points include titles, prices, seller details, ratings, availability, and reviews.
  • Start by identifying the URLs and fields you need, inspect the page structure, send requests, parse the response, and store the extracted data.
  • Larger scraping workloads may run into rate limits, IP restrictions, or dynamic content.
  • Proxy infrastructure can help distribute requests and support location-specific data collection.
  • Always review eBay's current terms, robots directives, applicable laws, and your intended use of the data.

Scraping eBay may be legal in some circumstances, but public access to a page does not automatically mean you have permission to scrape or reuse its data. The legal position depends on what data you collect, whether it’s publicly accessible, and how you collect and use it. Your jurisdiction and the laws that apply to your project matter too.

eBay's User Agreement prohibits using scrapers, spiders, data-mining tools, data-gathering or extraction tools, and other automated means to access its services without prior express permission. It also prohibits bypassing technical measures and placing an unreasonable or disproportionately large load on its infrastructure.

eBay's robots.txt lays out its own rules for automated access.

  • Automated access to eBay's site isn't allowed without eBay's direct permission, with a narrow exception for search engines indexing publicly available pages.
  • Checkout is reserved for human users, so automated tools, including buy-for-me agents and LLM-driven bots, can't place orders without human review.
  • Using automated agents to complete a checkout without authorization can lead to legal action under the User Agreement.
  • Businesses that want approved automated access need to use eBay's official API under its API License Agreement. Certain APIs (e.g market trends, pricing) may require special approval and carry extra constraints.

An allowed URL in robots.txt doesn't override the User Agreement, so both sets of rules apply together.

Privacy and data-protection rules, intellectual property rights, and other contractual restrictions may also apply. Don’t bypass authentication, CAPTCHAs, access controls, or restricted areas, and review the user agreement and the laws that apply to your project before scraping.

Why Scrape eBay?

With 136 million active worldwide buyers as of June 2026, roughly 2.6 billion live listings, and a presence in more than 190 markets, eBay contains a large amount of marketplace data that can be useful for businesses and researchers.

A few common reasons to scrape eBay data include:

  • Price monitoring: Track product prices, shipping costs, and listing changes over time to monitor market prices and pricing patterns.
  • Competitive research: Compare listings, sellers, pricing, product positioning, and marketplace activity to understand competitors and market trends.
  • Product research: Analyze listings across categories to identify products, pricing patterns, and other marketplace signals.
  • Inventory monitoring: Track product availability and listing changes to see when products are added, removed, or become unavailable.
  • Seller research: Collect seller ratings, feedback, pricing, inventory, and listing volume to study seller activity.
  • Review analysis: Collect available review data to analyze customer feedback, identify recurring themes, and support product research or sentiment analysis.

For larger collection jobs, web scraping proxies like Webshare's can support these workflows by distributing requests across multiple IPs and supporting location-specific data collection.

What Information Can You Gather from Scraping eBay?

The data you can collect depends on the type of eBay page you are working with and what information that page exposes.

Below, we highlight some of the information you can retrieve from scraping eBay:

Data Type Examples
Product information Title, item ID, category, condition
Pricing Current price, previous price, shipping cost
Seller information Seller name, rating, feedback count
Listing information Availability, location, delivery information
Product attributes Brand, model, specifications
Reviews Rating, review text, date
Marketplace signals Number sold, watchers, availability where visible

The information available varies by page type and structure. For example, individual listings provide seller feedback, while product catalog pages contain product reviews.

Challenges With Scraping eBay

eBay product scraping comes with a few practical challenges. Below are some of the issues to account for when building and maintaining a scraper.

Dynamic Page Content

Some content may load separately from the initial HTML, so a basic HTTP request may not always contain every field you need. In the eBay pages we tested, the core listing and review data was available in the initial HTML, but some content, such as a seller's description, was loaded separately in an iframe.

Changing HTML Structure

eBay uses different HTML structures across its page types. Search results use s-card elements, individual listings use x-item-* elements and structured data, and review pages use different markup again. A selector that works on one page type may therefore return nothing on another.

Rate Limits and Request Volume

As the number of requests increases, your scraper has more to manage. Large numbers of requests can lead to unreliable responses, and eBay prohibits automated access to its services without prior express permission and prohibits placing an unreasonable or disproportionately large load on its infrastructure.

Geographic Differences

eBay’s returned data can vary depending on the location associated with the request. Shipping costs and delivery estimates change based on the destination, and product prices can be displayed in different currencies.

If you compare results across regions, keep the request location consistent, so any differences reflect the listings themselves.

Bot-Detection Systems

Automated requests to eBay can return a non-2xx response instead of the content you requested. A search page request, for example, can come back with a 403 status code rather than the search results, whether you’re using a plain HTTP client or a headless browser like Playwright.

If you see these responses, slow your request rate, validate each response, and check whether eBay's official API covers the data you need. Proxies can help distribute legitimate request volume, but they aren't a way around eBay's access controls.

Data Quality

Listing information comes from different sellers, so fields may be missing or formatted differently from one listing to another. Your scraper should account for those differences instead of assuming every listing uses the same structure.

For larger workloads, proxy infrastructure can help distribute requests across multiple IPs and support location-specific collection.

How to Scrape eBay Step by Step

A practical eBay scraping workflow starts with deciding what you need and identifying where that information appears. From there, you can request the relevant pages, parse the data, store it, and add request management as the project grows.

1. Define the data you need

Decide which fields you actually want to collect before you start scraping. Depending on your project, that might include listing titles, prices, seller information, product IDs, ratings, reviews, or availability.

Only collect the fields you need. This keeps your scraper simpler and avoids making unnecessary requests.

2. Identify the eBay pages to scrape

Choose the page type that contains the information you need. You might work with search results, category pages, individual listings, or product review pages.

The page type affects how you extract the data. A search results page can give you listing IDs and basic details, while an individual listing or product page can provide more information.

3. Inspect the page structure

Open the page source and find the elements that contain the fields you want. Look for selectors and attributes that are tied to the data rather than relying on older examples from other tutorials.

For example, eBay's current search results use s-card for listing cards. The real listing cards can be selected with ul.srp-results > li.s-card[data-listingid], with titles in .s-card__title, prices in .s-card__price, and conditions in .s-card__subtitle.

Also check whether the data appears in the initial HTML or loads later in the browser. That determines whether a standard HTTP request is enough for the page you're working with.

4. Send the request

Use an HTTP client such as Python's Requests library to fetch the page. Set a timeout and check the response before trying to parse it. Requests recommends setting a timeout for external requests and provides raise_for_status() for handling unsuccessful HTTP responses.

Here's a basic request with a timeout and a status check:

import requests

url = "YOUR_EBAY_PAGE_URL"

response = requests.get(url, timeout=30)
response.raise_for_status()

html = response.text

A successful HTTP status doesn’t necessarily mean you've received the page content you expected. During testing, eBay returned a browser-check page for one search request, so your scraper should validate the response before passing it to the parser.

5. Parse the response

Pass the HTML to a parser such as BeautifulSoup or lxml, then extract only the fields you defined earlier. Beautiful Soup supports CSS selectors through select() and select_one(), making it straightforward to target specific elements.

For the current eBay search page, you can use the verified card selector and fields:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "lxml")

for card in soup.select("ul.srp-results > li.s-card[data-listingid]"):
    title = card.select_one(".s-card__title")
    price = card.select_one(".s-card__price")
    condition = card.select_one(".s-card__subtitle")
    item_id = card["data-listingid"]

    # Skip cards that are missing a title or price
    if not title or not price:
        continue

    print(item_id, title.get_text(" ", strip=True), price.get_text(strip=True))

Current eBay markup differs between page types, so don't reuse selectors from one page on another. For example, the individual listing page and product review pages use different structures.

6. Store the data

Save your results as CSV, JSON, or in a database, depending on how you plan to use them. Keep values such as dates, prices, and IDs in consistent formats so you can compare records later.

Use the eBay item ID as a stable identifier for listing data. For product reviews, use the review ID to prevent the same review from being stored more than once.

7. Add request management

Once you're making more requests, add controls around the collection process. Limit how quickly you send requests, handle failed responses, and retry temporary errors when appropriate.

You should also monitor parsing failures. If your scraper suddenly finds zero listing cards on a page, the response may have changed, or you may have received something other than the expected eBay page.

8. Add proxy infrastructure for larger workloads

As the workload grows, proxy infrastructure can help distribute requests across multiple IPs and support location-specific collection. This can also reduce your dependence on a single source IP when you're running larger scraping jobs.

Webshare offers proxy servers (datacenter), static residential proxies, and rotating residential proxies, plus a rotating proxy endpoint that works across them. Choose the setup based on your request volume and whether your project needs geographic targeting or IP rotation. For more guidance on choosing a proxy specifically for eBay, see our eBay proxy guide.

Ready to build your eBay scraping proxy setup? See how Webshare stacks up.

How to Scrape eBay Listings

Here’s an overview of the steps to follow for scraping eBay listings:

1. Start with eBay search or category results

Start with the eBay search or category pages that contain the products you want to collect. On the current search results page, listing cards are grouped inside ul.srp-results, with each real listing using li.s-card[data-listingid].

2. Extract listing URLs or item IDs

Use the data-listingid attribute to capture the eBay item ID for each listing. You can then build a clean listing URL in the format https://www.ebay.com/itm/{item_id} instead of carrying over the tracking parameters from the search result link.

3. Visit individual listing pages

Open an individual listing page when you need information that the search results don't provide. The listing page exposes fields such as the title, price, condition, seller, shipping information, and item specifics in its HTML and structured data.

4. Extract the listing details

On the current listing page, you can extract fields such as:

  • Title: h1.x-item-title__mainTitle
  • Price: .x-price-primary
  • Condition: .x-item-condition-text span[aria-hidden="true"]
  • Seller: .x-sellercard-atf__about-seller-item--seller-name
  • Shipping: .ux-labels-values--shipping
  • Item specifics: dl.ux-layout-section-evo__item

You can use the following function to pull those fields into a single dictionary with BeautifulSoup:

from bs4 import BeautifulSoup

def parse_listing_page(html):
    soup = BeautifulSoup(html, "lxml")

    def text(sel):
        el = soup.select_one(sel)
        return el.get_text(" ", strip=True) if el else None

    return {
        "title": text("h1.x-item-title__mainTitle"),
        "price": text(".x-price-primary"),
        "condition": text('.x-item-condition-text span[aria-hidden="true"]'),
        "seller": text(".x-sellercard-atf__about-seller-item--seller-name"),
        "shipping": text(".ux-labels-values--shipping"),
    }

The fields available can vary between listings, so your scraper should account for missing or differently formatted information when parsing the page.

5. Store and deduplicate the data

Save the results in a structured format such as CSV, JSON, or a database. Use the item ID as the deduplication key so the same listing does not get stored multiple times.

6. Re-crawl based on your data requirements

Set your crawl frequency according to how fresh the data needs to be. A project monitoring price changes may need more frequent updates than a one-time product research project.

Scraping Multiple eBay Listings

When collecting multiple listings, paginate through the search results and add each listing ID to a queue. On the current eBay search page, the next page is available through a.pagination__next.

Follow its href instead of building the next URL yourself, since eBay can add parameters such as _dcat for the category and _pgn for the page number.

Use data-listingid to keep track of listings you've already collected. Scope your selector to ul.srp-results > li.s-card[data-listingid] rather than using li.s-card on its own, because the page also contains placeholder cards outside the results container.

You should also validate each response before parsing it. If a page returns zero matching listing cards, it may indicate a browser-check page or a change to eBay's markup. Stop the crawl and investigate rather than saving an empty result as valid data.

How to Scrape eBay Reviews

eBay product reviews are tied to catalog products rather than individual listings. To collect them, find a listing that is matched to an eBay product, follow its product page, and then collect the reviews associated with that product.

1. Identify listings with review data

Start by finding listings that are associated with an eBay catalog product. Individual listing pages can show seller feedback, but that is different from product reviews. The product's reviews are held on its catalog page, which uses an eBay Product ID (ePID).

2. Locate the review section

Open the catalog product page and find the reviews section. The product page we tested displayed an average rating, the total number of product ratings, and 10 individual reviews, along with a “See all reviews” link for the rest of the reviews.

3. Extract the review details

Collect the fields you need from their relevant CSS selectors:

  • Star rating from .x-review-section__star--rating .star-rating
  • Author from .x-review-section__author a
  • Review date from .x-review-section__date
  • Review title from .x-review-section__title
  • Review text from .x-review-section__content
  • Review attributes from p.x-review-section__attr

Review titles can be truncated, so use the full review text as the main content field. Product information, such as the ePID, should be stored alongside the review so you can associate each review with the correct product.

4. Handle pagination or dynamic loading

The product page only shows a sample of the available reviews. Follow the “See all reviews” link to the paginated review pages.

Those review pages use a different HTML structure from the product page. The most stable fields are exposed through schema.org microdata, including [itemprop="review"], [itemprop="ratingValue"], [itemprop="author"], [itemprop="datePublished"], [itemprop="name"], and [itemprop="reviewBody"].

Follow the a[rel="next"] link until there are no more pages. You can use the review ID as your deduplication key because eBay's review order can change between requests.

5. Normalize the output

Save the review data in a consistent structure so you can compare results across products. Standardize ratings and dates, keep the product ID with each review, and remove duplicate records before storing the final dataset.

The review pages we tested contained the review data in the initial HTML, so no JavaScript rendering was needed for the review fields. Because eBay can change its markup, check the current page structure before using the highlighted selectors.

Using Proxies for eBay Web Scraping

You may not need proxies for a small scraping test. However, as your workload grows, they can help distribute requests across multiple IPs, collect location-specific data, and run multiple scraping jobs without relying on one source IP.

Here are the main proxy types and where they fit into an eBay scraping workflow:

Proxy Server (Datacenter Proxies)

Proxy servers can be a cost-effective fit for high-volume scraping when the target doesn't heavily filter datacenter IPs. Webshare's proxy servers support HTTP and SOCKS5 connections across 60+ countries and run on a 100+ Gbps aggregate network with 99.97% uptime.

Residential Proxies

Residential proxies are useful when you need residential-origin IPs or location-specific data. Webshare's residential proxies provide 80M+ ethically sourced residential IPs across 195 countries, with targeting by country, city, state, ZIP code, or ASN.

Rotating Proxies

Rotating proxies let you distribute requests across different IP addresses instead of sending every request through the same one.

Webshare's rotating proxy endpoint rotates through the proxies in your account and works with Proxy Server, Static Residential, and Rotating Residential plans. You can set rotation anywhere from every five minutes to once a month. If you need a large residential pool that refreshes on its own, Rotating Residential is a separate plan backed by 80M+ residential IPs.

For a deeper breakdown of proxy selection specifically for eBay, see our eBay proxy guide.

Get 10 Free Proxies and test your eBay scraper with Webshare. No credit card required.

eBay Scraping FAQs

This isn’t a simple yes or no. eBay’s current User Agreement says you may not use scrapers, spiders, data-mining tools, or other automated means to access its services without eBay’s prior express permission.

What applies to your project can also depend on the data you collect, how you collect it, where you are located, and what you plan to do with it.

Review eBay’s current terms and the laws that apply to your use case before starting a scraping project.

Can you scrape eBay listings?

Yes, you can technically collect eBay’s publicly accessible listing information with web scraping tools. However, what you can collect and how you can collect it still depends on eBay’s current terms, applicable laws, and your use case.

How do I scrape eBay listings?

Follow these steps to scrape eBay listings:

  1. Request the relevant eBay page.
  2. Parse the listing elements in the response.
  3. Extract the listing URLs and details you need.
  4. Paginate through additional results.
  5. Save the extracted data in a structured format such as CSV, JSON, or a database.

How do I scrape eBay reviews?

Product reviews are tied to eBay catalog product pages. Find the listing’s eBay Product ID (ePID), open the matching product page, and use its review section to collect the available review data.

The product page shows a sample of reviews, with a “See all reviews” link leading to paginated review pages. You can then extract fields such as the rating, author, date, review title, and full review text, and follow the next-page link to collect more reviews. You can use schema.org microdata on these pages to get more stable selectors.

What data can I scrape from eBay?

The data you can collect depends on the type of eBay page you're working with and what information it exposes. You may be able to collect:

  • Product titles
  • Prices
  • Seller information
  • Ratings
  • Product details
  • Shipping information
  • Availability
  • Publicly visible reviews

Individual listing pages can provide seller and item details, while catalog product pages contain product reviews and related rating data. The fields available can vary between pages, so check the page structure before building your scraper.

Do I need proxies to scrape eBay?

Not necessarily. For a small test or a limited number of requests, you may be able to run your scraper without a proxy. As your workload grows, proxies can become useful for distributing requests across multiple IPs, collecting location-specific results, or running several scraping jobs at the same time.

What is the best proxy type for scraping eBay?

There isn’t one proxy type that fits every eBay scraping setup. The right choice depends on how much data you need to collect, whether you need location-specific results, how often you send requests, and whether your workflow needs a consistent IP.

For larger scraping jobs that need to distribute requests across different IPs or locations, rotating residential proxies can be useful. Datacenter proxies can be a more cost-effective option for high-volume workloads when the target does not heavily filter datacenter IPs. If your workflow depends on keeping the same IP throughout a session, static residential proxies may be a better fit.

Gabriel Irene

Senior Integration Engineer

SHARE