# Abjjad أبجد Books Scraper - Arabic Book Details for LLM (`boring_internet_explorer/abjjad-scraper`) Actor

Scrape books, ratings & reviews from Abjjad أبجد — the largest Arabic reading platform. Get structured data from any category: titles, descriptions, editions, publishers, and natural Arabic reviews with dialect. Ideal for LLM training data, Arabic NLP, and book market research.

- **URL**: https://apify.com/boring\_internet\_explorer/abjjad-scraper.md
- **Developed by:** [Boring Internet Explorer](https://apify.com/boring_internet_explorer) (community)
- **Categories:** Developer tools, AI, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Abjjad أبجد Book Scraper - Scrape Arabic books and metadata from abjjad.com


Scrapes book data from **Abjjad** (`abjjad.com`), the largest Arabic reading and audiobook platform in the Arab world. Given a category/listing page, the scraper collects the books listed on it and returns structured data for each one — including title, author, description, genre, publisher, edition details, and community ratings, all in Arabic.

### Why use this scraper?

Abjjad hosts one of the richest catalogs of Arabic-language fiction and non-fiction — novels, short stories, classical literature, translated works, religious books, business books, and more — along with real reader reviews and ratings written in Arabic. This makes it a uniquely valuable source for anything that needs authentic, natural Arabic text at scale.

This scraper makes it easy to collect structured book data and reader-generated content from Abjjad, enabling use cases such as:

- 📚 Building Arabic book catalogs, recommendation engines, and reading apps.
- 📊 Market research on Arabic publishing trends, genres, and popular authors.
- ⭐ Tracking ratings, review counts, and reader engagement over time.
- 🧠 **Training and fine-tuning LLMs on natural, native Arabic language** — book descriptions, reader reviews, and quotes provide diverse, high-quality Arabic text (including regional dialects in reviews) that is difficult to source at this volume and quality elsewhere.
- 🤖 Powering search, discovery, and analytics tools for Arabic-language content.


### Input

The scraper takes one or more **start URLs** (Abjjad listing/category pages) and a **max items** limit per URL.

| Field                | Type   | Description                                                             |
| -------------------- | ------ | ------------------------------------------------------------------------ |
| `startUrls`          | array  | Abjjad listing/category/detail page URLs to scrape.                            |
| `maxItems`           | number | Maximum number of books to scrape per start URL.                        |
| `proxyConfiguration` | object | Optional proxy settings.                                                |


#### Example input

```json
{
  "maxItems": 5,
  "startUrls": [
    {
      "url": "https://www.abjjad.com/books/220759001/%D8%B1%D9%88%D8%A7%D9%8A%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D8%B5"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

### Output

```json
{
  "url": "https://www.abjjad.com/book/15445088/%D9%8A%D9%88%D8%AA%D9%88%D8%A8%D9%8A%D8%A7/2213150869",
  "bookId": "15445088",
  "editionId": "2213150869",
  "title": "يوتوبيا",
  "authorName": "أحمد خالد توفيق",
  "authorId": "6804753",
  "authorUrl": "https://www.abjjad.com/author/6804753/أحمد-خالد-توفيق",
  "description": "كيف ستكون مصر عام 2023؟ لقد عزَلَ الأغنياء أنفسهم في (يوتوبيا) الساحل الشمالي تحت حراسة المارينز الأمريكيين...",
  "coverImageUrl": "https://cdn.abjjad.com/pub/3b713160-3e4a-4d2e-be30-c52e1ee5756b-192X290.png",
  "coverFullUrl": "https://cdn.abjjad.com/pub/3b713160-3e4a-4d2e-be30-c52e1ee5756b.png",
  "format": "electronic",
  "isFree": false,
  "publishedYear": 2019,
  "pageCount": 176,
  "isbn": "9789770933077",
  "publisherName": "دار الشروق",
  "publisherId": "229155",
  "publisherUrl": "https://www.abjjad.com/publisher/229155/دار-الشروق",
  "mainCategory": {
    "name": "روايات ديستوبيا",
    "url": "https://www.abjjad.com/books/220759001/روايات-وقصص/220759006/روايات-ديستوبيا"
  },
  "subCategories": [
    { "name": "روايات سياسية", "url": "https://www.abjjad.com/books/220759001/روايات-وقصص/220759011/روايات-سياسية" },
    { "name": "روايات اجتماعية", "url": "https://www.abjjad.com/books/220759001/روايات-وقصص/220759012/روايات-اجتماعية" },
    { "name": "روايات خيالية", "url": "https://www.abjjad.com/books/220759001/روايات-وقصص/220759043/روايات-خيالية" }
  ],
  "ratingValue": 4.1,
  "ratingCount": 1575,
  "reviewCount": 1600,
  "communityCount": 11435,
  "featuredQuote": "عندما تشم الحريق ولا تنذر من حولك.. فأنت بشكل ما ساهمت في إشعال الحريق",
  "reviews": [
    {
      "reviewId": "2112880664",
      "reviewerName": "Zainab",
      "reviewerUrl": "https://www.abjjad.com/profile/2094137362/zainab",
      "reviewRating": 5,
      "text": "شعرت بالألم الذي يضرب بالأعماق الوجدانية والفكرية بسبب الكاتب المختلف أحمد خالد توفيق...",
      "date": "2015-12-01T00:00:00",
      "permalink": "https://www.abjjad.com/review/2112880664",
      "agreeCount": 10
    }
  ]
}
```

#### Field reference

| Field              | Type                | Description                                                                 |
| ------------------ | ------------------- | ---------------------------------------------------------------------------- |
| `url`              | string              | Canonical book (edition) page URL.                                          |
| `bookId`           | string | null      | Abjjad's book identifier.                                                   |
| `editionId`        | string | null      | Abjjad's edition identifier (a book can have multiple editions).            |
| `title`            | string | null      | Book title in Arabic.                                                       |
| `authorName`       | string | null      | Author's name in Arabic.                                                    |
| `authorId`         | string | null      | Abjjad's author identifier.                                                 |
| `authorUrl`        | string | null      | Link to the author's Abjjad profile page.                                   |
| `description`      | string | null      | Book blurb/synopsis in Arabic.                                              |
| `coverImageUrl`    | string | null      | Thumbnail cover image URL.                                                   |
| `coverFullUrl`     | string | null      | Full-resolution cover image URL.                                            |
| `format`           | string | null      | Book format, e.g. `electronic`.                                             |
| `isFree`           | boolean             | Whether the book is free to read without a subscription.                    |
| `publishedYear`    | number | null      | Year the edition was published.                                             |
| `pageCount`        | number | null      | Number of pages.                                                            |
| `isbn`             | string | null      | ISBN-13 of the edition, when available.                                     |
| `publisherName`    | string | null      | Publisher's name in Arabic.                                                 |
| `publisherId`      | string | null      | Abjjad's publisher identifier.                                              |
| `publisherUrl`     | string | null      | Link to the publisher's Abjjad page.                                        |
| `mainCategory`     | object | null      | Primary genre/category (`name`, `url`).                                     |
| `subCategories`    | object\[]            | Additional genre/category tags (`name`, `url`).                             |
| `ratingValue`      | number | null      | Average reader rating out of 5.                                             |
| `ratingCount`      | number | null      | Number of ratings.                                                          |
| `reviewCount`      | number | null      | Number of written reviews.                                                  |
| `communityCount`   | number | null      | Number of readers who have shelved/interacted with the book.                |
| `featuredQuote`    | string | null      | The quote Abjjad highlights on the book page, in Arabic.                     |
| `reviews`          | object\[]            | Reader reviews rendered on the page (see below).                            |
| `reviews[].reviewId` | string | null    | Abjjad's review identifier.                                                 |
| `reviews[].reviewerName` | string | null | Reviewer's display name.                                                    |
| `reviews[].reviewerUrl`  | string | null | Link to the reviewer's Abjjad profile.                                      |
| `reviews[].reviewRating` | number | null | Star rating (1–5) the reviewer gave.                                        |
| `reviews[].text`         | string | null | Full review text, in Arabic (including local dialects).                     |
| `reviews[].date`         | string | null | ISO datetime the review was posted.                                         |
| `reviews[].permalink`    | string | null | Direct link to the review.                                                  |
| `reviews[].agreeCount`   | number | null | Number of readers who agreed with the review.                               |

### ❓ FAQ

**Can I use this data to train Arabic language models?**
Yes — this is one of the strongest use cases for this scraper. Book descriptions and, especially, reader reviews are natural, native Arabic text written by real people across the Arab world, including regional dialects and informal phrasing that's rare in most Arabic text corpora (which tend to be formal news or government text). This makes Abjjad data well-suited for pretraining, fine-tuning, or evaluating LLMs on conversational and literary Modern Standard Arabic as well as dialect.

**Does the scraper work on any Abjjad category?**
Yes — provide any listing/category URL (e.g. novels, history, religion, business, philosophy) and the scraper paginates through it automatically.

**Can I scrape reader reviews, or just book metadata?**
Both — every book record includes bibliographic metadata (title, author, edition, category, ratings) as well as the reviews rendered on the page. If you only want metadata, the `reviews` field can simply be dropped downstream.

**Is the data only in Arabic?**
Titles, descriptions, categories, and reviews are all in Arabic, as published on Abjjad. Some author/publisher names may include Latin-script transliterations where Abjjad provides them.

**Can I track rating and review trends over time?**
Yes — by scheduling runs on Apify, you can monitor how a book's rating, rating count, and review count change over time.

**Can I scrape a specific book directly?**
Yes, the scraper currently starts from both listing/category and detail pages.

***

### 🛠️ Need a custom extension?

Need this scraper adapted to your use case — extra fields, full review history, another Abjjad section, or a different output format? Just reach out to us by email and we'll be happy to help.

# Actor input Schema

## `startUrls` (type: `array`):

URLs to scrape

## `maxItems` (type: `integer`):

The maximum number of items to fetch

## `proxyConfiguration` (type: `object`):

Your proxy configuration from Apify

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.abjjad.com/books/220759001/%D8%B1%D9%88%D8%A7%D9%8A%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D8%B5"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.abjjad.com/books/220759001/%D8%B1%D9%88%D8%A7%D9%8A%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D8%B5"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boring_internet_explorer/abjjad-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.abjjad.com/books/220759001/%D8%B1%D9%88%D8%A7%D9%8A%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D8%B5" }] }

# Run the Actor and wait for it to finish
run = client.actor("boring_internet_explorer/abjjad-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.abjjad.com/books/220759001/%D8%B1%D9%88%D8%A7%D9%8A%D8%A7%D8%AA-%D9%88%D9%82%D8%B5%D8%B5"
    }
  ]
}' |
apify call boring_internet_explorer/abjjad-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=boring_internet_explorer/abjjad-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Abjjad أبجد Books Scraper - Arabic Book Details for LLM",
        "description": "Scrape books, ratings & reviews from Abjjad أبجد — the largest Arabic reading platform. Get structured data from any category: titles, descriptions, editions, publishers, and natural Arabic reviews with dialect. Ideal for LLM training data, Arabic NLP, and book market research.",
        "version": "0.0",
        "x-build-id": "HVJRMeWAEFzJX98fc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/boring_internet_explorer~abjjad-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-boring_internet_explorer-abjjad-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/boring_internet_explorer~abjjad-scraper/runs": {
            "post": {
                "operationId": "runs-sync-boring_internet_explorer-abjjad-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/boring_internet_explorer~abjjad-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-boring_internet_explorer-abjjad-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs to scrape",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "type": "integer",
                        "description": "The maximum number of items to fetch",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Your proxy configuration from Apify",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
