# Tabelog Japan Restaurant Scraper (`cloud9_ai/tabelog-scraper`) Actor

Scrape Japan's #1 restaurant site Tabelog: ratings (0-5), reviews, genres, budget, location, hours, photos. 800K+ restaurants. Ideal for market research, travel apps, food delivery analytics, location intelligence.

- **URL**: https://apify.com/cloud9\_ai/tabelog-scraper.md
- **Developed by:** [cloud9](https://apify.com/cloud9_ai) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 48 total users, 4 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/actors/running/actors-in-store.md#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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Tabelog Scraper

Extract restaurant data from Tabelog (食べログ), Japan's largest restaurant review platform. Get names, ratings, review counts, genres, budgets, and images with advanced filtering options.

### Features

- **Comprehensive Restaurant Data** - Scrape names, URLs, addresses, ratings, review counts, genres, dinner/lunch budgets, and images
- **Advanced Filtering** - Search by keyword (cuisine type, restaurant name) and area with full Japanese support
- **Flexible Sorting** - Sort results by highest rating or most reviews
- **Pagination Support** - Handle up to 500 results across multiple pages
- **robots.txt Compliant** - Respects Tabelog's crawling guidelines with 2+ second request intervals
- **Lazy Loading Support** - Automatically detects and extracts lazy-loaded images
- **Reliable Data Extraction** - Multiple CSS selector fallbacks ensure high extraction accuracy
- **Structured Output** - Clean JSON dataset with ISO 8601 timestamps

### Use Cases

- **Market Research**: Analyze restaurant trends, ratings distribution, and popularity metrics across Japanese markets
- **Restaurant Database**: Build a comprehensive catalog of Japanese restaurants with ratings and reviews for discovery platforms
- **Competitive Analysis**: Monitor competitor restaurants in specific areas and compare ratings, pricing, and customer engagement
- **Food Tourism**: Create guides and recommendations based on Tabelog's verified ratings and reviews
- **Business Intelligence**: Track restaurant performance metrics, identify trending cuisines, and analyze regional preferences
- **Data Journalism**: Source restaurant market data for articles about Japan's dining scene
- **Integration with CRM/Analytics**: Feed restaurant data into Zapier, Google Sheets, or custom APIs for further analysis

### Input

```json
{
  "keyword": "ラーメン",
  "area": "東京",
  "maxResults": 50,
  "sortBy": "rating"
}
```

#### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `keyword` | String | No | - | Search keyword (e.g., restaurant name or cuisine type like 'ラーメン', '寿司', 'イタリアン') |
| `area` | String | No | - | Area name in Japanese (e.g., '東京', '大阪', '渋谷'). Used to narrow search results by location. |
| `maxResults` | Integer | No | 20 | Maximum number of restaurants to fetch. Min: 1, Max: 500. Results are paginated (20 per page). |
| `sortBy` | String | No | rating | Sort order for results: `rating` (highest first) or `review_count` (most reviews first) |

### Output

Each restaurant record contains:

```json
{
  "name": "ラーメン横丁 渋谷店",
  "url": "https://tabelog.com/tokyo/A1303/A130301/13012345/",
  "address": "東京都渋谷区渋谷1-2-3",
  "phoneNumber": null,
  "genre": "ラーメン",
  "rating": 3.58,
  "reviewCount": 247,
  "budgetDinner": "～1000円",
  "budgetLunch": "～800円",
  "imageUrl": "https://image.tabelog.com/...jpg",
  "scrapedAt": "2025-02-12T10:30:45.123Z"
}
```

#### Output Fields

| Field | Type | Description |
|-------|------|-------------|
| `name` | String | Restaurant name |
| `url` | String | Direct link to Tabelog restaurant page |
| `address` | String | Full address in Japanese |
| `phoneNumber` | String/Null | Phone number (typically null on search results pages) |
| `genre` | String | Cuisine type or restaurant category |
| `rating` | Number | Tabelog rating (typically 0-5 scale) |
| `reviewCount` | Number | Total number of customer reviews |
| `budgetDinner` | String | Typical dinner budget (e.g., '～2000円', '2000～3000円') |
| `budgetLunch` | String | Typical lunch budget (e.g., '～1000円') |
| `imageUrl` | String/Null | URL to restaurant photo/image |
| `scrapedAt` | String | ISO 8601 timestamp of when data was extracted |

### Pricing

**$3 per 1,000 restaurants**

#### Cost Examples

| Results | Cost |
|---------|------|
| 50 restaurants | $0.15 |
| 100 restaurants | $0.30 |
| 500 restaurants | $1.50 |
| 1,000 restaurants | $3.00 |
| 5,000 restaurants | $15.00 |

### Tips

1. **Narrow Your Search** - Combine `keyword` and `area` for more targeted results and lower costs. For example, searching for "ラーメン" (ramen) in "渋谷" returns only relevant results.

2. **Start with Small Batches** - Begin with `maxResults: 50` to preview data before scaling to larger datasets.

3. **Sort by Rating for Quality** - Use `sortBy: "rating"` to get the most highly-rated restaurants first, useful for quality-focused research.

4. **Sort by Reviews for Popularity** - Use `sortBy: "review_count"` to identify the most popular/established restaurants with more customer feedback.

5. **Use Area Codes Correctly** - Area names should match Tabelog's area system (prefectures like '東京', '大阪' or specific districts like '渋谷', '新宿').

6. **Plan for Pagination** - Results are 20 per page. If you set `maxResults: 100`, the actor automatically crawls 5 pages. Plan execution time accordingly.

7. **Image Handling** - The actor detects lazy-loaded images. Some images may be null if not available on the search results page.

8. **Extract URLs for Details** - Use returned `url` fields to make follow-up API calls or manual visits to get additional details like full menus, opening hours, or full reviews.

### Integrations

Export your restaurant data to multiple platforms:

- **Google Sheets** - Automatically sync results with Zapier
- **Excel/CSV** - Download dataset and import into spreadsheets
- **Webhooks** - Send data to custom APIs for real-time processing
- **Direct API Access** - Use Apify API to fetch results programmatically
- **Zapier/Make** - Build automation workflows with restaurant data
- **Email** - Receive results directly in your inbox
- **Cloud Storage** - Export to Google Drive, Dropbox, or AWS S3

### Support

For issues, feature requests, or questions:

- Check the [Apify Documentation](https://docs.apify.com)
- Review Tabelog's [Terms of Service](https://tabelog.com/) before using at scale
- Open an issue on GitHub or contact Apify Support

**Legal Note**: This actor is provided for educational and research purposes. When using at scale, ensure compliance with Tabelog's Terms of Service and robots.txt guidelines. The actor respects these guidelines with built-in 2+ second request intervals.

### License

Apache-2.0 License

# Actor input Schema

## `keyword` (type: `string`):

Search keyword (e.g., restaurant name, cuisine type such as 'ラーメン', '寿司')

## `area` (type: `string`):

Area name in Japanese (e.g., '東京', '大阪', '渋谷'). Used to build the search URL.

## `maxResults` (type: `integer`):

Maximum number of restaurant results to fetch (default: 20)

## `sortBy` (type: `string`):

Sort order for results

## Actor input object example

```json
{
  "keyword": "ラーメン",
  "area": "東京",
  "maxResults": 20,
  "sortBy": "rating"
}
```

# 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 = {
    "keyword": "ラーメン"
};

// Run the Actor and wait for it to finish
const run = await client.actor("cloud9_ai/tabelog-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 = { "keyword": "ラーメン" }

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

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

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

```

## CLI example

```bash
echo '{
  "keyword": "ラーメン"
}' |
apify call cloud9_ai/tabelog-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cloud9_ai/tabelog-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/weNHe90738rPyev2a/builds/vEOjNiBUgS1DGUKpm/openapi.json
