{
  "version": "1.0.0",
  "exported_at": "2026-05-31T19:20:00.000Z",
  "project": {
    "name": "Mercari Product Details Scraping by URL",
    "description": "Extracts Mercari Japan product detail data from manually supplied item URLs. Uses a multi-URL navigation loop so all provided product URLs are visited and appended into one CSV. JavaScript helpers parse Mercari's dynamic product detail page, including delivery information. Mercari may show loading skeletons, deleted-product pages, access restrictions, or require a proxy/authenticated local browser session.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to each supplied Mercari product URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://jp.mercari.com/item/m78289055106",
          "https://jp.mercari.com/item/m11941501164",
          "https://jp.mercari.com/item/m60717044224",
          "https://jp.mercari.com/item/m74446682917",
          "https://jp.mercari.com/item/m16853171595",
          "https://jp.mercari.com/item/m71607270078",
          "https://jp.mercari.com/item/m26813018313",
          "https://jp.mercari.com/item/m87893686302",
          "https://jp.mercari.com/item/m40154662980",
          "https://jp.mercari.com/item/m64095577277"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "mercari",
          "product-url-loop"
        ]
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for browser page load event",
      "position_x": 480,
      "position_y": 220,
      "config": {
        "timeout": 45,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until the document body is available",
      "position_x": 840,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Allow Mercari client-side product data to finish loading",
      "position_x": 1200,
      "position_y": 220,
      "config": {
        "duration": 8,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Create robust Mercari extraction helpers and trigger lazy loading",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "jsCode": "(() => { const clean=s=>(s||'').replace(/\\s+/g,' ').trim(); const body=()=>document.body.innerText||''; const lines=()=>body().split('\\n').map(clean).filter(Boolean); const abs=u=>{try{return new URL(u,location.href).href}catch(e){return u||''}}; const labels=['カテゴリー','カテゴリ','商品の状態','配送料の負担','配送の方法','発送元の地域','発送までの日数','配送日の目安','商品の説明','商品説明','商品の情報','コメント']; const after=(names,stops=labels)=>{const a=lines(); const i=a.findIndex(x=>names.includes(x)); if(i<0)return []; const out=[]; for(let j=i+1;j<a.length;j++){ if(stops.includes(a[j]))break; if(a[j] && !['もっと見る','続きを読む'].includes(a[j]))out.push(a[j]); } return out;}; const firstAfter=(names)=>after(names)[0]||''; const findRe=re=>{const m=body().match(re); return m?clean(m[0]):''}; const metaValue=(keys)=>{const metas=Array.from(document.querySelectorAll('meta')); const m=metas.find(x=>keys.includes(x.getAttribute('property'))||keys.includes(x.getAttribute('name'))); return m?clean(m.content):''}; window.__US_MERCARI__={ title(){let v=clean(document.querySelector('h1')?.textContent)||metaValue(['og:title','twitter:title']); v=v.replace(/\\s*[|｜].*$/,'').replace(/の通販.*$/,'').trim(); if(!v||v==='メルカリ'){const a=lines(); const p=a.findIndex(x=>/^¥ ?[0-9,]+$/.test(x)); if(p>0)v=a[p-1];} return v||'';}, seller(){const a=document.querySelector('a[href*=\"/user/profile/\"]'); return a?abs(a.getAttribute('href')):'';}, price(){const vals=Array.from(document.querySelectorAll('[data-testid*=price], [aria-label*=価格], span, div, p')).map(e=>clean(e.textContent)); return vals.find(x=>/^¥ ?[0-9,]+$/.test(x))||findRe(/¥ ?[0-9,]+/)||'';}, availability(){const t=body(); if(/該当する商品は削除されています|商品は削除|ページが見つかりません|存在しません|Not Found/i.test(t))return 'NotAvailable'; if(/売り切れ|SOLD|sold out|購入できません/i.test(t))return 'OutOfStock'; return 'InStock';}, category(){return after(['カテゴリー','カテゴリ']).filter(x=>!/^¥ ?[0-9,]+$/.test(x)&&x!=='商品の情報').join(' > ');}, condition(){return firstAfter(['商品の状態']);}, shippingPayer(){return firstAfter(['配送料の負担'])||findRe(/送料込み[(（]出品者負担[)）]|着払い[(（]購入者負担[)）]/);}, shippingMethod(){const v=after(['配送の方法']).join(' / '); if(v)return v; const methods=['らくらくメルカリ便','ゆうゆうメルカリ便','ゆうメール','レターパック','普通郵便','定形郵便','定形外郵便','クリックポスト','ゆうパック','クロネコヤマト','宅急便','未定']; return methods.find(m=>body().includes(m))||'';}, region(){return firstAfter(['発送元の地域']);}, deliveryDays(){return firstAfter(['発送までの日数','配送日の目安'])||findRe(/[0-9０-９][~〜～][0-9０-９]日で発送/);}, image(){const metas=Array.from(document.querySelectorAll('meta')).map(m=>m.content).filter(Boolean); const meta=metas.find(u=>u.includes('mercdn.net/item/detail')||u.includes('static.mercdn.net/item/detail')); if(meta)return meta; const img=Array.from(document.images).map(i=>i.currentSrc||i.src).find(u=>u && (u.includes('mercdn.net/item/detail')||u.includes('static.mercdn.net/item/detail'))); return img||'';}, url(){return location.href;}, description(){const el=document.querySelector('[data-testid*=description], [aria-label*=説明]'); if(el&&clean(el.textContent).length>10)return el.textContent.trim(); const out=after(['商品の説明','商品説明'],['商品の情報','カテゴリー','カテゴリ','商品の状態','配送料の負担','配送の方法','発送元の地域','発送までの日数','配送日の目安','コメント']); if(out.join('\\n').trim())return out.join('\\n').trim(); return metaValue(['og:description','description']);}, missing(){const m=body().match(/該当する商品は削除されています。?|この商品は削除されました。?|ページが見つかりません。?|商品が見つかりません。?/); return m?m[0]:'';} }; window.scrollTo(0, Math.min(document.body.scrollHeight, 1200)); })();",
        "waitForCompletion": true,
        "timeout": 10,
        "color": "bg-[#a56eff]"
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Short wait after helper setup and lazy-load trigger",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "duration": 3,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Extract Mercari product detail fields into CSV",
      "position_x": 2280,
      "position_y": 220,
      "config": {
        "rowSelector": "body",
        "fileName": "mercari-url-based-product-listing-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "商品名",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.title()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "出品者URL",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.seller()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "価格",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.price()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "在庫状況",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.availability()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "カテゴリー",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.category()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "商品の状態",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.condition()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "配送料の負担",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.shippingPayer()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "配送の方法",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.shippingMethod()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "発送元の地域",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.region()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "配送日の目安",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.deliveryDays()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "画像",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.image()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "商品URL",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.url()) || location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "商品の説明",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.description()) || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "商品なし",
            "selector": "(window.__US_MERCARI__ && window.__US_MERCARI__.missing()) || ''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue to the next Mercari URL in the input list",
      "position_x": 2640,
      "position_y": 220,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "connections": [
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 2120,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1",
          "sleep-2"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1488,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2208,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2568,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Extracts Mercari Japan product detail data from manually supplied item URLs. Uses a multi-URL navigation loop so all provided product URLs are visited and appended into one CSV. JavaScript helpers parse Mercari's dynamic product detail page, including delivery information. Mercari may show loading skeletons, deleted-product pages, access restrictions, or require a proxy/authenticated local browser session.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-navigate-1",
      "element_type": "note",
      "title": "Note: Navigate",
      "content": "Multi-URL loop over 10 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 320,
      "position_y": 200,
      "width": 332,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(() => { const clean=s=>(s||'').replace(/\\s+/g,' ').trim(); const body=()=>document.body.innerText||...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 200,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (商品名, 出品者URL, 価格, 在庫状況, カテゴリー). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 2840,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}