Here is the thing most people hit when they try to scrape Qunar reviews: there is no public endpoint you can just call. Qunar (去哪儿) is the price-led China-market brand in the Trip.com Group, and it runs one of the largest Chinese-language hotel review systems around, but none of that is exposed through a supported API. The moment you want the actual words guests wrote, you are on your own.
And it gets trickier. The reviews you see on a Qunar hotel page are not in the HTML you get from a plain request. They load separately, from a call the page makes after it renders, and that call is guarded. On top of that the reviews are Chinese-language only, with no machine translation offered, and Qunar's pages mix reviews written natively on Qunar with reviews it aggregates from Ctrip, undifferentiated.
This post shows the honest Python starting point, why it stalls, and then a no-code shortcut that returns clean rows with one call. If you would rather read a longer writeup, there is a full how to scrape Qunar reviews guide on our site too.
What you can pull from a review
Every review row includes the core identity (hotelId, hotelName, hotelCity, reviewId, url, source), the origin tags (reviewSource, isCtripImport) so you always know whether a review was written on Qunar or aggregated from Ctrip, the rating on Qunar's native 1 to 5 scale plus a word label (overallRating, ratingLabel), per-review subRatings (service, location, facilities, cleanliness, breakfast), the written content (reviewTitle, reviewText), a POSITIVE/NEGATIVE sentiment, the stay context (travelType, roomName, checkInMonth), the reviewer basics (reviewer), any attached photos, the hotel's ownerResponse if the property replied, and a markdownContent block that is ready to drop straight into an LLM prompt.
One honesty note: Qunar reviews are Chinese-language and are returned as written. There is no translation field, because Qunar itself does not translate. If you need English, run the reviewText through your own translation step downstream.
Why scraping Qunar reviews is hard
- There is no public reviews API. Qunar offers no supported channel for reading a property's guest reviews.
- Reviews load dynamically. The hotel page HTML you get from a simple GET does not contain the structured review text, so parsing the page source gets you nothing useful.
- The review call is guarded. Reviews arrive through a separate request the page makes, which is rate-limited and blocks datacenter traffic quickly.
- Chinese-only content. Reviews are Chinese-language with no translation, so any tooling that assumes English will mishandle the text.
- Mixed sources. A Qunar hotel page shows native Qunar reviews plus Ctrip-aggregated ones, undifferentiated, so you need to tag origin yourself to keep the data honest.
Three ways to get the data
| Approach | Setup | Handles blocking + dynamic load | Reviews coverage | Cost model |
|---|---|---|---|---|
| DIY Python | You write and maintain it | You build it yourself | Whatever you can reach | Your time + proxies |
| Qunar Hotel Reviews Scraper (Apify) | Paste a URL or ID | Yes, done for you | Everything the page shows, native + Ctrip-imported, tagged | Pay per review returned |
| Official Qunar API | None available | N/A | None, reviews are not offered | Not available |
Option A: DIY in Python
Start where everyone starts, a request to the hotel page. The problem shows up immediately: the review text is not in the response body.
import httpx
url = "https://hotel.qunar.com/cn/nanjing/dt-17/"
r = httpx.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
print(r.status_code)
print("feedContent" in r.text) # -> False, the reviews are not in the page HTML
The reviews arrive through a separate call the page makes after it loads, and that call is guarded. To do this properly you would reverse engineer that flow, rotate proxies, page through results, normalize Qunar's 1 to 5 score, tag each row's origin, and keep it all working as the site changes. Doable, but it is a maintenance job, not a one-off script.
Option B: the no-code / API shortcut
If you would rather skip the maintenance, the Qunar Hotel Reviews Scraper on Apify does the fetching, paging, and normalizing for you. You hand it hotels and get rows back.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": ["https://hotel.qunar.com/cn/nanjing/dt-17/"],
"maxReviews": 200,
}
run = client.actor("factden/qunar-hotel-reviews-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["overallRating"], item["reviewSource"], item["reviewText"][:60])
You can also pass composite IDs like nanjing_17 (or shanghai_city_297) under hotelIds, or set a fromDate ("reviews since") for cheap incremental syncs. Every row carries overallRating (1-5) and sentiment, so you filter to the 1-2 star reviews for complaint triage right after export. Field docs, the full output schema, and code snippets are in the GitHub repo.
Which should you use?
If you need Qunar reviews once, for one hotel, and you enjoy maintaining scrapers, the DIY route is fine. If you need them reliably, at volume, tagged by source, and normalized, the actor pays for itself the first time the guarded review call changes shape and your script would have broken.
Either way, now you know why the naive approach returns an empty page, and what a clean Qunar review row actually contains.
Top comments (0)