# 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.txt` file 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
```bash
# 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
```bash
pip3 install seo-sentinel
```
Then run via:
```bash
seo-sentinel
```
> [!NOTE]
> Always make sure your internet connection is active while using SEO Sentinel for crawling and update checking.
> [!IMPORTANT]
> Make sure your URLs include `http://` or `https://` otherwise they will be rejected.
> [!TIP]
> Generate reports regularly to monitor improvements after fixing SEO issues.
### Programmatic Usage
```python
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:
```python
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
```python
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
```python
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
```python
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:
```bash
# Run all tests
pytest
# Run with coverage
pytest --cov=seose
# Run specific test file
pytest tests/test_seose.py
```
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Make your changes
4. Run tests (`pytest`)
5. Format code (`black .`)
6. Commit changes (`git commit -m 'Add amazing feature'`)
7. Push to branch (`git push origin feature/amazing-feature`)
8. Open a Pull Request
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## Author
**Nayan Das**
- Website: [https://linkinbio-nextjs-ashen.vercel.app](https://linkinbio-nextjs-ashen.vercel.app)
- Email: nayanchandradas@hotmail.com
- GitHub: [@nayandas69](https://github.com/nayandas69)
## Support
- 🐛 **Bug Reports**: [GitHub Issues](https://github.com/nayandas69/SEO-Sentinel/issues)
- 💬 **Community**: [Discord Server](https://discord.gg/skHyssu)
- 📧 **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
Raw data
{
"_id": null,
"home_page": null,
"name": "seo-sentinel",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Nayan Das <nayanchandradas@hotmail.com>",
"keywords": "seo, crawler, auditor, website-analysis, python, seo-sentinel, web-scraping, performance-analysis, metadata-analysis",
"author": null,
"author_email": "Nayan Das <nayanchandradas@hotmail.com>",
"download_url": "https://files.pythonhosted.org/packages/c6/f9/b20a6419eb9e3dd56275b571e9fbc186bafed8d0922db2a126864caa268b/seo_sentinel-1.0.2.tar.gz",
"platform": null,
"description": "# SEO Sentinel - Automated SEO Auditing Tool\n\n\n\n\n\n\nA comprehensive SEO analysis tool that crawls websites, identifies SEO issues, and generates detailed HTML reports for website optimization.\n\n> \\[!CAUTION]\n> 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.\n> Always respect the `robots.txt` file of the websites you crawl.\n> Use responsibly and ethically.\n> The author is not responsible for any misuse or damage caused by the tool.\n> Always test on your own sites or with permission from the site owner.\n\n## Features\n\n- **Website Crawling**: Intelligent crawling with configurable depth and page limits\n- **SEO Analysis**: Comprehensive analysis of metadata, links, and content\n- **Keyword Density**: Track keyword usage and density across pages\n- **Broken Link Detection**: Identify and report broken internal/external links\n- **Performance Metrics**: Page load time and response code monitoring\n- **HTML Reports**: Beautiful, detailed reports with actionable insights\n- **Auto Updates**: Built-in update checker for latest features\n- **Configurable**: Customizable crawling parameters and settings\n\n## Installation\n## Getting Started\n\n### Clone & Run Locally\n\n```bash\n# Clone the repository\ngit clone https://github.com/nayandas69/SEO-Sentinel\ncd SEO-Sentinel\n\n# Create a virtual environment\npython3 -m venv venv\n\n# Activate the environment\n# Windows:\nvenv\\Scripts\\activate\n# Linux/macOS:\nsource venv/bin/activate\n\n# Install dependencies\npip3 install -r requirements.txt\n\n# Run the project\npython3 seose.py\n```\n\n### Install via PyPI\n\n```bash\npip3 install seo-sentinel\n```\n\nThen run via:\n\n```bash\nseo-sentinel\n```\n\n> [!NOTE]\n> Always make sure your internet connection is active while using SEO Sentinel for crawling and update checking.\n\n> [!IMPORTANT]\n> Make sure your URLs include `http://` or `https://` otherwise they will be rejected.\n\n> [!TIP]\n> Generate reports regularly to monitor improvements after fixing SEO issues.\n\n### Programmatic Usage\n\n```python\nfrom seose import SEOSentinel, SEOConfig\n\n# Initialize with default config\nsentinel = SEOSentinel()\n\n# Or with custom configuration\nconfig = SEOConfig(\n crawl_depth=2,\n max_pages=50,\n request_timeout=15\n)\nsentinel = SEOSentinel(config)\n\n# Crawl and analyze a website\nurls = sentinel.crawl_website(\"https://example.com\")\nresults = {}\n\nfor url in urls:\n results[url] = sentinel.analyze_seo_issues(url, keywords=[\"seo\", \"optimization\"])\n\n# Generate HTML report\nreport_path = sentinel.generate_report(results, \"https://example.com\")\nprint(f\"Report saved to: {report_path}\")\n```\n\n## Configuration\n\nThe `SEOConfig` class allows you to customize the analysis:\n\n```python\nfrom seose import SEOConfig\n\nconfig = SEOConfig(\n report_directory=\"reports\", # Directory for HTML reports\n log_directory=\"logs\", # Directory for log files\n crawl_depth=3, # Maximum crawling depth\n max_pages=100, # Maximum pages to crawl\n request_timeout=10, # Request timeout in seconds\n max_workers=5, # Concurrent workers (future use)\n user_agent=\"SEO-Sentinel/1.0.2\", # Custom user agent\n verify_ssl=True # SSL certificate verification\n)\n```\n\n## Requirements\n\n### Runtime Dependencies\n\n- Python 3.8+\n- beautifulsoup4 >= 4.12.0\n- requests >= 2.31.0\n- tqdm >= 4.65.0\n- jinja2 >= 3.1.0\n\n### Development Dependencies\n\n- pytest >= 7.0.0\n- black >= 23.0.0\n- flake8 >= 6.0.0\n- mypy >= 1.0.0\n- coverage >= 7.0.0\n\n## Usage Examples\n\n### Basic Website Analysis\n\n```python\nfrom seose import SEOSentinel\n\nsentinel = SEOSentinel()\n\n# Analyze a single page\nissues = sentinel.analyze_seo_issues(\"https://example.com\")\nprint(f\"Found {len(issues.missing_metadata)} metadata issues\")\n\n# Full website crawl and analysis\nurls = sentinel.crawl_website(\"https://example.com\")\nresults = {url: sentinel.analyze_seo_issues(url) for url in urls}\nreport_path = sentinel.generate_report(results, \"https://example.com\")\n```\n\n### Keyword Analysis\n\n```python\nkeywords = [\"seo\", \"optimization\", \"website\", \"ranking\"]\nissues = sentinel.analyze_seo_issues(\"https://example.com\", keywords=keywords)\n\nfor keyword, data in issues.keyword_density.items():\n print(f\"{keyword}: {data['count']} occurrences ({data['density']}%)\")\n```\n\n### Custom Configuration\n\n```python\nfrom seose import SEOSentinel, SEOConfig\n\nconfig = SEOConfig(\n crawl_depth=2,\n max_pages=25,\n request_timeout=15\n)\n\nsentinel = SEOSentinel(config)\nurls = sentinel.crawl_website(\"https://example.com\", max_depth=1, max_pages=10)\n```\n\n## Report Features\n\nThe generated HTML reports include:\n\n- **Executive Summary**: Total pages, issues, and performance metrics\n- **Page-by-Page Analysis**: Detailed breakdown of each crawled page\n- **Performance Indicators**: Load times and response codes\n- **Broken Link Detection**: Complete list of broken internal/external links\n- **Metadata Analysis**: Missing or problematic meta tags, titles, descriptions\n- **Keyword Density**: Frequency and density analysis for target keywords\n\n## Testing\n\nRun the test suite:\n\n```bash\n# Run all tests\npytest\n\n# Run with coverage\npytest --cov=seose\n\n# Run specific test file\npytest tests/test_seose.py\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Run tests (`pytest`)\n5. Format code (`black .`)\n6. Commit changes (`git commit -m 'Add amazing feature'`)\n7. Push to branch (`git push origin feature/amazing-feature`)\n8. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Author\n\n**Nayan Das**\n- Website: [https://linkinbio-nextjs-ashen.vercel.app](https://linkinbio-nextjs-ashen.vercel.app)\n- Email: nayanchandradas@hotmail.com\n- GitHub: [@nayandas69](https://github.com/nayandas69)\n\n## Support\n\n- \ud83d\udc1b **Bug Reports**: [GitHub Issues](https://github.com/nayandas69/SEO-Sentinel/issues)\n- \ud83d\udcac **Community**: [Discord Server](https://discord.gg/skHyssu)\n- \ud83d\udce7 **Email**: nayanchandradas@hotmail.com\n\n## Roadmap\n\n- [ ] Multi-threading support for faster crawling\n- [ ] Additional SEO checks (schema markup, social meta tags)\n- [ ] JSON/CSV export options\n- [ ] Web interface\n- [ ] Integration with popular CMS platforms\n- [ ] Advanced keyword analysis and suggestions\n",
"bugtrack_url": null,
"license": null,
"summary": "SEO Sentinel is a comprehensive automated SEO auditing tool that crawls websites, detects SEO issues, and generates detailed HTML reports for website optimization.",
"version": "1.0.2",
"project_urls": {
"Author Website": "https://nayandas69.github.io/link-in-bio",
"Bug Reports": "https://github.com/nayandas69/SEO-Sentinel/issues",
"Changelog": "https://github.com/nayandas69/SEO-Sentinel/releases",
"Discord": "https://discord.gg/skHyssu",
"Documentation": "https://github.com/nayandas69/SEO-Sentinel#readme",
"Feature Requests": "https://github.com/nayandas69/SEO-Sentinel/issues",
"Homepage": "https://github.com/nayandas69/SEO-Sentinel",
"Issues": "https://github.com/nayandas69/SEO-Sentinel/issues",
"Repository": "https://github.com/nayandas69/SEO-Sentinel"
},
"split_keywords": [
"seo",
" crawler",
" auditor",
" website-analysis",
" python",
" seo-sentinel",
" web-scraping",
" performance-analysis",
" metadata-analysis"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "37ae30036dddf5fd19d23649591e1ab81634bf5f8713a7b071c81ccaf4cf80bf",
"md5": "1f5e5d3ae662b32ab2ba75734d21062d",
"sha256": "0233ae77320113e92863c91cc2ef287fac25bfe3e1db6d04e3213e08bc4e519b"
},
"downloads": -1,
"filename": "seo_sentinel-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1f5e5d3ae662b32ab2ba75734d21062d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 13916,
"upload_time": "2025-09-10T14:44:59",
"upload_time_iso_8601": "2025-09-10T14:44:59.173768Z",
"url": "https://files.pythonhosted.org/packages/37/ae/30036dddf5fd19d23649591e1ab81634bf5f8713a7b071c81ccaf4cf80bf/seo_sentinel-1.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c6f9b20a6419eb9e3dd56275b571e9fbc186bafed8d0922db2a126864caa268b",
"md5": "595682ab90ff151c1a91115ea885c245",
"sha256": "36c48d9ac008f8e301b47178d5612640e54131705468f9203265a70ca64e98b8"
},
"downloads": -1,
"filename": "seo_sentinel-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "595682ab90ff151c1a91115ea885c245",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 17500,
"upload_time": "2025-09-10T14:45:00",
"upload_time_iso_8601": "2025-09-10T14:45:00.505897Z",
"url": "https://files.pythonhosted.org/packages/c6/f9/b20a6419eb9e3dd56275b571e9fbc186bafed8d0922db2a126864caa268b/seo_sentinel-1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-10 14:45:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "nayandas69",
"github_project": "SEO-Sentinel",
"github_not_found": true,
"lcname": "seo-sentinel"
}