HardwareZone Scraper – SG Forum Threads, Replies & Monitoring
Pricing
from $2.00 / 1,000 thread listings
HardwareZone Scraper – SG Forum Threads, Replies & Monitoring
Scrape HardwareZone, Singapore's biggest forum, without an API or login: board thread listings with keyword filtering, main posts and all replies, with author, reply count, view count and timestamps. Schedule daily runs for SG brand monitoring. Export JSON/CSV/Excel for social listening.
Pricing
from $2.00 / 1,000 thread listings
Rating
0.0
(0)
Developer
Chad
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
HardwareZone Scraper – Singapore's Biggest Forum (No API, No Login)
Scrape HardwareZone (forums.hardwarezone.com.sg) — Singapore's biggest forum: latest threads per board, and full thread content with all replies — via public HTML endpoints, output as structured data.
Output Fields
Board Thread Listing (ListingRow, content is null)
| Field | Type | Description |
|---|---|---|
| post_id | string | Thread ID |
| site | string | Always hardwarezone |
| board | string | null | Board ID (the forumId used in the query) |
| is_hidden | boolean | Whether this row itself is hidden behind the age-verification wall; only a thread's main post in full thread mode can be true, board listing rows are always false. A censored main post is still billed one product-detail (title, view/reply-count metadata still has value) |
| title | string | null | Title |
| author | string | null | Thread starter |
| reply_count | number | null | Reply count (the raw page may show abbreviations like "895" or "29K" — converted to an integer) |
| view_count | number | null | View count (same handling for "104K" / "4M" abbreviations) |
| created_at | string | null | Post time (ISO 8601, with a +0800 offset) |
| last_reply_at | string | null | Last reply time (ISO 8601, with a +0800 offset) |
| post_url | string | null | Thread URL |
| content | string | null | Body text (null in listing mode) |
| source_mode | string | Scrape mode |
| source_query | string | Query used (board ID) |
| scraped_at | string | Scrape timestamp (ISO 8601) |
Thread Content (ThreadRow, same fields as above, plus content populated)
| Field | Type | Description |
|---|---|---|
| content | string | null | Full thread body text (HTML tags stripped, whitespace collapsed) |
| own_text | string | null | Only what this post's author wrote (content minus all top-level quote blocks; "" for a quote-only post; null when content is null). Use this for sentiment analysis so the quoted person's tone isn't attributed to the replier |
| quoted_author | string | null | Author of the first quote block (null when the post quotes nobody) |
| quoted_text | string | null | Text of all top-level quote blocks (joined by a blank line, without the "X said:" title or "Click to expand..." text; null when there is no quote) |
The thread row's board is always null (thread mode doesn't take a board ID as input, and board info isn't on the thread page); reply_count / view_count / last_reply_at are always null (these fields only exist on the board listing page).
content is the post's full text including quoted passages (script and quote-UI noise removed); own_text is the same post with the quotes taken out, so it is the field to feed into sentiment analysis. In board listing mode all three new fields are null.
Replies (ReplyRow, full thread mode only)
| Field | Type | Description |
|---|---|---|
| reply_id | string | Reply ID (the floor post's element ID; falls back to {threadId}-{floor} when missing) |
| post_id | string | Parent thread ID |
| site | string | Always hardwarezone |
| floor | number | null | Floor number (1-based, numbered continuously across pages; null when the floor can't be read because the post sits behind the age-verification wall — see Notes below) |
| is_hidden | boolean | Whether the post is hidden behind the age-verification wall. true rows are kept as placeholders (content / created_at / floor are null) and are not charged; normal posts are false |
| author | string | null | Author |
| content | string | null | Reply content (HTML tags stripped, whitespace collapsed; null when hidden behind the age-verification wall) |
| own_text | string | null | Only what this post's author wrote (content minus all top-level quote blocks; "" for a quote-only post; null when content is null). Use this for sentiment analysis so the quoted person's tone isn't attributed to the replier |
| quoted_author | string | null | Author of the first quote block (null when the post quotes nobody) |
| quoted_text | string | null | Text of all top-level quote blocks (joined by a blank line, without the "X said:" title or "Click to expand..." text; null when there is no quote) |
| created_at | string | null | Reply time (ISO 8601, with a +0800 offset; null when hidden behind the wall) |
| scraped_at | string | Scrape timestamp (ISO 8601) |
Modes
| Mode | Input | Output | Billing |
|---|---|---|---|
| forum | forumIds (board IDs) | Thread listing | $0.002/row |
| thread | threadIds / threadUrls | Thread content ($0.008/thread) + all replies ($0.003/reply) | by volume |
Input Fields
| Field | Type | Default | Description |
|---|---|---|---|
| mode | enum | forum | Mode: forum / thread (required) |
| forumIds | array | ["16"] | Board IDs, e.g. 16 (Eat-Drink-Man-Woman), 234 (Chill-out/Happenings), 9 (Mobile Communication Technology). Find more boards at forums.hardwarezone.com.sg |
| threadIds | array | — | Thread IDs |
| threadUrls | array | — | Thread URLs; the thread ID is extracted automatically |
| bulkInput | textarea | — | Bulk paste, one item per line, auto-merged into the matching field based on the current mode |
| keywords | array | — | Board thread mode: title keyword filter (leave empty for no filtering) |
| maxItems | integer | 50 | Board thread mode: max items per board; full thread mode: max threads to scrape (replies are all fetched by default; set maxReplies to cap replies per thread, by floor). Maximum 2000 |
| maxReplies | integer | — | Thread mode: max replies to collect per thread (each reply is billed per row). Takes the first N reply floors per thread (deleted floors can make it slightly fewer than N). Empty = no limit (default: the whole thread). Unrelated to maxItems, which limits the number of threads |
| dateFrom | string | — | Applies to board thread mode, based on thread post time or last reply time (whichever is newer). Format 3d, 12h, 2w (relative) or MM/DD/YY (absolute date). When set, paging also stops early (pinned threads are exempt from this filter and early-stop check), keeping scheduled monitoring cheaper |
| proxyConfiguration | proxy | Apify datacenter proxy | On by default; without a proxy you share egress IPs with other runs and get rate-limited by the forum. Turn it off only for local testing or your own proxy |
Input Examples
Board Thread Listing
{"mode": "forum","forumIds": ["16", "234"],"maxItems": 50}
Full Thread and Replies
{"mode": "thread","threadUrls": ["https://forums.hardwarezone.com.sg/threads/official-blood-donation-thread-give-blood-save-lives.7166857/"]}
Singapore Social Listening
HardwareZone — especially its casual-chat board EDMW — is Singapore's biggest forum, and the source most often bundled into local social-listening monitoring. Want a fuller picture of Asian forum sentiment? Pair it with the author's other Traditional-Chinese sentiment actors: LIHKG (lihkg-scraper, Hong Kong) and PTT (ptt-scraper, Taiwan). All three actors share the same output conventions (snake_case, null for missing values, ISO timestamps), making it easy to merge and analyze together.
Notes
- Only public content is scraped — no account or token required
- Uses public HTML endpoints (XenForo forum engine) — no browser required, so it's fast and low-cost
- Body text has HTML tags automatically stripped, with whitespace collapsed to single spaces
- Board IDs / thread IDs can be plain numbers (e.g.
forumIds: ["16"]) — the actor builds the URL automatically; HardwareZone redirects a plain-number URL to the full URL with the board/thread name, so the result is the same - Some posts sit behind an age-verification wall: HardwareZone requires login and age verification to view certain content in full (not limited to adult boards). When scraped without login, these posts only yield
author(still populated);content/created_at/floorare honestly reported asnullrather than faked. The thread's first post (the main body) has not been observed to be affected by this restriction reply_count/view_countare often shown as abbreviations like "104K" / "4M" on the raw page (not just for very large numbers — mid-sized ones can be abbreviated too), and are uniformly converted to integers- Auto-stops after 5 consecutive pages with no new data — no idle burn. When
dateFromis set, paging stops immediately once every non-pinned thread on a page is older thandateFrom(cheaper still; applies to forum mode only — pinned threads are always kept and are not subject to this filter) - If HardwareZone (XenForo) redesigns its site or adds anti-scraping measures in the future, this is judged by Apify Cloud smoke test results (go/no-go); if blocked, the fallback is to switch to Apify residential proxy — not over-engineered in advance
FAQ
Q: Do I need to log in to view this data?
A: No. This actor only scrapes public thread listings and posts — nothing that requires login. A small number of posts sit behind an age-verification wall (see Notes above); their content simply isn't retrievable without login in the first place, so it's out of scope.
Q: Why is content / created_at / floor null for some replies?
A: These replies are hidden behind HardwareZone's age-verification wall — content and time can't be read without login. We honestly report null instead of fabricating data; author is still available, and reply_id is always populated.
Q: Am I charged for hidden posts?
A: No. Posts hidden behind the age-verification wall stay in the results flagged is_hidden: true (content is null, so you can see the floor exists but is unreadable), but these rows are not billed as review-item (hidden rows are pushed but not charged); only visible replies (is_hidden: false) are charged. If the main post (OP) is censored it also gets is_hidden: true, but one product-detail is still billed. The run-end log reports the hidden row count as hidden=N (skipped means failed requests, a different thing). With maxReplies, hidden posts still occupy their floor position (but cost nothing).
Q: Can I scrape multiple boards at once?
A: Yes. Add multiple IDs to forumIds, or paste them one per line via bulkInput.
Q: What's the difference between threadIds and threadUrls?
A: Same effect — threadUrls automatically extracts the numeric ID. Both support the plain-number URL (/threads/{id}/) and the full URL (/threads/{title-slug}.{id}/).
Q: Why is the board field null in full thread mode?
A: The thread page itself doesn't carry board info (the board ID only appears in the board listing page's URL), and full thread mode's input is just a threadId — there's no way to know which board it belongs to, so we honestly return null.
Q: Can a long thread get expensive?
A: Yes. Thread mode fetches the whole thread by default and bills every reply as one review-item ($0.003 each), and a popular thread can have thousands of replies. To cap the cost per thread, set the optional maxReplies (for example 100): each thread stops paging and billing once that many replies have been collected; the thread's own post is billed separately as one product-detail. Leave it empty for no limit, exactly as before. maxItems limits the number of threads, not replies.
Disclaimer
This tool is for academic research and lawful business analysis only. Users must comply with HardwareZone's Terms of Service and applicable laws. Do not use this tool to invade others' privacy, spread false information, or engage in any other unlawful activity. The author accepts no responsibility for any misuse.
HardwareZone scraper, Singapore forum, HWZ, EDMW, SG social listening, brand monitoring Singapore, forum sentiment
📚 Related tutorials & tools
Hands-on guides and free tools built on this actor, at AI Social API:
- 📖 Guide: HardwareZone API: Getting Singapore Forum Data From EDMW and Other HWZ Boards
- 📖 Tutorial: Build a no-code forum sentiment pipeline with Apify + n8n + GPT
- 📊 Data: Asian forum scrapability × cost table — measured on live runs: which forums need only a plain request, which need a residential IP, and what one item costs
- 🛠 Free tools: Forum sentiment quick-check · Apify cost calculator
- 🤝 Rather not run it yourself? I run it for you — scheduled daily, delivered to your Google Sheet or Slack, from US$299/mo.
Maintained by an operator running 30+ live Apify actors.