def latest_reviews(code, region, buffer_size): lang = REGIONS[region]['lang'] url = 'https://play.google.com/store/getreviews?hl={}'.format(lang) headers = { 'User-Agent': user_agent(), 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } payload = { 'reviewType': 0, 'pageNum': 0, 'id': code, 'reviewSortOrder': 0, 'xhr': 1 } body = yield from request(url, headers=headers, payload=payload) raw_reviews = remove_emoji(json.loads(body.decode('utf-8').replace(")]}'", "").strip())[0][2]) tree = lxml.html.fromstring(raw_reviews) reviews = list() for raw_review in tree.xpath('//div[@class="single-review"]')[:buffer_size]: reviews.append({ 'id': raw_review.xpath('./div[@class="review-header"]')[0].attrib['data-reviewid'], 'title': raw_review.xpath('./div[@class="review-body with-review-wrapper"]/span[@class="review-title"]')[0].text, 'content': raw_review.xpath('./div[@class="review-body with-review-wrapper"]')[0].text_content().replace(raw_review.xpath('./div/div[@class="review-link"]')[0].getchildren()[0].text, '').strip(), 'name': raw_review.xpath('./div[@class="review-header"]/div[@class="review-info"]/span')[0].text_content(), 'score': int(raw_review.xpath('./div/div/div/div/div[@class="current-rating"]')[0].attrib['style'].replace('width:', '').replace('%', '').replace(';', '').strip()), 'date': date(region, raw_review.xpath('./div/div/span[@class="review-date"]')[0].text), 'version': '', 'lang': lang, 'region': region }) return reviews
def latest_reviews(code, region, buffer_size): url = "http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/viewContentsUserReviews?id={}&pageNumber={}&sortOrdering=4&onlyLatestVersion=false&type=Purple+Software".format(code, 0) headers = { 'X-Apple-Store-Front': REGIONS[region]['app_store_id'], 'User-Agent': 'iTunes/9.2 (Macintosh; U; Mac OS X 10.6)' } body = yield from request(url, headers=headers) reviews = list() for raw_review in etree.XML(body).xpath('//ns:VBoxView[@leftInset="10"]', namespaces=NAMESPACE)[1:][:buffer_size]: review_info = raw_review.xpath('./ns:HBoxView', namespaces=NAMESPACE)[1].xpath( './ns:TextView[@topInset="0"]/ns:SetFontStyle/ns:GotoURL', namespaces=NAMESPACE)[0].tail.split('-') title = raw_review.xpath('./ns:HBoxView[@bottomInset="3"]/ns:TextView/ns:SetFontStyle/ns:b', namespaces=NAMESPACE)[0].text content = raw_review.xpath('./ns:TextView[@topInset="2"]/ns:SetFontStyle', namespaces=NAMESPACE)[0].text reviews.append({ 'id': raw_review.xpath('./ns:HBoxView[@bottomInset="3"]/ns:HBoxView[@stretchiness="1"]/ns:HBoxView[@rightInset="0"]/ns:VBoxView/ns:GotoURL', namespaces=NAMESPACE)[0].get('url').split('userReviewId=')[1], 'title': title, 'content': content, 'name': raw_review.xpath('./ns:HBoxView', namespaces=NAMESPACE)[1].xpath('./ns:TextView[@topInset="0"]/ns:SetFontStyle/ns:GotoURL/ns:b', namespaces=NAMESPACE)[0].text.strip(), 'score': score(raw_review), 'created_at': created_at(review_info), 'version': version(review_info), 'reviewer_id': raw_review.xpath('./ns:HBoxView', namespaces=NAMESPACE)[1].xpath('./ns:TextView[@topInset="0"]/ns:SetFontStyle/ns:GotoURL', namespaces=NAMESPACE)[0].get('url').split('userProfileId=')[1], 'lang': find_out_language(REGIONS[region]['langs'], content, title), 'region': region }) return reviews