# Gurunavi Japan Restaurant Scraper (`piquno/gurunavi-japan-restaurant-scraper`) Actor

Scrape restaurant data from Gurunavi (ぐるなび), one of Japan's biggest restaurant guides: names, genres, budgets, access, course menus with prices, photos, and with details addresses, GPS coordinates, phone numbers, hours, seating and payment methods across all 47 prefectures. HTTP-only, no API key.

- **URL**: https://apify.com/piquno/gurunavi-japan-restaurant-scraper.md
- **Developed by:** [Piquno](https://apify.com/piquno) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Gurunavi Japan Restaurant Scraper

Scrape restaurant data from **[Gurunavi (ぐるなび)](https://r.gnavi.co.jp)**, one of Japan's largest restaurant guides and reservation platforms, covering every prefecture. Get names, genres, lunch and dinner budgets, station access, advertised set courses with prices, photos and online-reservation availability straight from the search results, and, with detail pages enabled, full addresses, GPS coordinates, phone numbers, opening hours, closed days, seating, private rooms, smoking policy, accepted cards and e-money, and more.

HTTP-only. No browser, no API key, no login. Gurunavi ships its search results as structured JSON inside the page, so the scraper reads clean data instead of guessing at CSS classes.

### What you can do with it

- **Lead generation** – build lists of restaurants by area and genre for B2B sales (POS, payments, delivery, staffing, supplies).
- **Market research** – compare budgets, course prices and genre mix across neighbourhoods or cities.
- **Location intelligence** – geocoded restaurant points (with `includeDetails`) for mapping, site selection and competitor analysis.
- **Data enrichment** – match Gurunavi records to your own database by name, phone or address.
- **Travel and food apps** – keep restaurant catalogues fresh.

### How it works

1. Pick a **prefecture** (all 47 supported), optionally a **sub-area** (e.g. 新宿, 梅田, 博多) and a **genre** (izakaya, sushi, ramen, yakiniku…).
2. Choose a **crawl mode**. Gurunavi caps any single search at roughly 10,000 results, so the default splits the prefecture into its sub-areas and paginates each one; `subareas-genres` goes one level deeper for exhaustive coverage.
3. Or paste your own **Start URLs** – any `https://r.gnavi.co.jp/area/…/rs/` search page, filters included. Each one is paginated for you.
4. Set **Max restaurants** and, if you want the rich fields, tick **Scrape detail pages**.

Results land in the run's dataset, one item per restaurant, with ready-made table views for Overview, Location & contact, Facilities and Courses.

### Proxy

The default is Apify's datacenter proxy pool, which served Gurunavi listing and detail pages fine in testing and is the cheapest option. Gurunavi does redirect some IP ranges to its corporate site (www.gnavi.co.jp); if that happens the Actor logs a clear "Redirected to www.gnavi.co.jp" warning and falls back to browser-impersonated requests. If a run still comes back empty, switch the proxy to **Residential** with country **Japan** and re-run.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `prefecture` | string | `tokyo` | Prefecture slug (e.g. `tokyo`, `osaka`, `kyoto`, `fukuoka`, `hokkaido`). |
| `area` | string | – | Sub-area name (Japanese) or code such as `areal2115`. Partial matches allowed. |
| `genre` | string | all | One of `izakaya`, `japanese`, `sushi`, `roastmeat`, `western`, `buffet`, `curry`, `chinese`, `continental`, `hotpots`, `ethnic`, `noodle`, `beerandcuisine`, `cafe`, `entertainment`, `casual`, `others`. |
| `crawlMode` | string | `subareas` | `subareas`, `prefecture`, or `subareas-genres`. |
| `startUrls` | array | – | Gurunavi search URLs. Overrides the fields above. |
| `maxResults` | integer | `100` | Unique restaurants to collect. |
| `includeDetails` | boolean | `false` | Fetch each restaurant page (one extra request per restaurant). |
| `requestDelaySecs` | number | `1` | Pause after each request. |
| `maxConcurrency` | integer | `3` | Parallel requests. |
| `proxyConfiguration` | object | Apify datacenter | Switch to Residential (Japan) only if runs log the www.gnavi.co.jp redirect. |

Example:

```json
{
  "prefecture": "tokyo",
  "area": "新宿",
  "genre": "izakaya",
  "maxResults": 200,
  "includeDetails": true
}
```

### Output

Listing fields (always present): `shopId`, `urlShopNo`, `url`, `name`, `nameSub`, `category`, `lunchBudget`, `dinnerBudget`, `access`, `subAccess`, `info`, `memberType`, `suspended`, `attractivePoints`, `photo`, `photos`, `courseCount`, `minCoursePrice`, `courses[]` (name, price, discountPrice, menuCount), `vacancyDaysAvailable`, `instantBookingDays`, `isPromoted`, `prefecture`, `areaCode`, `sourceListUrl`.

Detail fields (with `includeDetails`): `displayName`, `nameReading`, `phone`, `phoneReservation`, `reservationUrl`, `openingHours`, `description`, `priceRange`, `acceptsReservations`, `genres`, `paymentAccepted`, `images`, `postalCode`, `prefectureName`, `city`, `streetAddress`, `address`, `latitude`, `longitude`, `amenities`, `accessFull`, `parking`, `hours`, `closedDays`, `budgetText`, `creditCards`, `eMoney`, `cancellationPolicy`, `totalSeats`, `seatingNotes`, `partyMax`, `charter`, `privateRoom`, `smoking`, `children`, `foreignLanguage`, `wifiPower`, `restroom`, `otherFacilities`, `menuServices`, `takeout`, `dressCode`, `scenes`, `sellingPoints`, `businessType`, `nearestStation`, `areaName`, `genreText`.

Example item:

```json
{
  "shopId": "g123456",
  "urlShopNo": "g123456",
  "url": "https://r.gnavi.co.jp/g123456/",
  "name": "個室居酒屋 なんとか 新宿店",
  "category": "居酒屋",
  "lunchBudget": 1000,
  "dinnerBudget": 4000,
  "access": "JR新宿駅 徒歩3分",
  "courseCount": 2,
  "minCoursePrice": 3800,
  "courses": [
    { "name": "2時間飲み放題付き 全8品", "price": 4500, "discountPrice": 3500, "menuCount": 8 }
  ],
  "vacancyDaysAvailable": 12,
  "instantBookingDays": 9,
  "isPromoted": false,
  "phone": "080-1234-5678",
  "phoneReservation": "050-1234-5678",
  "address": "東京都新宿区新宿3-1-1 ビル5F",
  "latitude": 35.6903,
  "longitude": 139.7005,
  "hours": "月～金 17:00～23:30 (L.O.23:00)",
  "openingHours": ["Mon-Fri 17:00-23:30"],
  "closedDays": "年中無休",
  "totalSeats": 120,
  "creditCards": ["VISA", "MasterCard", "JCB"],
  "smoking": "全席禁煙"
}
```

Export as JSON, CSV, Excel or XML from the dataset, or pull it through the Apify API.

### Pricing

Pay per result: you are charged only for restaurants actually saved to the dataset. A run with `includeDetails` makes about twice the requests but costs the same per restaurant. Start with a small `maxResults` to check the fields you need, then scale up.

### Tips

- Sub-area names are matched as substrings, so `新宿` also matches `新宿西口`. Use the `areal…` code from a Gurunavi URL for an exact pick.
- Use `crawlMode: "prefecture"` for a quick sample of a whole prefecture, `subareas` for full coverage, and `subareas-genres` when a single sub-area still exceeds ~10,000 restaurants (central Tokyo and Osaka).
- `phoneReservation` is Gurunavi's 050 forwarding number shown on the page; `phone` comes from the page's structured data and is usually the restaurant's own line.
- Prices and budgets are in Japanese yen. A course's `discountPrice` is the price after the advertised discount.

### Related scrapers

Looking for other Japanese restaurant data? See the HotPepper Gourmet, Tabelog and Retty scrapers by the same author for review scores, coupons and cross-platform matching.

### Legal

This Actor collects publicly available business information. You are responsible for using the data in line with Gurunavi's terms and applicable law, including Japan's Act on the Protection of Personal Information where relevant.

# Actor input Schema

## `prefecture` (type: `string`):

Which prefecture to crawl. Ignored when Start URLs are given.

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

Optional. Restrict to one Gurunavi sub-area inside the prefecture, by Japanese name (e.g. 新宿, 梅田, 博多) or by area code (e.g. areal2115). Partial name matches are fine.

## `genre` (type: `string`):

Optional. Restrict to one cuisine genre.

## `crawlMode` (type: `string`):

How to split the prefecture into searches. Gurunavi caps any single search at about 10,000 results, so splitting by sub-area (and genre) is how you reach every restaurant in a big prefecture.

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

Optional. Your own Gurunavi search-result URLs (any https://r.gnavi.co.jp/area/.../rs/ page, filters allowed). Each is paginated automatically. Overrides prefecture/area/genre.

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

Stop after this many unique restaurants. Each restaurant is one dataset item and one billable result.

## `includeDetails` (type: `boolean`):

Also open every restaurant's page for address, coordinates, phone, hours, closed days, seating, private rooms, smoking, payment methods and more. One extra request per restaurant.

## `requestDelaySecs` (type: `number`):

Pause after each successful request. 1 second is polite; go lower only with a residential proxy.

## `maxConcurrency` (type: `integer`):

Parallel requests. 3 is a safe default.

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

Apify datacenter proxies (the default) work for Gurunavi in testing and are the cheapest option. If a run logs "Redirected to www.gnavi.co.jp", Gurunavi is not serving that IP range: switch to Residential proxies with country Japan and re-run.

## Actor input object example

```json
{
  "prefecture": "tokyo",
  "area": "新宿",
  "genre": "",
  "crawlMode": "subareas",
  "startUrls": [],
  "maxResults": 100,
  "includeDetails": false,
  "requestDelaySecs": 1,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `restaurants` (type: `string`):

Restaurant records from Gurunavi. Listing-card fields are always present; detail fields are filled when includeDetails is true.

# 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": [],
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piquno/gurunavi-japan-restaurant-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": [],
    "maxResults": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piquno/gurunavi-japan-restaurant-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 '{
  "startUrls": [],
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piquno/gurunavi-japan-restaurant-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piquno/gurunavi-japan-restaurant-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/uYzPBgEnxCVjCpArS/builds/Hi66QvdV3Alxds5Pd/openapi.json
