بنقرة واحدة
tokyoartbeat
Platform rules and field mappings for the Tokyo Art Beat Taiwan events scraper
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Platform rules and field mappings for the Tokyo Art Beat Taiwan events scraper
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Planning principles, model selection, and scope rules for the Architect agent
Implementation rules for database migrations, Python scrapers, and Next.js web for the Engineer agent
BaseScraper contract, field rules, and Peatix-specific conventions for the Scraper Expert agent
Scraper test execution rules, output validation criteria, and report format for the Tester agent
BaseScraper contract, field rules, and Peatix-specific conventions for the Scraper Expert agent
Platform rules and field mappings for the 誠品生活日本橋 (eslite spectrum Nihonbashi) scraper
| name | tokyoartbeat |
| description | Platform rules and field mappings for the Tokyo Art Beat Taiwan events scraper |
--source tokyo_art_beat
Class: TokyoArtBeatScraper → key auto-derived as tokyo_art_beat (NOT tokyoartbeat).
/events/search?query=台湾 (URL-encoded).MAX_PAGES = 5, ~30 events/page).?page=N for pages 2+.title + body_text.YYYY-MM-DD from the URL path — most reliable source.| Field | Source |
|---|---|
source_id | tokyoartbeat_{slug_part} where slug_part = URL path after /events/-/ with / → _ (max 120 chars) |
source_url | Full event URL |
name_ja | Event <h1> title on detail page |
start_date | Extracted from URL: /events/-/{slug}/{venue-slug}/{YYYY-MM-DD} |
location_name | Venue name from detail page |
location_address | Venue address from detail page (if available) |
raw_description | "開催日時: YYYY年MM月DD日\n\n" + body_text |
⚠️ Venue header required:
raw_descriptionmust be prefixed with a structured venue block fetched from Contentful API (see "Venue Data" section below). Without it, annotator GPT will hallucinate well-known venues from training knowledge.
Event URLs contain the start date:
/events/-/Chen-Wei-Exhibition/ota-fine-arts-7chome/2026-04-21
_EVENT_URL_RE = re.compile(r"/events/-/[^/?#\s]+/[^/?#\s]+/(\d{4}-\d{2}-\d{2})")
This is more reliable than parsing date text from the detail page.
Server-side search for 台湾 returns broadly matching results. Apply client-side keyword filter on detail page content.
["台湾", "Taiwan", "臺灣", "台灣", "台北", "台中", "台南", "高雄", "台日", "日台"]
?query=台湾 is completely ignored by the TAB React client in headless mode. Zero Taiwan events are returned. TokyoArtBeatScraper() is commented out in main.py until a new approach is found.nextExport: true). Search results are loaded via a Contentful/Hasura backend API call that never completes in headless Playwright (requires either user interaction or authenticated session).multipleSearch form search button is never enabled even after accepting cookies.end_date should be set when the detail page shows an end date.Rule: Venue name, address, opening hours, and admission fee must be fetched from Contentful API and prepended as a structured header in raw_description. Do NOT rely on annotator GPT to infer venue information.
Why: GPT will hallucinate well-known Tokyo venues (e.g. 東京都現代美術館) for any exhibition whose raw_description lacks explicit location data. Incident: デニス・リン展 (id: 1e375d6c, 2026-05-02).
Contentful API flow:
# Step 1: Get event entry to find venue link id
GET /spaces/{space_id}/entries/{event_entry_id}
# → fields.venue.sys.id (e.g. "88E9E737")
# → fields.openingHours (fallback if venue has no hours)
# Step 2: Get venue entry
GET /spaces/{space_id}/entries/{venue_id}
# → fields.fullName (e.g. "Yukikomizutani")
# → fields.address (e.g. "東京都品川区東品川1-32-8 TERRADA ART COMPLEX II 1F")
# → fields.closedDays (e.g. "月・日・祝")
# → fields.openingHours (e.g. {"opens": "12:00", "closes": "18:00"})
# → fields.admissionFee (integer, 0 = free)
Required raw_description header:
開催日時: YYYY年MM月DD日 〜 YYYY年MM月DD日
会場: {fullName}
住所: {address}
開場時間: {openingHoursOpens}〜{openingHoursCloses}
休廊日: {closedDays}
入場料: {admissionFee}円(0 = 無料)
{original body_text}