{
  "version": "1.0.0",
  "exported_at": "2026-06-03T17:40:00.000Z",
  "project": {
    "name": "Zillow Profile Scraper",
    "description": "Best-effort Zillow profile scraper equivalent to the Octoparse template. Extracts page title, URL, profile name, company, city/state, bio, social links, phones, email, and address from multiple Zillow profile URLs using a navigate.urls loop. Navigation strategy: known profile URL list with loop-continue. Note: attached analysis and test runs show Zillow returning PerimeterX px-captcha / HTTP 403. This template cannot bypass human verification; blocked pages are detected and skipped instead of exporting captcha text as profile data.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.zillow.com/profile/GregAdamsRealty",
          "https://www.zillow.com/profile/celestereinholtz",
          "https://www.zillow.com/profile/robertzuniga"
        ],
        "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": 792,
      "position_y": 220,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "duration": 3
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "selector": "html",
        "timeout": 20,
        "visible": false
      }
    },
    {
      "block_id": "text-contains-1",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 1800,
      "position_y": 220,
      "config": {
        "text": "Access to this page has been denied",
        "selector": "html",
        "timeout": 5,
        "caseSensitive": false
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "jsCode": "Array.from(document.querySelectorAll('button,a')).filter(function(el){return /show more|read more|more/i.test((el.innerText||el.textContent||'').trim());}).slice(0,5).forEach(function(el){try{el.click();}catch(e){}});",
        "waitForCompletion": true,
        "timeout": 10
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 2304,
      "position_y": 800,
      "config": {
        "duration": 1
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2640,
      "position_y": 800,
      "config": {
        "rowSelector": "html",
        "fileName": "zillow-profile-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "Page_title",
            "selector": "document.title || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Page_URL",
            "selector": "location.href || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Original_URL",
            "selector": "location.href || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Profile_Name",
            "selector": "(function(){function flat(x){if(!x)return[];if(Array.isArray(x))return x.flatMap(flat);if(typeof x==='object')return [x].concat(Object.values(x).flatMap(flat));return[];}var scripts=Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map(function(s){try{return JSON.parse(s.textContent);}catch(e){return null;}});var objs=flat(scripts);var p=objs.find(function(o){return o&&o.name&&/Person|RealEstateAgent|Organization|LocalBusiness/i.test(String(o['@type']||''));});if(p&&p.name)return String(p.name).trim();var h1=document.querySelector('h1');if(h1&&(h1.innerText||h1.textContent||'').trim())return (h1.innerText||h1.textContent||'').trim();var og=document.querySelector('meta[property=\"og:title\"],meta[name=\"twitter:title\"]');var t=(og&&og.content)||document.title||'';return t.split(' - ')[0].trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_Name",
            "selector": "(function(){function walk(o){if(!o)return'';if(Array.isArray(o)){for(var i=0;i<o.length;i++){var r=walk(o[i]);if(r)return r;}}else if(typeof o==='object'){if(o.worksFor)return typeof o.worksFor==='string'?o.worksFor:(o.worksFor.name||'');if(o.affiliation)return typeof o.affiliation==='string'?o.affiliation:(o.affiliation.name||'');if(o.brand)return typeof o.brand==='string'?o.brand:(o.brand.name||'');for(var k in o){var rr=walk(o[k]);if(rr)return rr;}}return'';}var scripts=Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map(function(s){try{return JSON.parse(s.textContent);}catch(e){return null;}});var j=walk(scripts);if(j)return String(j).trim();var el=document.querySelector('[data-testid*=\"company\"],[class*=\"company\"],[data-testid*=\"brokerage\"],[class*=\"brokerage\"]');if(el&&((el.innerText||el.textContent||'').trim()))return (el.innerText||el.textContent||'').trim();var txt=(document.body&&(document.body.innerText||document.body.textContent))||'';var m=txt.match(/(?:Company|Brokerage|Office)\\s*:?\\s*\\n?\\s*([^\\n]+)/i);return m?m[1].trim():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "City_Location",
            "selector": "(function(){var body=(document.body&&(document.body.innerText||document.body.textContent))||'';var txt=(document.title+' '+body);var m=txt.match(/\\bin\\s+([A-Za-z .'-]+),\\s*([A-Z]{2})\\b/);if(m)return m[1].trim();var addr=document.querySelector('[itemprop=\"address\"],[class*=\"address\"],[data-testid*=\"address\"]');var a=addr?(addr.innerText||addr.textContent||''):'';var m2=a.match(/([A-Za-z .'-]+),\\s*[A-Z]{2}\\s*\\d{5}/);return m2?m2[1].trim():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "State_Location",
            "selector": "(function(){var states={AL:'Alabama',AK:'Alaska',AZ:'Arizona',AR:'Arkansas',CA:'California',CO:'Colorado',CT:'Connecticut',DE:'Delaware',FL:'Florida',GA:'Georgia',HI:'Hawaii',ID:'Idaho',IL:'Illinois',IN:'Indiana',IA:'Iowa',KS:'Kansas',KY:'Kentucky',LA:'Louisiana',ME:'Maine',MD:'Maryland',MA:'Massachusetts',MI:'Michigan',MN:'Minnesota',MS:'Mississippi',MO:'Missouri',MT:'Montana',NE:'Nebraska',NV:'Nevada',NH:'New Hampshire',NJ:'New Jersey',NM:'New Mexico',NY:'New York',NC:'North Carolina',ND:'North Dakota',OH:'Ohio',OK:'Oklahoma',OR:'Oregon',PA:'Pennsylvania',RI:'Rhode Island',SC:'South Carolina',SD:'South Dakota',TN:'Tennessee',TX:'Texas',UT:'Utah',VT:'Vermont',VA:'Virginia',WA:'Washington',WV:'West Virginia',WI:'Wisconsin',WY:'Wyoming',DC:'District of Columbia'};var body=(document.body&&(document.body.innerText||document.body.textContent))||'';var txt=(document.title+' '+body);var m=txt.match(/\\bin\\s+[A-Za-z .'-]+,\\s*([A-Z]{2})\\b/);if(m)return states[m[1]]||m[1];var m2=txt.match(/,\\s*([A-Z]{2})\\s*\\d{5}/);return m2?(states[m2[1]]||m2[1]):'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Full_Bio",
            "selector": "(function(){var candidates=Array.from(ROW.querySelectorAll('[data-testid*=\"bio\"],[class*=\"bio\"],[id*=\"bio\"],[data-testid*=\"about\"],[class*=\"about\"],section')).map(function(e){return (e.innerText||e.textContent||'').trim();}).filter(function(t){return t.length>80&&!/Press & Hold to confirm|Access to this page has been denied/i.test(t);});if(candidates.length)return candidates.sort(function(a,b){return b.length-a.length;})[0].replace(/\\s+/g,' ').trim();var meta=document.querySelector('meta[name=\"description\"],meta[property=\"og:description\"]');return meta&&meta.content&&!/px-captcha/i.test(meta.content)?meta.content.trim():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Website",
            "selector": "(function(){var links=Array.from(document.querySelectorAll('a[href]')).map(function(a){return a.href;}).filter(function(h){return /^https?:/i.test(h)&&!/zillow\\.com/i.test(h)&&!/linkedin\\.com|facebook\\.com|instagram\\.com|twitter\\.com|x\\.com|px-cloud\\.net|wra-api\\.net/i.test(h);});return links[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Linkedin",
            "selector": "(function(){var a=Array.from(document.querySelectorAll('a[href]')).find(function(x){return /linkedin\\.com/i.test(x.href);});return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Facebook",
            "selector": "(function(){var a=Array.from(document.querySelectorAll('a[href]')).find(function(x){return /facebook\\.com/i.test(x.href);});return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Instagram",
            "selector": "(function(){var a=Array.from(document.querySelectorAll('a[href]')).find(function(x){return /instagram\\.com/i.test(x.href);});return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Twitter",
            "selector": "(function(){var a=Array.from(document.querySelectorAll('a[href]')).find(function(x){return /twitter\\.com|x\\.com/i.test(x.href);});return a?a.href:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Cell_Phone",
            "selector": "(function(){var tel=Array.from(document.querySelectorAll('a[href^=\"tel:\"]')).map(function(a){return a.href.replace(/^tel:/,'').trim();});if(tel[0])return tel[0];var txt=(ROW.innerText||ROW.textContent||'');var labeled=txt.match(/(?:Cell|Mobile)\\s*(?:Phone)?\\s*:?\\s*(\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4})/i);if(labeled)return labeled[1];var phones=Array.from(new Set(txt.match(/\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}/g)||[]));return phones[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Office_Phone",
            "selector": "(function(){var txt=(ROW.innerText||ROW.textContent||'');var labeled=txt.match(/(?:Office|Business)\\s*(?:Phone)?\\s*:?\\s*(\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4})/i);if(labeled)return labeled[1];var phones=Array.from(new Set(txt.match(/\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}/g)||[]));return phones[1]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Email",
            "selector": "(function(){var mail=Array.from(document.querySelectorAll('a[href^=\"mailto:\"]')).map(function(a){return a.href.replace(/^mailto:/,'').split('?')[0];}).filter(Boolean);if(mail[0])return mail[0];var m=(ROW.innerText||ROW.textContent||'').match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/i);return m?m[0]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Address",
            "selector": "(function(){function walk(o){if(!o)return'';if(Array.isArray(o)){for(var i=0;i<o.length;i++){var r=walk(o[i]);if(r)return r;}}else if(typeof o==='object'){if(o.address){var a=o.address;if(typeof a==='string')return a;if(typeof a==='object')return [a.streetAddress,a.addressLocality,a.addressRegion,a.postalCode].filter(Boolean).join(' ');}for(var k in o){var rr=walk(o[k]);if(rr)return rr;}}return'';}var scripts=Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map(function(s){try{return JSON.parse(s.textContent);}catch(e){return null;}});var j=walk(scripts);if(j)return String(j).trim();var el=document.querySelector('[itemprop=\"address\"],[class*=\"address\"],[data-testid*=\"address\"]');if(el&&((el.innerText||el.textContent||'').trim()))return (el.innerText||el.textContent||'').replace(/\\s+/g,' ').trim();var txt=(ROW.innerText||ROW.textContent||'').replace(/\\n/g,' ');var m=txt.match(/\\d{2,6}\\s+[^,\\n]*(?:St|Street|Rd|Road|Ave|Avenue|Dr|Drive|Blvd|Lane|Ln|Way|Court|Ct|Place|Pl|Farm|Suite|Ste)[^\\n]*(?:,\\s*)?[A-Za-z .'-]+,\\s*[A-Z]{2}\\s*\\d{5}/i);return m?m[0].trim():'';})()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2976,
      "position_y": 800,
      "config": {}
    },
    {
      "block_id": "loop-continue-2",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2136,
      "position_y": 520,
      "config": {}
    }
  ],
  "connections": [
    {
      "from_block_id": "set-window-size-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-1",
      "to_connector_id": "left"
    },
    {
      "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-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": "text-contains-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "true",
      "to_block_id": "loop-continue-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "false",
      "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-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "set-window-size-1"
        ]
      }
    },
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 384,
      "position_y": 116,
      "width": 2168,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1",
          "sleep-2"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1728,
      "position_y": 116,
      "width": 1496,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "text-contains-1",
          "loop-continue-1",
          "loop-continue-2"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1728,
      "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": 2568,
      "position_y": 696,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Zillow profile scraper equivalent to the Octoparse template. Extracts page title, URL, profile name, company, city/state, bio, social links, phones, email, and address from multiple Zillow profile URLs using a navigate.urls loop. Navigation strategy: known profile URL list with loop-continue. Note: attached analysis and test runs show Zillow returning PerimeterX px-captcha / HTTP 403. This template cannot bypass human verification; blocked pages are detected and skipped instead of exporting captcha text as profile data.",
      "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 3 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 656,
      "position_y": 200,
      "width": 328,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-text-contains-1",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `html`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2000,
      "position_y": 200,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `Array.from(document.querySelectorAll('button,a')).filter(function(el){return /show more|read more|mo...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 2000,
      "position_y": 500,
      "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 (Page_title, Page_URL, Original_URL, Profile_Name, Company_Name). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2840,
      "position_y": 780,
      "width": 340,
      "height": 134,
      "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": 3176,
      "position_y": 780,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    },
    {
      "id": "note-block-loop-continue-2",
      "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": 2336,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-2"
      }
    }
  ]
}