gmaps_lead_pipeline.py

entry point
114 steps Google Auth Google Sheets cli: __main__ guard cli: argparse

This automation script enhances business lead data by finding contact details on their websites. It then stores and updates this enriched lead information in a Google Sheet.

Flow

Click any step to see details

graph TB
  subgraph n_gmaps_lead_pipeline_generate_lead_id["generate_lead_id()"]
    n_gmaps_lead_pipeline_94[["Transform: .lower()"]]:::transform
    n_gmaps_lead_pipeline_95[["Transform: .encode()"]]:::transform
    n_gmaps_lead_pipeline_94 --> n_gmaps_lead_pipeline_95
  end
  n_gmaps_lead_pipeline_stringify_value_compact[["stringify_value() — 11 steps (6 Decision, 5 Transform)"]]:::compact
  subgraph n_gmaps_lead_pipeline_parse_address["parse_address()"]
    n_gmaps_lead_pipeline_127{"if not address"}:::decision
    n_gmaps_lead_pipeline_133{"if zip_match"}:::decision
    n_gmaps_lead_pipeline_138{"if state_match"}:::decision
    n_gmaps_lead_pipeline_142{"if parts['state']"}:::decision
    n_gmaps_lead_pipeline_144{"if city_match"}:::decision
    n_gmaps_lead_pipeline_145[["Transform: .strip()"]]:::transform
    n_gmaps_lead_pipeline_127 --> n_gmaps_lead_pipeline_133
    n_gmaps_lead_pipeline_133 --> n_gmaps_lead_pipeline_138
    n_gmaps_lead_pipeline_138 --> n_gmaps_lead_pipeline_142
    n_gmaps_lead_pipeline_142 --> n_gmaps_lead_pipeline_144
    n_gmaps_lead_pipeline_144 --> n_gmaps_lead_pipeline_145
  end
  subgraph n_gmaps_lead_pipeline_flatten_lead["flatten_lead()"]
    n_gmaps_lead_pipeline_174[["Transform: .dumps()"]]:::transform
    n_gmaps_lead_pipeline_189{"if contacts.get('error')"}:::decision
    n_gmaps_lead_pipeline_174 --> n_gmaps_lead_pipeline_189
  end
  subgraph n_gmaps_lead_pipeline_get_credentials["get_credentials()"]
    n_gmaps_lead_pipeline_243{"if os.path.exists('token.json')"}:::decision
    n_gmaps_lead_pipeline_244{"try/except block"}:::decision
    n_gmaps_lead_pipeline_245[/"File: open('token.json')"/]:::fileio
    n_gmaps_lead_pipeline_246[/"File: json.load()"/]:::fileio
    n_gmaps_lead_pipeline_249(["Output: print()"]):::output
    n_gmaps_lead_pipeline_251{"if not creds or not creds.valid"}:::decision
    n_gmaps_lead_pipeline_252{"if creds and creds.expired and creds.refresh_token"}:::decision
    n_gmaps_lead_pipeline_260[/"File: open('token.json')"/]:::fileio
    n_gmaps_lead_pipeline_243 --> n_gmaps_lead_pipeline_244
    n_gmaps_lead_pipeline_244 --> n_gmaps_lead_pipeline_245
    n_gmaps_lead_pipeline_245 --> n_gmaps_lead_pipeline_246
    n_gmaps_lead_pipeline_246 --> n_gmaps_lead_pipeline_249
    n_gmaps_lead_pipeline_249 --> n_gmaps_lead_pipeline_251
    n_gmaps_lead_pipeline_251 --> n_gmaps_lead_pipeline_252
    n_gmaps_lead_pipeline_252 --> n_gmaps_lead_pipeline_260
  end
  subgraph n_gmaps_lead_pipeline_get_or_create_sheet["get_or_create_sheet()"]
    n_gmaps_lead_pipeline_274["API: gspread.authorize()"]:::api
    n_gmaps_lead_pipeline_276{"if sheet_url"}:::decision
    n_gmaps_lead_pipeline_278{"if '/d/' in sheet_url"}:::decision
    n_gmaps_lead_pipeline_279[["Transform: .split()"]]:::transform
    n_gmaps_lead_pipeline_279[["Transform: .split()"]]:::transform
    n_gmaps_lead_pipeline_286(["Output: print()"]):::output
    n_gmaps_lead_pipeline_306(["Output: print()"]):::output
    n_gmaps_lead_pipeline_307(["Output: print()"]):::output
    n_gmaps_lead_pipeline_274 --> n_gmaps_lead_pipeline_276
    n_gmaps_lead_pipeline_276 --> n_gmaps_lead_pipeline_278
    n_gmaps_lead_pipeline_278 --> n_gmaps_lead_pipeline_279
    n_gmaps_lead_pipeline_279 --> n_gmaps_lead_pipeline_279
    n_gmaps_lead_pipeline_279 --> n_gmaps_lead_pipeline_286
    n_gmaps_lead_pipeline_286 --> n_gmaps_lead_pipeline_306
    n_gmaps_lead_pipeline_306 --> n_gmaps_lead_pipeline_307
  end
  subgraph n_gmaps_lead_pipeline_get_existing_lead_ids["get_existing_lead_ids()"]
    n_gmaps_lead_pipeline_314{"try/except block"}:::decision
    n_gmaps_lead_pipeline_317[["Transform: set()"]]:::transform
    n_gmaps_lead_pipeline_319[["Transform: set()"]]:::transform
    n_gmaps_lead_pipeline_314 --> n_gmaps_lead_pipeline_317
    n_gmaps_lead_pipeline_317 --> n_gmaps_lead_pipeline_319
  end
  n_gmaps_lead_pipeline_append_leads_to_sheet_compact[["append_leads_to_sheet() — 9 steps (5 Transform, 2 Decision, 2 Output)"]]:::compact
  n_gmaps_lead_pipeline_enrich_businesses_compact[["enrich_businesses() — 21 steps (13 Transform, 4 Output, 4 Decision)"]]:::compact
  n_gmaps_lead_pipeline_run_pipeline_compact[["run_pipeline() — 40 steps (22 Output, 7 Decision, 7 Transform, 4 File I/O)"]]:::compact
  subgraph n_gmaps_lead_pipeline_main["main()"]
    n_gmaps_lead_pipeline_562{"if args.json"}:::decision
    n_gmaps_lead_pipeline_563(["Output: print()"]):::output
    n_gmaps_lead_pipeline_563[["Transform: .dumps()"]]:::transform
    n_gmaps_lead_pipeline_566{"if results['leads_added'] == 0 and results['errors']"}:::decision
    n_gmaps_lead_pipeline_562 --> n_gmaps_lead_pipeline_563
    n_gmaps_lead_pipeline_563 --> n_gmaps_lead_pipeline_563
    n_gmaps_lead_pipeline_563 --> n_gmaps_lead_pipeline_566
  end
  click n_gmaps_lead_pipeline_94 call showStepDetail("gmaps_lead_pipeline.py", 94)
  click n_gmaps_lead_pipeline_95 call showStepDetail("gmaps_lead_pipeline.py", 95)
  click n_gmaps_lead_pipeline_127 call showStepDetail("gmaps_lead_pipeline.py", 127)
  click n_gmaps_lead_pipeline_133 call showStepDetail("gmaps_lead_pipeline.py", 133)
  click n_gmaps_lead_pipeline_138 call showStepDetail("gmaps_lead_pipeline.py", 138)
  click n_gmaps_lead_pipeline_142 call showStepDetail("gmaps_lead_pipeline.py", 142)
  click n_gmaps_lead_pipeline_144 call showStepDetail("gmaps_lead_pipeline.py", 144)
  click n_gmaps_lead_pipeline_145 call showStepDetail("gmaps_lead_pipeline.py", 145)
  click n_gmaps_lead_pipeline_174 call showStepDetail("gmaps_lead_pipeline.py", 174)
  click n_gmaps_lead_pipeline_189 call showStepDetail("gmaps_lead_pipeline.py", 189)
  click n_gmaps_lead_pipeline_243 call showStepDetail("gmaps_lead_pipeline.py", 243)
  click n_gmaps_lead_pipeline_244 call showStepDetail("gmaps_lead_pipeline.py", 244)
  click n_gmaps_lead_pipeline_245 call showStepDetail("gmaps_lead_pipeline.py", 245)
  click n_gmaps_lead_pipeline_246 call showStepDetail("gmaps_lead_pipeline.py", 246)
  click n_gmaps_lead_pipeline_249 call showStepDetail("gmaps_lead_pipeline.py", 249)
  click n_gmaps_lead_pipeline_251 call showStepDetail("gmaps_lead_pipeline.py", 251)
  click n_gmaps_lead_pipeline_252 call showStepDetail("gmaps_lead_pipeline.py", 252)
  click n_gmaps_lead_pipeline_260 call showStepDetail("gmaps_lead_pipeline.py", 260)
  click n_gmaps_lead_pipeline_274 call showStepDetail("gmaps_lead_pipeline.py", 274)
  click n_gmaps_lead_pipeline_276 call showStepDetail("gmaps_lead_pipeline.py", 276)
  click n_gmaps_lead_pipeline_278 call showStepDetail("gmaps_lead_pipeline.py", 278)
  click n_gmaps_lead_pipeline_279 call showStepDetail("gmaps_lead_pipeline.py", 279)
  click n_gmaps_lead_pipeline_279 call showStepDetail("gmaps_lead_pipeline.py", 279)
  click n_gmaps_lead_pipeline_286 call showStepDetail("gmaps_lead_pipeline.py", 286)
  click n_gmaps_lead_pipeline_306 call showStepDetail("gmaps_lead_pipeline.py", 306)
  click n_gmaps_lead_pipeline_307 call showStepDetail("gmaps_lead_pipeline.py", 307)
  click n_gmaps_lead_pipeline_314 call showStepDetail("gmaps_lead_pipeline.py", 314)
  click n_gmaps_lead_pipeline_317 call showStepDetail("gmaps_lead_pipeline.py", 317)
  click n_gmaps_lead_pipeline_319 call showStepDetail("gmaps_lead_pipeline.py", 319)
  click n_gmaps_lead_pipeline_562 call showStepDetail("gmaps_lead_pipeline.py", 562)
  click n_gmaps_lead_pipeline_563 call showStepDetail("gmaps_lead_pipeline.py", 563)
  click n_gmaps_lead_pipeline_563 call showStepDetail("gmaps_lead_pipeline.py", 563)
  click n_gmaps_lead_pipeline_566 call showStepDetail("gmaps_lead_pipeline.py", 566)
classDef api fill:#dbeafe,stroke:#2563eb,color:#1e3a5f
classDef fileio fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef dbop fill:#f3e8ff,stroke:#9333ea,color:#3b0764
classDef decision fill:#ffedd5,stroke:#ea580c,color:#7c2d12
classDef output fill:#f3f4f6,stroke:#6b7280,color:#1f2937
classDef transform fill:#ccfbf1,stroke:#0d9488,color:#134e4a
classDef entry fill:#dcfce7,stroke:#16a34a,stroke-width:3px,color:#14532d
classDef compact fill:#f0f4ff,stroke:#6366f1,color:#312e81,stroke-width:2px
                    
API Call File I/O Database Decision Output Transform

All Steps

Step Detail

Select a step from the diagram or list to see its details.

Services

  • Google Auth (google.oauth2)
  • Google Sheets (gspread)

Secrets

  • GOOGLE_APPLICATION_CREDENTIALS

Imports

Internal

  • scrape_google_maps

External

  • argparse
  • concurrent.futures
  • datetime
  • dotenv
  • extract_website_contacts
  • google.auth.transport.requests
  • google.oauth2.credentials
  • google_auth_oauthlib.flow
  • gspread
  • hashlib
  • json
  • os
  • re
  • sys