curl -X POST "https://api.ujeebu.com/scrape" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://www.amazon.com/product-reviews/B08N5WRWNW/","js":true,"wait_for":"[data-hook=review]","extract_rules":{"reviews":{"selector":"[data-hook=review]","type":"obj","multiple":true,"children":{"reviewer_name":{"selector":".a-profile-name","type":"text"},"rating":{"selector":"i[data-hook=review-star-rating] span","type":"text"},"title":{"selector":"a[data-hook=review-title] span","type":"text"},"date":{"selector":"span[data-hook=review-date]","type":"text"},"review_text":{"selector":"span[data-hook=review-body] span","type":"text"}}}}}'
import requests
extract_rules = {
"reviews": {
"selector": "[data-hook=review]",
"type": "obj",
"multiple": True,
"children": {
"reviewer_name": {"selector": ".a-profile-name", "type": "text"},
"rating": {"selector": "i[data-hook=review-star-rating] span", "type": "text"},
"title": {"selector": "a[data-hook=review-title] span", "type": "text"},
"date": {"selector": "span[data-hook=review-date]", "type": "text"},
"review_text": {"selector": "span[data-hook=review-body] span", "type": "text"}
}
}
}
response = requests.post("https://api.ujeebu.com/scrape",
headers={
"ApiKey": "YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"url": "https://www.amazon.com/product-reviews/B08N5WRWNW/",
"js": True,
"wait_for": "[data-hook=review]",
"extract_rules": extract_rules
})
reviews = response.json()["result"]["reviews"]
print(f"Scraped {len(reviews)} reviews")
for review in reviews:
print(f"{review.get('rating')} - {review.get('title')}")
const axios = require('axios');
const extractRules = {
reviews: {
selector: '[data-hook=review]',
type: 'obj',
multiple: true,
children: {
reviewer_name: { selector: '.a-profile-name', type: 'text' },
rating: { selector: 'i[data-hook=review-star-rating] span', type: 'text' },
title: { selector: 'a[data-hook=review-title] span', type: 'text' },
date: { selector: 'span[data-hook=review-date]', type: 'text' },
review_text: { selector: 'span[data-hook=review-body] span', type: 'text' }
}
}
};
(async () => {
const response = await axios.post('https://api.ujeebu.com/scrape', {
url: 'https://www.amazon.com/product-reviews/B08N5WRWNW/',
js: true,
wait_for: '[data-hook=review]',
extract_rules: extractRules
}, {
headers: { 'ApiKey': 'YOUR_API_KEY', 'Content-Type': 'application/json' }
});
const reviews = response.data.result.reviews;
console.log(`Scraped ${reviews.length} reviews`);
for (const review of reviews) {
console.log(`${review.rating} - ${review.title}`);
}
})();
from ujeebu_python import UjeebuClient
uj = UjeebuClient(api_key="YOUR_API_KEY")
extract_rules = {
"reviews": {
"selector": "[data-hook=review]",
"type": "obj",
"multiple": True,
"children": {
"reviewer_name": {"selector": ".a-profile-name", "type": "text"},
"rating": {"selector": "i[data-hook=review-star-rating] span", "type": "text"},
"title": {"selector": "a[data-hook=review-title] span", "type": "text"},
"date": {"selector": "span[data-hook=review-date]", "type": "text"},
"review_text": {"selector": "span[data-hook=review-body] span", "type": "text"}
}
}
}
res = uj.scrape_with_rules(
"https://www.amazon.com/product-reviews/B08N5WRWNW/",
extract_rules=extract_rules,
params={"js": True, "wait_for": "[data-hook=review]"})
reviews = res.json()["result"]["reviews"]
print(f"Scraped {len(reviews)} reviews")
for review in reviews:
print(f"{review.get('rating')} - {review.get('title')}")
const { UjeebuClient } = require('@ujeebu-org/ujeebu-sdk');
const client = new UjeebuClient("YOUR_API_KEY");
const extractRules = {
reviews: {
selector: '[data-hook=review]',
type: 'obj',
multiple: true,
children: {
reviewer_name: { selector: '.a-profile-name', type: 'text' },
rating: { selector: 'i[data-hook=review-star-rating] span', type: 'text' },
title: { selector: 'a[data-hook=review-title] span', type: 'text' },
date: { selector: 'span[data-hook=review-date]', type: 'text' },
review_text: { selector: 'span[data-hook=review-body] span', type: 'text' }
}
}
};
(async () => {
const res = await client.scrape('https://www.amazon.com/product-reviews/B08N5WRWNW/', {
js: true,
wait_for: '[data-hook=review]',
extract_rules: extractRules
});
const reviews = res.data.result.reviews;
console.log(`Scraped ${reviews.length} reviews`);
for (const review of reviews) {
console.log(`${review.rating} - ${review.title}`);
}
})();
<?php
$extractRules = [
'reviews' => [
'selector' => '[data-hook=review]',
'type' => 'obj',
'multiple' => true,
'children' => [
'reviewer_name' => ['selector' => '.a-profile-name', 'type' => 'text'],
'rating' => ['selector' => 'i[data-hook=review-star-rating] span', 'type' => 'text'],
'title' => ['selector' => 'a[data-hook=review-title] span', 'type' => 'text'],
'date' => ['selector' => 'span[data-hook=review-date]', 'type' => 'text'],
'review_text' => ['selector' => 'span[data-hook=review-body] span', 'type' => 'text'],
],
],
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api.ujeebu.com/scrape',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['ApiKey: YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://www.amazon.com/product-reviews/B08N5WRWNW/',
'js' => true,
'wait_for' => '[data-hook=review]',
'extract_rules' => $extractRules,
]),
]);
$response = curl_exec($ch);
curl_close($ch);
$reviews = json_decode($response, true)['result']['reviews'] ?? [];
echo "Scraped " . count($reviews) . " reviews\n";
foreach ($reviews as $review) {
echo "{$review['rating']} - {$review['title']}\n";
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
rules := map[string]any{
"reviews": map[string]any{
"selector": "[data-hook=review]",
"type": "obj",
"multiple": true,
"children": map[string]any{
"reviewer_name": map[string]any{"selector": ".a-profile-name", "type": "text"},
"rating": map[string]any{"selector": "i[data-hook=review-star-rating] span", "type": "text"},
"title": map[string]any{"selector": "a[data-hook=review-title] span", "type": "text"},
"date": map[string]any{"selector": "span[data-hook=review-date]", "type": "text"},
"review_text": map[string]any{"selector": "span[data-hook=review-body] span", "type": "text"},
},
},
}
payload, _ := json.Marshal(map[string]any{
"url": "https://www.amazon.com/product-reviews/B08N5WRWNW/",
"js": true,
"wait_for": "[data-hook=review]",
"extract_rules": rules,
})
req, _ := http.NewRequest("POST", "https://api.ujeebu.com/scrape", bytes.NewReader(payload))
req.Header.Set("ApiKey", "YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
body, _ := io.ReadAll(res.Body)
res.Body.Close()
var parsed struct {
Result struct {
Reviews []struct {
ReviewerName string `json:"reviewer_name"`
Rating string `json:"rating"`
Title string `json:"title"`
Date string `json:"date"`
ReviewText string `json:"review_text"`
} `json:"reviews"`
} `json:"result"`
}
json.Unmarshal(body, &parsed)
fmt.Printf("Scraped %d reviews\n", len(parsed.Result.Reviews))
for _, review := range parsed.Result.Reviews {
fmt.Printf("%s - %s\n", review.Rating, review.Title)
}
}
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/ujeebu/ujeebu-go"
)
func main() {
client, err := ujeebu.NewClient("YOUR_API_KEY")
if err != nil {
log.Fatal(err)
}
rules := map[string]any{
"reviews": map[string]any{
"selector": "[data-hook=review]",
"type": "obj",
"multiple": true,
"children": map[string]any{
"reviewer_name": map[string]any{"selector": ".a-profile-name", "type": "text"},
"rating": map[string]any{"selector": "i[data-hook=review-star-rating] span", "type": "text"},
"title": map[string]any{"selector": "a[data-hook=review-title] span", "type": "text"},
"date": map[string]any{"selector": "span[data-hook=review-date]", "type": "text"},
"review_text": map[string]any{"selector": "span[data-hook=review-body] span", "type": "text"},
},
},
}
resp, _, err := client.Scrape(ujeebu.ScrapeParams{
URL: "https://www.amazon.com/product-reviews/B08N5WRWNW/",
JS: true,
WaitFor: "[data-hook=review]",
ExtractRules: rules,
})
if err != nil {
log.Fatal(err)
}
var data struct {
Reviews []struct {
ReviewerName string `json:"reviewer_name"`
Rating string `json:"rating"`
Title string `json:"title"`
Date string `json:"date"`
ReviewText string `json:"review_text"`
} `json:"reviews"`
}
b, _ := json.Marshal(resp.Result)
json.Unmarshal(b, &data)
fmt.Printf("Scraped %d reviews\n", len(data.Reviews))
for _, review := range data.Reviews {
fmt.Printf("%s - %s\n", review.Rating, review.Title)
}
}