A:
- Python 3.10+ (3.12 recommended)
- 2GB RAM minimum, 4GB+ recommended
- 500MB disk space for initial installation
- Internet connection for crawling
A:
cd agrolead
pip install -r requirements.txt
playwright install chromium
cp .env.example .env
python -m agrolead.cli.main initSee QUICKSTART.md for detailed steps.
A: No, Agrolead requires Python 3.10+. Type hints and async features used require this version.
A: Yes, Agrolead works on Windows. Use:
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
playwright install chromiumA: Run playwright install chromium to download browser binaries.
A: Edit the .env file in the project root. Copy .env.example as a template.
A:
- SQLite: Single file, good for development/testing, limited concurrent access
- PostgreSQL: Network database, good for production, handles concurrent access
A: Yes. Set DB_POSTGRESQL_URL environment variable:
DB_POSTGRESQL_URL=postgresql://user:password@remote.server.com:5432/agroleadA: Edit .env:
CRAWLER_RATE_LIMIT_DELAY=1.0 # Seconds between requestsLower values = faster crawling but may get blocked.
A:
python -m agrolead.cli.main search "tomato importer" --country FR --limit 50A: France (FR), Germany (DE), Italy (IT), Spain (ES), Netherlands (NL), Belgium (BE), United Kingdom (UK), Portugal (PT), Poland (PL)
A: Not in one command, but you can run multiple commands:
python -m agrolead.cli.main crawl --directory europages
python -m agrolead.cli.main crawl --directory kompassA: CSV, Excel, JSON, and SQLite database.
A: The export automatically filters by minimum score (default 20). Adjust in .env:
SCORING_MINIMUM_SCORE=50 # Only export scores >= 50A: Depends on:
- Number of companies (typically 1 URL per company)
- Rate limiting (default 1 second/request)
- Website response times
- Network speed
Example: 100 companies × 1 sec = ~2-3 minutes with crawling + enrichment.
A: Not automatically. You'd need to:
- Identify which companies were already crawled
- Create a new list without those
- Run crawl again on the new list
Or enable deduplication to automatically skip existing companies.
A: Agrolead follows robots.txt guidelines and implements:
- Rate limiting between requests
- Proper user-agent headers
- Caching of visited URLs
- Respectful crawling practices
A: Try these solutions:
- Increase rate limit:
CRAWLER_RATE_LIMIT_DELAY=3.0 - Reduce concurrent tasks:
CRAWLER_MAX_CONCURRENT_TASKS=2 - Wait before retrying (different IP)
- Use proxy support if configured
A: No, and we don't recommend it. LinkedIn's Terms of Service explicitly prohibit automated crawling. Agrolead focuses on public B2B directories.
A: Reasons include:
- Not listed in that directory
- Directory doesn't include that region
- Company is too small or inactive
- Directory has access restrictions
A: Yes! See IMPLEMENTATION.md for extending with custom adapters.
A: Scoring considers:
- No public email: -10 points
- No contact page: -10 points
- Not tagged as importer: -25 points
- No tomato/produce keywords: -20 points
To view detailed scoring: Check the final_score field.
A: Yes, in .env:
SCORING_SCORE_IMPORTER=40
SCORING_SCORE_FRESH_PRODUCE=30
SCORING_SCORE_TOMATO_MENTION=20A: Duplicates are detected by:
- Same website
- Same company name (fuzzy match)
- Same primary email
To prevent: Ensure input data is clean.
A:
# View duplicates
python -c "
from agrolead.database.models import create_database, get_session, CompanyModel
from agrolead.config.settings import settings
session = get_session(create_database(settings.get_database_url()))
dups = session.query(CompanyModel).filter(CompanyModel.is_duplicate == True).all()
print(f'Found {len(dups)} duplicates')
"
# Exclude in export
EXPORT_INCLUDE_DUPLICATES=falseA:
SQLite:
cp data/agrolead.db data/agrolead-backup-$(date +%Y%m%d).dbPostgreSQL:
pg_dump -U agrolead agrolead | gzip > agrolead-backup-$(date +%Y%m%d).sql.gzA: Options:
- Reduce
EXPORT_MAX_ROWS_PER_FILE - Delete old companies:
session.query(CompanyModel).filter(
CompanyModel.date_crawled < old_date
).delete()- Archive to PostgreSQL (larger capacity)
A:
SQLite:
sqlite3 data/agrolead.db
SELECT * FROM companies LIMIT 10;PostgreSQL:
psql -U agrolead -d agrolead
SELECT * FROM companies LIMIT 10;A: Reasons:
- Emails in images (not text)
- Behind contact forms
- JavaScript-generated content
- Obfuscated (encoded)
Solution: Manually check website or use contact form.
A: May occur if:
- Invalid format
- Missing country code
- Incorrect country detection
Check phone_extractor.py for supported formats.
A: Options:
- Reduce pages visited:
ENRICHMENT_MAX_PAGES_TO_VISIT=3 - Disable enrichment:
ENRICHMENT_ENABLED=false - Increase concurrency:
CRAWLER_MAX_CONCURRENT_TASKS=10
A:
docker-compose up -d
docker-compose exec agrolead python -m agrolead.cli.main initA:
docker-compose exec postgres psql -U agrolead -d agroleadA: Check logs:
docker-compose logs agroleadCommon issues:
- Database not initialized: Run
initcommand - Out of memory: Reduce concurrency
- Port already in use: Change port in
docker-compose.yml
A: Yes! See DEPLOYMENT.md for guides.
A:
- Increase concurrent tasks:
CRAWLER_MAX_CONCURRENT_TASKS=10 - Decrease rate limit:
CRAWLER_RATE_LIMIT_DELAY=0.5 - Disable enrichment:
ENRICHMENT_ENABLED=false - Use lighter parsing: Switch from Playwright to HTTPAdapter
A: Solutions:
- Reduce concurrent tasks
- Process in smaller batches
- Increase swap space
- Add more RAM
A: Solutions:
- Add indexes:
CREATE INDEX idx_score ON companies(final_score);
CREATE INDEX idx_country ON companies(country);- Archive old data
- Upgrade to PostgreSQL
- Add more RAM
A: Install in development mode:
pip install -e .A: Install browsers:
playwright install chromiumA: Solutions:
- Close other connections
- Wait a few seconds
- Switch to PostgreSQL
- Reduce concurrent tasks
A: Check:
- PostgreSQL is running:
systemctl status postgresql - Connection string is correct
- User has permissions
- Firewall allows connection
A: Reinstall:
pip install --force-reinstall playwright==1.40.0
playwright install chromiumA: Increase timeouts:
CRAWLER_REQUEST_TIMEOUT=60
CRAWLER_PAGE_TIMEOUT=120A: Create it:
cp .env.example .envA:
make test # Run all tests
make coverage # With coverage report
make test-fast # Stop on first failureA: See CONTRIBUTING.md and tests/ examples.
A: Run: make coverage and check htmlcov/index.html
A: Yes:
- ✅ No credentials in code
- ✅ Uses environment variables for secrets
- ✅ Input validation on all user inputs
- ✅ No SQL injection (uses SQLAlchemy ORM)
- ✅ Regular dependency updates
A: Yes, but follow security practices:
- Use strong database passwords
- Enable HTTPS for any web interfaces
- Keep dependencies updated
- Regular backups
- Monitor logs
- Use firewall rules
A: Email security@agrolead.io (or open private issue on GitHub).
A: MIT License - Free for commercial use, modification, distribution.
A: Yes! MIT license allows commercial use. See LICENSE.
A:
- Check this FAQ
- Read README.md and QUICKSTART.md
- Search GitHub issues
- Open a new issue
- Check IMPLEMENTATION.md
A: Open a GitHub issue with the enhancement label.
A: Open a GitHub issue with detailed:
- Steps to reproduce
- Expected vs actual behavior
- Error messages and logs
- System information
A: Yes! See CONTRIBUTING.md.
A: See CHANGELOG.md for planned features.
- Documentation: Check README.md and guides
- Examples: See tests/ directory
- Issues: Search GitHub issues
- Community: Contribute to improve
Still have questions? Open an issue on GitHub or check our documentation!
🌱 Happy lead hunting!