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