תארו לעצמכם: באתר שלכם יש מאות עמודים עם קישורים חיצוניים. חודש לאחר הביקורת האחרונה, אחד הקישורים מפסיק לעבוד — המשאב הוסר. אתם מאבדים מיקומים במנועי חיפוש בגלל קישורים שבורים (שגיאות 404), ומשתמשים עוזבים את העמוד שאינו פעיל. לפי Moz, יותר מ-30% מהמשתמשים נוטשים את האתר כשהם נתקלים בקישור שבור. כל שגיאת 404 היא אות לאיכות נמוכה של האתר בעיני מנועי החיפוש. אנחנו פותרים את הבעיה הזו: אנו מגדירים סריקה אוטומטית של כל הקישורים בלוח זמנים עם התראות על שגיאות שזוהו. אתם מקבלים דוח לפני שהבעיה משפיעה על SEO או על חוויית המשתמש.
מדוע קישורים שבורים פוגעים ב-SEO
מנועי החיפוש Google ו-Yandex מתחשבים בנוכחות קישורים שאינם עובדים בדירוג שלהם. כל שגיאת 404 היא אות לאיכות נמוכה של האתר. קריטיים במיוחד הם קישורים שבורים בתפריט, בכותרת התחתונה ובדפי נחיתה — הם משפיעים ישירות על גורמים התנהגותיים. ניטור אוטומטי מאפשר לזהות בעיה תוך דקות, לא ימים. Google Search Console מתעד שגיאות 404 באיחור; הגישה שלנו נותנת לכם מידע עדכני בזמן אמת. לפי הנתונים שלנו, זיהוי בזמן של קישורים שבורים מפחית את שיעור הנטישה ב-15%.
כיצד פועלת הבדיקה האוטומטית
אנו משתמשים ב-סורק אסינכרוני בפייתון עם ספריית aiohttp. הוא מעבד עד 20 קישורים במקביל, ובודק את סטטוס ה-HTTP של כל אחד. כאשר מתגלה שגיאה (4xx, 5xx, פסק זמן), הקישור נרשם עם העמוד שמפנה אליו. לאחר סיום הסריקה, נוצר דוח עם רשימה מלאה של קישורים שבורים ונשלח לערוץ שנבחר (Slack, Telegram, דוא"ל). אנו מגדירים התראות כך שתקבלו דוח יומי עם סיכום קצר וקישור ל-CSV המלא. עבור אתר עם 5000 עמודים, סריקה מלאה אורכת כשעה.
תהליך ההתקנה שלב אחר שלב:
- הגדרת סביבת Python והתלויות (aiohttp, BeautifulSoup, Celery).
- הגדרת הסורק: ציון כתובת URL התחלתית, הגבלות דומיין, פסקי זמן.
- הגדרת מתזמן Celery Beat לביצוע יומי.
- שילוב התראות ב-Slack או ב-Telegram.
- בדיקת התרחיש על סביבת בדיקה.
יישום טכני
# broken_link_checker.py
import asyncio
import aiohttp
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup
from collections import defaultdict
class BrokenLinkChecker:
def __init__(self, base_url: str, concurrency: int = 20):
self.base_url = base_url
self.domain = urlparse(base_url).netloc
self.semaphore = asyncio.Semaphore(concurrency)
self.visited: set[str] = set()
self.broken: list[dict] = []
async def check(self) -> list[dict]:
async with aiohttp.ClientSession(
timeout=aiohttp.ClientTimeout(total=15),
headers={'User-Agent': 'LinkChecker/1.0'},
) as session:
await self.crawl(session, self.base_url, referrer='root')
return self.broken
async def crawl(self, session: aiohttp.ClientSession, url: str, referrer: str):
if url in self.visited:
return
self.visited.add(url)
async with self.semaphore:
try:
async with session.get(url, allow_redirects=True) as resp:
status = resp.status
if status >= 400:
self.broken.append({'url': url, 'status': status, 'referrer': referrer})
return
# Парсим только HTML страницы своего домена
if urlparse(url).netloc == self.domain and 'text/html' in resp.headers.get('Content-Type', ''):
html = await resp.text()
links = self.extract_links(url, html)
tasks = [self.crawl(session, link, url) for link in links if link not in self.visited]
await asyncio.gather(*tasks, return_exceptions=True)
except asyncio.TimeoutError:
self.broken.append({'url': url, 'status': 'timeout', 'referrer': referrer})
except Exception as e:
self.broken.append({'url': url, 'status': str(e), 'referrer': referrer})
def extract_links(self, base: str, html: str) -> list[str]:
soup = BeautifulSoup(html, 'lxml')
links = []
for tag in soup.find_all(['a', 'link', 'img', 'script'], href=True):
href = tag.get('href') or tag.get('src')
if href:
absolute = urljoin(base, href)
parsed = urlparse(absolute)
if parsed.scheme in ('http', 'https'):
links.append(absolute.split('#')[0])
return list(set(links)) מתזמן והתראות
# scheduler.py (Celery Beat)
from celery import Celery
from broken_link_checker import BrokenLinkChecker
import asyncio
import requests
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def check_broken_links():
checker = BrokenLinkChecker('https://example.com', concurrency=15)
broken = asyncio.run(checker.check())
if not broken:
return {'status': 'ok', 'checked': len(checker.visited)}
# Отправляем отчёт в Slack
message = f"🔗 Найдено {len(broken)} битых ссылок:\n"
for item in broken[:10]: # Первые 10
message += f"• `{item['status']}` {item['url']}\n ← {item['referrer']}\n"
if len(broken) > 10:
message += f"...и ещё {len(broken) - 10}. Полный отчёт в CSV.\n"
requests.post(os.env['SLACK_WEBHOOK'], json={'text': message})
# Сохраняем в БД для истории
BrokenLinkReport.objects.create(
checked_at = timezone.now(),
total_links = len(checker.visited),
broken_count = len(broken),
details = broken,
)
return {'broken': len(broken)} # Расписание: каждый день в 6:00
app.conf.beat_schedule = {
'daily-link-check': {
'task': 'scheduler.check_broken_links',
'schedule': crontab(hour=6, minute=0),
},
} כיצד להימנע מעומס על השרת
הסורק פועל על שרת נפרד, ואינו מעמיס על האחסון שלכם. אנו מגדירים השהיות בין בקשות ומכבדים הוראות robots.txt. אם האתר גדול (מעל 10,000 עמודים), אנו מפרקים את הסריקה לשלבים ומשתמשים בתורים מבוזרים דרך Celery. זה מבטיח שהבדיקה לא משפיעה על ביצועי האתר עבור משתמשים אמיתיים. צרו קשר, ונמצא את התצורה האופטימלית לפרויקט שלכם.
פרטים טכניים על טיפול בהפניות
הסורק עוקב אחר הפניות (allow_redirects=True) ומתעד את הסטטוס הסופי. אם הפניה מובילה ל-404, היא נחשבת גם היא לשגיאה. עבור שרשראות הפניות, נעשה שימוש במספר מקסימלי של קפיצות (ברירת מחדל: 10).
השוואת שיטות לבדיקת קישורים
| שיטה | מאמץ | תדירות | דיוק |
|---|---|---|---|
| בדיקה ידנית | גבוה (4 שעות ל-500 עמודים) | פעם בחודש או פחות | סובייקטיבי, מפספס |
| אוטומטי (הגישה שלנו) | נמוך (5 דקות ל-500 עמודים) | יומי | סריקה של 100% מכל הקישורים |
בדיקה אוטומטית מהירה פי 50 מבדיקה ידנית ומבטלת טעויות אנוש. לצוות שלנו ניסיון רב שנים בביקורות SEO ופיתוח סקריפטים לניתוח אתרים, עם יותר מ-100 פרויקטים לאוטומציה של ניטור קישורים.
טעויות נפוצות בהתקנה עצמית
| טעות | השלכה | הפתרון שלנו |
|---|---|---|
| אין פסק זמן | תקיעה על משאבים איטיים | אנו מגדירים פסק זמן של 15 שניות |
| התעלמות מקישורי JS | סריקה לא מלאה | אנו מנתחים HTML מלא, כולל קישורים שנטענים דינמית |
| התעלמות מעמודי הפניה | קשה למצוא את עמוד המקור | אנו שומרים את עמוד ההפניה עבור כל כתובת URL שנמצאה |
באילו כלים אנו משתמשים?
הערכה המרכזית: Python 3.11, aiohttp לבקשות אסינכרוניות, BeautifulSoup לניתוח HTML, Celery לתזמון משימות, ו-Redis כתור הודעות. כל הכלים הם קוד פתוח ומתועדים היטב.
מה כלול בהתקנה
- ניתוח מבנה האתר — קביעת נפח הקישורים והסעיפים המועדפים.
- הגדרת הסורק — קביעת עומק סריקה, הגבלות דומיין, פסקי זמן.
- תזמון סריקות — קביעת תדירות (יומי, שבועי) ושעת התחלה.
- שילוב התראות — חיבור Slack, Telegram או דוא"ל; הגדרת פורמט הדוח.
- בדיקות — אימות פעולה תקינה על תרחיש בדיקה.
- תיעוד ותמיכה — מתן מדריך הפעלה, הצעת חודש תמיכה.
לוחות זמנים ועלות
ההתקנה אורכת בין יום ליום עסקים אחד עד שניים. העלות מחושבת באופן אישי לפי מורכבות. אנו מבטיחים שהסורק פועל ללא עומס על השרת שלכם. קבלו ייעוץ על הגדרת ניטור קישורים שבורים כבר היום.







