跳到正文
DEV Community· Gio Rich·· 4 小時前AI 評分33

Amazon 搜尋結果首頁有多少廣告?用 Python 按關鍵字量度贊助商品佔比

How much of Amazon's first search page is ads? Measuring sponsored share per keyword with Python

AI 導讀

Amazon Search Scraper 配合 Python,可按關鍵字統計 Amazon 搜尋結果中的贊助商品比例、不同廣告商品數量及自然搜尋排名。單次快照顯示,「wireless earbuds」首頁有 48% 贊助商品,「laptop」首頁則有 8%;作者提醒,這些數字只供示例,不能當作基準。

正文

Gio Rich

I built this actor; it's a paid tool on Apify with a free trial credit.

If you sell on Amazon, or you're deciding whether to, the question "can I rank for this keyword organically?" has a blunt first filter: how much of page one is already bought? A keyword where half the slots are ads is a pay-to-play keyword. A keyword where ads are pushed to the bottom is one where organic rank still matters.

You can eyeball this in a browser, but sponsored slots rotate on every load and nobody checks 50 keywords by hand. My Amazon Search Scraper returns every result card with position, organicPosition and an isSponsored flag, so ad pressure becomes a few lines of Python.

What one snapshot looked like

These numbers come from search pages the actor saved on 8 Oct 2026 (they're the parser's test fixtures, loaded from a US IP). One snapshot each, so treat them as an illustration, not a benchmark:

Search Results on page Sponsored Distinct ad products Organic in top 10
amazon.com "wireless earbuds", page 1 31 15 (48%) 10 3
amazon.com "wireless earbuds", page 2 21 5 (24%) 5 10
amazon.com "laptop" in Electronics, page 1 26 2 (8%) 2 10
amazon.de "Kopfhörer", page 1 32 16 (50%) 8 3

Three things stood out:

  1. Earbuds and headphones are pay-to-play. On "wireless earbuds" the top 10 went ad, ad, organic, organic, organic, then five ads in a row. The first organic result was AirPods Pro 3 at position 3.
  2. The same product buys more than one slot. The two ads at positions 1 and 2 (ASINs B09XPX59JK and B0D2HJDH94) showed up again at positions 6 and 7. On the German "Kopfhörer" page, 16 ad slots went to just 8 products, each one twice. Counting ad slots overstates how many competitors are advertising, so count distinct ASINs too.
  3. "Laptop" barely had ads. Two sponsored cards, both at positions 22 and 23. The top of that page was all organic, mostly MacBook Air listings. High-ticket categories don't behave like cheap accessories.

On page 1 of "wireless earbuds", the ads were not worse products: median price $26.96 vs $24.99 for organic results, average rating 4.41 vs 4.26. Advertisers there are established sellers with tens of thousands of ratings.

The script

This runs one search per keyword, keeps sponsored cards (the default), and prints a table of ad pressure.

from collections import defaultdict
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
KEYWORDS = ["wireless earbuds", "standing desk", "yoga mat", "laptop stand", "phone case"]

run = client.actor("rel8ble/amazon-search-scraper").call(run_input={
    "keywords": KEYWORDS,
    "domain": "amazon.com",
    "maxItemsPerSearch": 60,      # roughly the first page or two
    "includeSponsored": True,
})

rows = defaultdict(list)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    rows[item["keyword"]].append(item)

print(f"{'keyword':<20}{'results':>8}{'ads':>6}{'ad %':>7}{'ad ASINs':>10}{'organic top10':>15}  first organic")
for kw in KEYWORDS:
    items = sorted(rows[kw], key=lambda p: p["position"])
    ads = [p for p in items if p["isSponsored"]]
    top10_organic = sum(1 for p in items if p["position"] <= 10 and not p["isSponsored"])
    first_org = next((p for p in items if not p["isSponsored"]), None)
    share = len(ads) / len(items) * 100 if items else 0
    print(f"{kw:<20}{len(items):>8}{len(ads):>6}{share:>6.0f}%{len({p['asin'] for p in ads}):>10}{top10_organic:>15}"
          f"  #{first_org['position'] if first_org else '-'} {(first_org or {}).get('title', '')[:40]}")

A few notes on the fields:

  • position counts every card in page order; organicPosition counts only non-sponsored ones and is null on ads. The difference between them for your own ASIN is how many ads sit above you.
  • The actor deduplicates ASINs within a search, so a product that holds two ad slots on the page is saved once. If you want the raw slot count like in my table above, that's what the page shows; the distinct-ASIN column is what you get from the dataset, and it's the more honest number anyway.
  • Sponsored slots rotate per request. For a real decision, run the same keywords a few times a day for a week (an Apify schedule does this) and average the ad share.

Turning it into a decision

A rough rule I'd use for a new product:

  • Ad share under 15% and the first organic result in the top 3: organic rank is reachable; spend on listing quality and reviews.
  • Ad share 30-50% and 3 or fewer organic results in the top 10: budget for PPC from day one, or pick a longer-tail keyword.
  • Same few ASINs holding multiple ad slots: a couple of well-funded sellers own the keyword. Check their ratingsCount before deciding to fight them.

Add boughtLastMonth and ratingsCount to the table and you also see whether the organic results that survive are small sellers or giants.

Cost and limits

$0.90 per 1,000 products plus a $0.00005 Apify actor-start charge; the five-keyword run above saves at most 300 products, so about $0.27. Prices follow the visitor's country (the amazon.de page above showed USD because it was loaded from a US IP; with a German proxy country it quotes EUR). Brand is usually only on product pages, so it's often null on search cards. Review text isn't included.

Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble

This article was drafted with AI and published by me.

來源:DEV Community · dev.to