SEO Sentinel - Automated SEO Auditing Tool
A comprehensive SEO analysis tool that crawls websites, identifies SEO issues, and generates detailed HTML reports for website optimization.
[!CAUTION] SEO Sentinel is a helpful utility for SEO auditing but does not guarantee search engine ranking improvements. Please ensure your usage complies with the target site's policies. Always respect the
robots.txtfile of the websites you crawl. Use responsibly and ethically. The author is not responsible for any misuse or damage caused by the tool. Always test on your own sites or with permission from the site owner.
Features
- Website Crawling: Intelligent crawling with configurable depth and page limits
- SEO Analysis: Comprehensive analysis of metadata, links, and content
- Keyword Density: Track keyword usage and density across pages
- Broken Link Detection: Identify and report broken internal/external links
- Performance Metrics: Page load time and response code monitoring
- HTML Reports: Beautiful, detailed reports with actionable insights
- Auto Updates: Built-in update checker for latest features
- Configurable: Customizable crawling parameters and settings
Installation
Getting Started
Clone & Run Locally
# Clone the repository
git clone https://github.com/nayandas69/SEO-Sentinel
cd SEO-Sentinel
# Create a virtual environment
python3 -m venv venv
# Activate the environment
# Windows:
venv\Scripts\activate
# Linux/macOS:
source venv/bin/activate
# Install dependencies
pip3 install -r requirements.txt
# Run the project
python3 seose.py
Install via PyPI
pip3 install seo-sentinel
Then run via:
seo-sentinel
Programmatic Usage
from seose import SEOSentinel, SEOConfig
# Initialize with default config
sentinel = SEOSentinel()
# Or with custom configuration
config = SEOConfig(
crawl_depth=2,
max_pages=50,
request_timeout=15
)
sentinel = SEOSentinel(config)
# Crawl and analyze a website
urls = sentinel.crawl_website("https://example.com")
results = {}
for url in urls:
results[url] = sentinel.analyze_seo_issues(url, keywords=["seo", "optimization"])
# Generate HTML report
report_path = sentinel.generate_report(results, "https://example.com")
print(f"Report saved to: {report_path}")
Configuration
The SEOConfig class allows you to customize the analysis:
from seose import SEOConfig
config = SEOConfig(
report_directory="reports", # Directory for HTML reports
log_directory="logs", # Directory for log files
crawl_depth=3, # Maximum crawling depth
max_pages=100, # Maximum pages to crawl
request_timeout=10, # Request timeout in seconds
max_workers=5, # Concurrent workers (future use)
user_agent="SEO-Sentinel/1.0.2", # Custom user agent
verify_ssl=True # SSL certificate verification
)
Requirements
Runtime Dependencies
- Python 3.8+
- beautifulsoup4 >= 4.12.0
- requests >= 2.31.0
- tqdm >= 4.65.0
- jinja2 >= 3.1.0
Development Dependencies
- pytest >= 7.0.0
- black >= 23.0.0
- flake8 >= 6.0.0
- mypy >= 1.0.0
- coverage >= 7.0.0
Usage Examples
Basic Website Analysis
from seose import SEOSentinel
sentinel = SEOSentinel()
# Analyze a single page
issues = sentinel.analyze_seo_issues("https://example.com")
print(f"Found {len(issues.missing_metadata)} metadata issues")
# Full website crawl and analysis
urls = sentinel.crawl_website("https://example.com")
results = {url: sentinel.analyze_seo_issues(url) for url in urls}
report_path = sentinel.generate_report(results, "https://example.com")
Keyword Analysis
keywords = ["seo", "optimization", "website", "ranking"]
issues = sentinel.analyze_seo_issues("https://example.com", keywords=keywords)
for keyword, data in issues.keyword_density.items():
print(f"{keyword}: {data['count']} occurrences ({data['density']}%)")
Custom Configuration
from seose import SEOSentinel, SEOConfig
config = SEOConfig(
crawl_depth=2,
max_pages=25,
request_timeout=15
)
sentinel = SEOSentinel(config)
urls = sentinel.crawl_website("https://example.com", max_depth=1, max_pages=10)
Report Features
The generated HTML reports include:
- Executive Summary: Total pages, issues, and performance metrics
- Page-by-Page Analysis: Detailed breakdown of each crawled page
- Performance Indicators: Load times and response codes
- Broken Link Detection: Complete list of broken internal/external links
- Metadata Analysis: Missing or problematic meta tags, titles, descriptions
- Keyword Density: Frequency and density analysis for target keywords
Testing
Run the test suite:
# Run all tests
pytest
# Run with coverage
pytest --cov=seose
# Run specific test file
pytest tests/test_seose.py
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests (
pytest) - Format code (
black .) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Author
Nayan Das
- Website: https://linkinbio-nextjs-ashen.vercel.app
- Email: nayanchandradas@hotmail.com
- GitHub: @nayandas69
Support
- 🐛 Bug Reports: GitHub Issues
- 💬 Community: Discord Server
- 📧 Email: nayanchandradas@hotmail.com
Roadmap
- Multi-threading support for faster crawling
- Additional SEO checks (schema markup, social meta tags)
- JSON/CSV export options
- Web interface
- Integration with popular CMS platforms
- Advanced keyword analysis and suggestions
Metadata
Release files for seo-sentinel 1.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| seo_sentinel-1.0.2.tar.gz | 17.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| seo_sentinel-1.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.4 kB
Release files / seo_sentinel-1.0.2.tar.gz
| Download URL | seo_sentinel-1.0.2.tar.gz |
|---|---|
| Size | 17.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36c48d9ac008f8e301b47178d5612640e54131705468f9203265a70ca64e98b8
|
|
BLAKE2b-256 checksum How to use checksums |
c6f9b20a6419eb9e3dd56275b571e9fbc186bafed8d0922db2a126864caa268b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2025.
Transparency logRelease files / seo_sentinel-1.0.2-py3-none-any.whl
| Download URL | seo_sentinel-1.0.2-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0233ae77320113e92863c91cc2ef287fac25bfe3e1db6d04e3213e08bc4e519b
|
|
BLAKE2b-256 checksum How to use checksums |
37ae30036dddf5fd19d23649591e1ab81634bf5f8713a7b071c81ccaf4cf80bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2025.
Transparency log