How to Scrap Shopee Product Pages: Title, Price, and Stock

To scrap Shopee is to store the title, price, and stock from one public product page. Keep one residential IP, in that site's country, until those three fields are written. The next item starts on a new session.
What scrap Shopee means
To scrap Shopee is to read one public product page and keep the fields a logged-out visitor can see. The job is title, current price, and a stock or sold signal. A search results page is a different job, because it does not hold a single item's price.
A Shopee product page is the item URL, not the homepage and not a shop landing page. The path carries a shop id and an item id. Those two numbers name the listing. They are not a substitute for the price, which still has to be read from the page.
The three fields are the ones a buyer sees on the public page. Title, price, and stock are enough for a price check. A search grid is not a substitute, because it does not hold one item's price.
Which fields come off a public product page?
The fields worth storing are the ones a buyer sees before login. Title names the listing. Price is the current figure, with its currency. Stock is whatever the page shows as available or already sold. Variant prices can differ from the headline price, so store the variant you actually opened.
A shopee scraper in this job is the client that writes that row. It is not a catalog of every shop in a country. One row is one item. A later change in the price is a new row, not an edit that hides the old one.
Shop id and item id come from the URL, so you can store them in their own columns. They identify the listing when the title changes. They do not carry the price. A sheet sorted by item id still needs the price column beside it, or the sort is a list of ids with nothing to compare.
Why does the country domain matter?
Shopee runs a separate site per country. shopee.sg is the Singapore catalog. shopee.co.id is the Indonesia catalog. The same product name on two sites can carry two prices and two currencies. A scrap of one site does not fill the other.
The exit should be in that site's country. A Singapore item read through an Indonesia exit is a different view from the one a local buyer gets. Price, language, and shipping notes can all move. Match the residential exit to the domain before you store the row, or the row is from the wrong market.
Currency is part of the row. A Singapore price in SGD and an Indonesia price in IDR are not two readings of one number. Store the currency beside the price, and store the domain beside the URL. A later comparison that drops the currency will treat 12 and 120000 as the same kind of figure. They are not.
How do you scrap one Shopee item?
One scrap is one item URL. You confirm the URL is a product page, send it through a residential exit in that country, and write title, price, and stock before you open the next URL. A shop grid and a search page stay out of this step, because neither one is a single price.
- Open the URL in a normal browser first. If you land on search results or a shop grid, you do not have a single price yet. Pick one item and use that item URL.
- Set the proxy country to the site's country. A Singapore URL takes a Singapore residential exit. An Indonesia URL takes an Indonesia exit.
- Keep that IP until the three fields are stored. The next item starts a new session, so a later price is not tied to the first exit.
A dynamic residential proxy is the exit for this public page. IPOasis dynamic residential traffic starts at $0.78/GB, and unused traffic does not expire.
On IPOasis dynamic residential, sticky lasts up to 120 minutes, then the IP can change. One item should finish well inside that window. The dynamic residential traffic page is where you size the pack for the number of items you actually open.
The client below checks that a product document came back. The proxy URL is a placeholder. Replace it with the host, port, and credentials from the plan. It does not include a Shopee parser, because class names on the page change and a copied selector goes stale.
Read the three fields from the document you received, in the order title, price, stock. Write them with the item URL before you change the proxy session. A second request on the same session is still the same item. A new item gets a new session even when the shop id stays the same.

Expected output is three lines:

The byte count above is an example, not a live page. A 200 with og:title in the body means you received a product document. Read title, price, and stock from that document and write the row. A 407 means the proxy credentials are wrong. Fix the proxy URL and run the same item again.
A price check on a schedule is the same three fields, repeated. The price scraping job covers how to store each reading so a later price does not overwrite the earlier one.
Each run writes a new row: item URL, title, price, currency, stock signal, and the time you stored it. The previous row stays. A blank price on a later run is a failed read, not a zero. Leave the cell empty and keep the last good row, so a chart does not show the item as free.
What does a failed read look like?
A failed read is a response that does not contain the product document. A timeout, a 407, or a short page with no title marker is a failed read. You do not store a price from it. You store nothing for that attempt, and you retry the same URL on a fresh session.
A 200 with the title marker is only the start. You still have to find the price and the stock signal in that document. If the price block is missing, leave the price cell empty and keep the title and the URL.
An empty price is a gap. A zero would say the item is free, which is a different fact.
Retry the gap on its own. One retry, one new session, the same item URL. A second failure stays a gap. Filling it from an older row hides the miss. The last good row remains in the sheet, with its own time, so you can see how old that price is.
How do you keep the row usable later?
A usable row is one you can compare next week without guessing which site it came from. The minimum is the item URL, the title, the price, the currency, the stock or sold signal, and the time you stored it. Drop any one of those and the later comparison gets quieter than it should.
Price without currency is the usual break. 12 on shopee.sg and 12 on shopee.co.id are not the same amount. Write SGD or IDR in its own column. The URL already carries the domain, but a separate country column makes a filter possible when the sheet grows past one site.
Stock wording changes by site. One page shows a count. Another shows a sold total and no remaining count. Store the words you saw, as text.
A later pass can turn "9 available" into a number. Forcing that on the first write turns a missing count into a zero, and a zero looks like the item is gone.
The time is the time you stored the row, in UTC, not the time the seller last edited the listing. You do not know the seller's edit time from the public page. A second scrape of the same item is a new row with a new time. The first row stays, so a price move is visible.
A blank price stays blank. It is a failed read. Copying the previous price into the blank cell hides the failure and makes the item look stable. Leave the cell empty, keep the last good row, and retry that URL on its own session.
FAQ
What does scrap Shopee mean?
To scrap Shopee means storing title, price, and stock from one public product page. The page is an item URL, with a shop id and an item id. A search page is not this job, because it does not hold one item's price. The next item uses a new session after the three fields are written.
Which fields can you store from a public page?
Store the title, the current price with its currency, and the stock or sold signal on the public page. Keep the full item URL with them. Variant prices can differ from the headline, so store the variant you opened. Shop id and item id can sit in their own columns. They name the listing. They do not replace the price.
Does the proxy country have to match the Shopee site?
Yes. shopee.sg and shopee.co.id are separate catalogs. A Singapore item takes a Singapore residential exit. An Indonesia item takes an Indonesia exit. A price stored through the wrong country can be a different currency and a different offer from the one a local buyer sees.
How long should one item keep the same IP?
Keep the same IP until title, price, and stock are stored for that item. Then start a new session for the next URL. On IPOasis dynamic residential, sticky lasts up to 120 minutes, then the IP can change. One item should finish inside that window. A new item still gets a new session when the shop id stays the same.
What belongs in the saved row?
The row needs the item URL, title, price, currency, stock or sold signal, and the time you stored it. Price without currency cannot be compared across shopee.sg and shopee.co.id. A blank price stays blank. Copying an older price into that cell hides a failed read.One public item, three fields, and an exit in that site's country. Write the row, then open the next item on a new session.


