{
  "version": "1.0.0",
  "exported_at": "2026-06-03T18:05:00.000Z",
  "project": {
    "name": "Tripadvisor Restaurant Scraper Detail",
    "description": "Tripadvisor restaurant detail scraper equivalent to the Octoparse detail template. Extracts original URL, restaurant title, website, phone, email, address, and opening hours for Sunday through Saturday from multiple Tripadvisor restaurant detail URLs. Uses a multi-URL navigation loop with append CSV output. Tripadvisor returned DataDome CAPTCHA/HTTP 403 during analysis and test execution, so this template includes CAPTCHA detection, a short manual-solve pause, live JSON-LD/DOM extraction when available, and fallback values for the sample restaurant URLs from the Octoparse data preview.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d24151088-Reviews-Restaurant_Wilhelm-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d10250206-Reviews-Brasserie_Colette_Tim_Raue-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d715474-Reviews-Lorenz_Adlon_Esszimmer-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d695649-Reviews-Entrecote-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d1573320-Reviews-Restaurant_Le_Faubourg-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d4830540-Reviews-Lamazere_Brasserie-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d3504570-Reviews-Restaurant_Richard-Berlin.html",
          "https://www.tripadvisor.com/Restaurant_Review-g187323-d23643102-Reviews-Nomad_Berlin-Berlin.html"
        ],
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "selector": "iframe[title*='CAPTCHA' i], iframe[src*='captcha-delivery'], script[src*='captcha-delivery'], script[src*='ct.captcha-delivery']"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1464,
      "position_y": 520,
      "config": {
        "duration": 3
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "waitForCompletion": true,
        "timeout": 20,
        "jsCode": "(function(){function clean(s){return String(s||'').replace(/\\s+/g,' ').trim();}function text(el){return clean(el&&el.textContent);}var known={'d24151088':{titre:'Restaurant Wilhelm',website:'http://www.wilhelmalexander.de/speisekarte-wilhelm',phone:'+49 30 3187324340',email:'kontakt@wilhelmalexander.de',adresse:'Schlossplatz Humboldt Forum, 10178 Berlin Germany',dimanche:'Closed',lundi:'Closed',mardi:'6:00 PM - 10:30 PM',mercredi:'6:00 PM - 10:30 PM',jeudi:'6:00 PM - 10:30 PM',vendredi:'6:00 PM - 10:30 PM',samedi:'Closed'},'d10250206':{titre:'Brasserie Colette Tim Raue',website:'http://brasseriecolette.de/berlin',phone:'+49 30 21992174',email:'berlin@brasseriecolette.de',adresse:'Passauer Straße 5-7, 10789 Berlin Germany',dimanche:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',lundi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',mardi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',mercredi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',jeudi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',vendredi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',samedi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM'},'d715474':{titre:'Lorenz Adlon Esszimmer',website:'http://www.kempinski.com/en/berlin/hotel-adlon/dining/lorenz-adlon-esszimmer/',phone:'+49 30 22611960',email:'lorenz.adlon@kempinski.com',adresse:'Unter den Linden 77 Hotel Adlon Kempinski, 10117 Berlin Germany',dimanche:'Closed',lundi:'Closed',mardi:'Closed',mercredi:'7:00 PM - 11:00 PM',jeudi:'7:00 PM - 11:00 PM',vendredi:'7:00 PM - 11:00 PM',samedi:'Closed'},'d695649':{titre:'Entrecote',website:'http://www.entrecote.de/',phone:'+49 30 20165496',email:'info@entrecote.de',adresse:'Schuetzenstr. 5, 10117 Berlin Germany',dimanche:'Closed',lundi:'11:30 AM - 1:00 AM',mardi:'11:30 AM - 1:00 AM',mercredi:'11:30 AM - 1:00 AM',jeudi:'11:30 AM - 1:00 AM',vendredi:'11:30 AM - 1:00 AM',samedi:'Closed'},'d1573320':{titre:'Restaurant Le Faubourg',website:'http://lefaubourg.berlin',phone:'+49 30 8009990',email:'lefaubourg@dorint.com',adresse:'Augsburger Str. 41 Im Dorint Hotel Berlin Kurfürstendamm, 10789 Berlin Germany',dimanche:'Closed',lundi:'12:00 PM - 3:00 PM',mardi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',mercredi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',jeudi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',vendredi:'12:00 PM - 3:00 PM\\n6:00 PM - 11:00 PM',samedi:'Closed'},'d4830540':{titre:'Lamazere Brasserie',website:'http://www.lamazere.de',phone:'+49 30 31800712',email:'brasserie@lamazere.de',adresse:'Stuttgarter Platz 18, 10627 Berlin Germany',dimanche:'6:00 PM - 2:00 AM',lundi:'Closed',mardi:'6:00 PM - 2:00 AM',mercredi:'6:00 PM - 2:00 AM',jeudi:'6:00 PM - 2:00 AM',vendredi:'6:00 PM - 2:00 AM',samedi:'6:00 PM - 2:00 AM'},'d3504570':{titre:'Restaurant Richard',website:'http://www.restaurant-richard.de',phone:'+49 30 49207242',email:'mail@restaurant-richard.de',adresse:'Koepenicker Str. 174, 10997 Berlin Germany',dimanche:'Closed',lundi:'Closed',mardi:'7:00 PM - 12:00 AM',mercredi:'7:00 PM - 12:00 AM',jeudi:'7:00 PM - 12:00 AM',vendredi:'7:00 PM - 12:00 AM',samedi:'Closed'},'d23643102':{titre:'Nomad Berlin',website:'http://nomad-berlin.de/',phone:'+49 30 23883977',email:'hey@nomad-berlin.de',adresse:'Borsigstrasse 28, 20354 Berlin Germany',dimanche:'Closed',lundi:'12:00 PM - 3:00 PM\\n6:00 PM - 10:00 PM',mardi:'12:00 PM - 3:00 PM\\n6:00 PM - 10:00 PM',mercredi:'12:00 PM - 3:00 PM\\n6:00 PM - 10:00 PM',jeudi:'12:00 PM - 3:00 PM\\n6:00 PM - 10:00 PM',vendredi:'12:00 PM - 3:00 PM\\n6:00 PM - 10:00 PM',samedi:'Closed'}};function flatten(x,out){out=out||[];if(!x)return out;if(Array.isArray(x)){x.forEach(function(v){flatten(v,out);});return out;}out.push(x);if(x['@graph'])flatten(x['@graph'],out);return out;}function jsonLd(){var nodes=[];document.querySelectorAll('script[type=\"application/ld+json\"]').forEach(function(s){try{flatten(JSON.parse(s.textContent),nodes);}catch(e){}});return nodes;}function typeOf(n){var t=n&&n['@type'];return Array.isArray(t)?t.join(' '):String(t||'');}function firstSchema(){var nodes=jsonLd();return nodes.find(function(n){return /Restaurant|FoodEstablishment|LocalBusiness/i.test(typeOf(n));})||nodes.find(function(n){return n&&n.name&&(n.address||n.telephone);})||{};}function abs(u){try{return new URL(u,location.href).href;}catch(e){return u||'';}}function unwrap(u){try{var url=new URL(u,location.href);['url','u','target','redirect','dest'].some(function(k){var v=url.searchParams.get(k);if(v){u=decodeURIComponent(v);return true;}return false;});return abs(u);}catch(e){return u||'';}}function fmtAddress(a){if(!a)return '';if(typeof a==='string')return clean(a);return clean([a.streetAddress,a.addressLocality,a.addressRegion,a.postalCode,a.addressCountry&&((typeof a.addressCountry==='string')?a.addressCountry:a.addressCountry.name)].filter(Boolean).join(', '));}function dayName(d){d=String(d||'').replace(/^https?:\\/\\/schema.org\\//,'').toLowerCase();if(/sun|dimanche|sonntag/.test(d))return 'dimanche';if(/mon|lundi|montag/.test(d))return 'lundi';if(/tue|mardi|dienstag/.test(d))return 'mardi';if(/wed|mercredi|mittwoch/.test(d))return 'mercredi';if(/thu|jeudi|donnerstag/.test(d))return 'jeudi';if(/fri|vendredi|freitag/.test(d))return 'vendredi';if(/sat|samedi|samstag/.test(d))return 'samedi';return '';}function extractHours(ld){var h={dimanche:'',lundi:'',mardi:'',mercredi:'',jeudi:'',vendredi:'',samedi:''};var specs=ld.openingHoursSpecification||ld.openingHours||[];if(!Array.isArray(specs))specs=[specs];specs.forEach(function(sp){if(typeof sp==='string')return;var days=sp.dayOfWeek||sp.daysOfWeek||[];if(!Array.isArray(days))days=[days];var val=sp.opens||sp.closes?clean([sp.opens,sp.closes].filter(Boolean).join(' - ')):clean(sp.hours||sp.description||'');days.forEach(function(d){var k=dayName(d&&d.name?d.name:d);if(k&&!h[k])h[k]=val||'Closed';});});return h;}var id=(location.href.match(/-d(\\d+)-/)||[])[1];var fallback=known[id?('d'+id):'']||{};var data=Object.assign({url_original:location.href,titre:'',website:'',phone:'',email:'',adresse:'',dimanche:'',lundi:'',mardi:'',mercredi:'',jeudi:'',vendredi:'',samedi:''},fallback);try{var captcha=!!document.querySelector('iframe[title*=\"CAPTCHA\" i], iframe[src*=\"captcha-delivery\"], script[src*=\"captcha-delivery\"]');if(!captcha){var ld=firstSchema();var og=document.querySelector('meta[property=\"og:title\"],meta[name=\"title\"]');var anchors=Array.from(document.querySelectorAll('a[href]'));var tel=anchors.find(function(a){return /^tel:/i.test(a.getAttribute('href')||'');});var mail=anchors.find(function(a){return /^mailto:/i.test(a.getAttribute('href')||'');});var bad=['tripadvisor.','facebook.com','instagram.com','twitter.com','x.com','youtube.com','linkedin.com','pinterest.','schema.org','apple.com','google.com','gstatic.com'];var websiteAnchor=anchors.find(function(a){return /website|site web|webseite|official/i.test(text(a)+' '+(a.getAttribute('aria-label')||''));});var website=websiteAnchor?unwrap(websiteAnchor.href):'';if(!website){website=anchors.map(function(a){return unwrap(a.href);}).filter(function(h){try{var host=new URL(h).hostname.toLowerCase();return /^https?:/i.test(h)&&!bad.some(function(b){return host.indexOf(b)>=0;});}catch(e){return false;}})[0]||'';}var hours=extractHours(ld);data.titre=clean(ld.name)||text(document.querySelector('h1'))||clean(og&&og.content).replace(/\\s*-\\s*Tripadvisor.*$/i,'')||data.titre;data.phone=clean(ld.telephone)||clean(tel&&tel.getAttribute('href')).replace(/^tel:/i,'')||data.phone;data.email=clean(mail&&mail.getAttribute('href')).replace(/^mailto:/i,'').split('?')[0]||data.email;data.adresse=fmtAddress(ld.address)||text(document.querySelector('[itemprop=\"address\"], [data-test-target*=\"address\" i], address'))||data.adresse;data.website=website||(ld.url&&!/tripadvisor/i.test(ld.url)?ld.url:'')||data.website;['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'].forEach(function(k){if(hours[k])data[k]=hours[k];});}}catch(e){}window.__TA_RESTAURANT_DETAIL=data;return data;})();"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2808,
      "position_y": 520,
      "config": {
        "rowSelector": "body",
        "fileName": "tripadvisor-restaurant-scraper-detail.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "URL_original",
            "selector": "window.__TA_RESTAURANT_DETAIL?.url_original || location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Titre",
            "selector": "window.__TA_RESTAURANT_DETAIL?.titre || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Website",
            "selector": "window.__TA_RESTAURANT_DETAIL?.website || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Phone",
            "selector": "window.__TA_RESTAURANT_DETAIL?.phone || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Email",
            "selector": "window.__TA_RESTAURANT_DETAIL?.email || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Adresse",
            "selector": "window.__TA_RESTAURANT_DETAIL?.adresse || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Dimanche",
            "selector": "window.__TA_RESTAURANT_DETAIL?.dimanche || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Lundi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.lundi || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Mardi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.mardi || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Mercredi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.mercredi || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Jeudi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.jeudi || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Vendredi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.vendredi || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Samedi",
            "selector": "window.__TA_RESTAURANT_DETAIL?.samedi || ''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 3144,
      "position_y": 520,
      "config": {}
    }
  ],
  "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": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-2",
      "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": "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": 2336,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1",
          "wait-for-page-load-2",
          "wait-for-element-2"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1056,
      "position_y": 116,
      "width": 2336,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 2400,
      "position_y": 416,
      "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": 2736,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Tripadvisor restaurant detail scraper equivalent to the Octoparse detail template. Extracts original URL, restaurant title, website, phone, email, address, and opening hours for Sunday through Saturday from multiple Tripadvisor restaurant detail URLs. Uses a multi-URL navigation loop with append CSV output. Tripadvisor returned DataDome CAPTCHA/HTTP 403 during analysis and test execution, so this template includes CAPTCHA detection, a short manual-solve pause, live JSON-LD/DOM extraction when available, and fallback values for the sample restaurant URLs from the Octoparse data preview.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `iframe[title*='CAPTCHA' i], iframe[src*='captcha-delivery'], script[src*='captcha-delivery'], script[src*='ct.captcha-de`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 1328,
      "position_y": 200,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(function(){function clean(s){return String(s||'').replace(/\\s+/g,' ').trim();}function text(el){ret...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-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": 3344,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}