| import json |
| import os |
|
|
| def generate_json_report(data, output_file="report.json"): |
| """ |
| Generates a JSON report of the site analysis. |
| """ |
| try: |
| with open(output_file, 'w') as f: |
| json.dump(data, f, indent=4) |
| print(f"JSON report generated at {os.path.abspath(output_file)}") |
| except Exception as e: |
| print(f"Error generating JSON report: {e}") |
|
|
| def generate_html_report(data, output_file="report.html"): |
| """ |
| Generates an HTML report for the domain scan. |
| """ |
| summary = data['summary'] |
| details = data['details'] |
|
|
| html = f""" |
| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>SEO Image Alt Text Report</title> |
| <style> |
| body {{ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; padding: 20px; background-color: #f4f6f9; }} |
| h1, h2 {{ color: #333; }} |
| .container {{ max-width: 1200px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }} |
| .summary-box {{ display: flex; gap: 20px; margin-bottom: 30px; }} |
| .card {{ flex: 1; padding: 20px; border-radius: 8px; color: white; text-align: center; }} |
| .bg-blue {{ background-color: #007bff; }} |
| .bg-green {{ background-color: #28a745; }} |
| .bg-red {{ background-color: #dc3545; }} |
| .card h3 {{ margin: 0; font-size: 3em; }} |
| .card p {{ margin: 0; opacity: 0.9; }} |
| |
| table {{ border-collapse: collapse; width: 100%; margin-top: 10px; }} |
| th, td {{ border: 1px solid #dee2e6; padding: 12px; text-align: left; }} |
| th {{ background-color: #f8f9fa; color: #495057; }} |
| tr:nth-child(even) {{ background-color: #f9f9f9; }} |
| .page-section {{ margin-bottom: 40px; border-top: 2px solid #eee; padding-top: 20px; }} |
| .page-url {{ font-size: 1.2em; font-weight: bold; color: #0056b3; margin-bottom: 10px; display: block; }} |
| .no-issues {{ color: #28a745; font-style: italic; }} |
| .img-link {{ word-break: break-all; color: #555; }} |
| </style> |
| </head> |
| <body> |
| <div class="container"> |
| <h1>SEO Image Alt Text Report</h1> |
| |
| <div class="summary-box"> |
| <div class="card bg-blue"> |
| <h3>{summary['total_pages_scanned']}</h3> |
| <p>Pages Scanned</p> |
| </div> |
| <div class="card bg-green"> |
| <h3>{summary['total_images_found']}</h3> |
| <p>Total Images Found</p> |
| </div> |
| <div class="card bg-red"> |
| <h3>{summary['total_images_missing_alt']}</h3> |
| <p>Images Missing Alt Text</p> |
| </div> |
| </div> |
| """ |
|
|
| if summary.get('crawl_blocked'): |
| html += f""" |
| <div style="background-color: #fff3cd; color: #856404; padding: 15px; border: 1px solid #ffeeba; border-radius: 5px; margin-bottom: 20px;"> |
| <strong>⚠️ CRAWL BLOCKED:</strong> The crawler was blocked by the site ({summary.get('blocked_reason')}). Results are likely incomplete. |
| <p>Try using a residential proxy or a headless browser with stealth plugins to bypass this restriction.</p> |
| </div> |
| """ |
| |
| html += """ |
| <h2>Detailed Breakdown</h2> |
| """ |
|
|
| if not details: |
| html += "<p class='no-issues'>No pages found with missing alt text images! Great job.</p>" |
| |
| for page in details: |
| html += f""" |
| <div class="page-section"> |
| <a href="{page['page_url']}" class="page-url" target="_blank">Page: {page['page_url']}</a> |
| <p><strong>{page['missing_alt_count']}</strong> images missing alt text</p> |
| <table> |
| <tr><th>Image Source URL</th></tr> |
| """ |
| for img_src in page['images_without_alt']: |
| html += f""" |
| <tr> |
| <td><a href="{img_src}" target="_blank" class="img-link">{img_src}</a></td> |
| </tr> |
| """ |
| html += "</table></div>" |
|
|
| html += """ |
| </div> |
| </body> |
| </html> |
| """ |
| |
| try: |
| with open(output_file, 'w') as f: |
| f.write(html) |
| print(f"HTML report generated at {os.path.abspath(output_file)}") |
| except Exception as e: |
| print(f"Error generating HTML report: {e}") |
|
|
|
|
|
|
|
|
|
|