הגדרת ניטור מיקומים אוטומטי בגוגל וביאנדקס
מיקומי החיפוש אינם סטטיים: עדכוני אלגוריתם של גוגל ויאנדקס, פעילות מתחרים, שינויים באתר—כל אלה משפיעים על הדירוג. לדעת על שינויים שבוע או שבועיים לאחר מכן פירושו להגיב מאוחר מדי. אנו מגדירים ניטור אוטומטי ששולח התראה תוך 24 שעות. הניסיון שלנו כולל אוטומציה של מעקב עבור 50+ פרויקטים, ועם ניסיון של למעלה מ-10 שנים, אנו מבטיחים אמינות ודיוק.
מדוע ניטור ידני אינו יעיל
בדיקת מיקומים ידנית היא תהליך עתיר עבודה שנותן רק תמונת מצב רגעית. לשליטה יומית, נדרשות לפחות 30 דקות לכל 100 מילות מפתח. אוטומציה עובדת ללא התערבות אנושית ולוכדת אפילו ירידות קצרות טווח שנגרמות מעדכוני אלגוריתם ניסיוניים. השוואה: איסוף ידני של 500 מילות מפתח לוקח 2.5 שעות ביום (60+ שעות בחודש), בעוד שהגדרה אוטומטית אורכת 5 דקות ואפס זמן לאיסוף. שגיאות הזנה ידניות מתרחשות ב-5-10% מהרשומות; המערכת מבטלת אותן לחלוטין. לקוח אחד איבד 30% מהתנועה כי לא הבחין בירידה במיקומים במשך שבוע—התראות אוטומטיות היו מונעות את ההפסד.
כיצד אנו פותרים את בעיית עיכוב הנתונים
אנו משתמשים במקורות API שמחזירים מיקומים עדכניים בעיכוב של לא יותר מיום. שילוב של Google Search Console (חינמי, נתונים היסטוריים) ו-DataForSEO (בדיקה בזמן אמת) נותן תמונה מלאה. עבור יאנדקס, אנו משתמשים ב-XML API הרשמי, שגם הוא חינמי במסגרת המכסה.
| פרמטר | בדיקה ידנית | Google Search Console | DataForSEO API | Yandex XML API |
|---|---|---|---|---|
| עלות | חינם (זמן) | חינם | החל מכמה סנטים לשאילתה | חינם (מכסה) |
| רעננות | מיידית | 2–3 ימים | זמן אמת | זמן אמת |
| נפח בדיקה | 10–50 שאילתות/שעה | עד 1000 שאילתות/יום | ללא הגבלה | מכסה 1000–10000 שאילתות/יום |
| היסטוריה | אין | 28 ימים | ממועד החיבור | לא נשמרת |
DataForSEO עוקף את Google Search Console במהירות, ואת הבדיקה הידנית בסקלביליות. עבור יאנדקס, אנו משתמשים ב-XML API הרשמי, שהוא חינמי במסגרת המכסה.
| תדירות | ידני | אוטומטי | המלצה |
|---|---|---|---|
| יומי | 2.5 שעות ל-500 מילות מפתח | 10 דקות הגדרה + 0 איסוף | לנישות תחרותיות |
| שבועי | 30 דקות ל-100 מילות מפתח | 0 דקות | לשאילתות יציבות |
| חודשי | 10 דקות ל-50 מילות מפתח | 0 דקות | לשאילתות מותג |
ניטור אוטומטי חוסך עד פי 30 מהזמן לבדיקות יומיות.
מה כלול בהגדרת הניטור
- אינטגרציית API (DataForSEO, Google Search Console, Yandex XML) — רישום, קבלת מפתחות, ניתוב תעבורה.
- סקריפטים לאיסוף יומי — בפייתון עם טיפול בשגיאות, ניסיונות חוזרים, רישום לוגים.
- מסד נתונים PostgreSQL — מבנה לאחסון היסטוריית מיקומים עם אינדקסים לשאילתות מהירות.
- מערכת התראות — השוואת מיקומים נוכחיים לקודמים, שליחה לטלגרם כאשר חריגה מהסף.
- תיעוד — תיאור ארכיטקטורה, הוראות להוספה והסרה של מילות מפתח.
- אחריות — תמיכה חינמית למשך 30 יום לאחר ההשקה, תיקוני באגים במסגרת האחריות.
איך זה עובד: שלב אחר שלב
- ניתוח — איסוף כל מילות המפתח היעד, הגדרת אזורים ושפות.
- הגדרת API — חיבור מקורות נתונים, בדיקת שאילתות.
-
פריסת מסד נתונים — יצירת טבלאות
tracked_keywordsו-position_history. - הטמעת סקריפטים — ריצה יומית מתוזמנת (cron או Airflow).
- אינטגרציית התראות — הגדרת בוט טלגרם, קביעת ספים.
- השקה וניטור — אימות תקינות, מתן גישה לדשבורד.
בקשו הגדרת ניטור כבר עכשיו כדי לא לפספס שינויי מיקומים.
דוגמת אינטגרציה עם DataForSEO
import requests, json, base64
class DataForSEOClient:
BASE_URL = 'https://api.dataforseo.com/v3'
def __init__(self, login: str, password: str):
creds = base64.b64encode(f'{login}:{password}'.encode()).decode()
self.headers = {
'Authorization': f'Basic {creds}',
'Content-Type': 'application/json',
}
def check_positions(self, keyword, target_domain, location_code=2840, language_code='en', depth=100):
payload = [{
'keyword': keyword,
'target': target_domain,
'location_code': location_code,
'language_code': language_code,
'depth': depth,
}]
resp = requests.post(f'{self.BASE_URL}/serp/google/organic/live/advanced', headers=self.headers, data=json.dumps(payload), timeout=60)
resp.raise_for_status()
return resp.json()
def parse_position(self, response, target_domain):
tasks = response.get('tasks', [])
if not tasks:
return None
items = tasks[0].get('result', [{}])[0].get('items', [])
for item in items:
if item.get('type') == 'organic' and target_domain in item.get('domain', ''):
return {'position': item.get('rank_absolute'), 'url': item.get('url'), 'title': item.get('title'), 'featured_snippet': item.get('rank_absolute') == 0}
return None
מבנה מסד נתונים להיסטוריית מיקומים
CREATE TABLE tracked_keywords (
id SERIAL PRIMARY KEY,
keyword TEXT NOT NULL,
target_domain TEXT NOT NULL,
search_engine VARCHAR(20) DEFAULT 'google',
location_code INTEGER,
language_code VARCHAR(10),
active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE position_history (
id SERIAL PRIMARY KEY,
keyword_id INTEGER REFERENCES tracked_keywords(id),
position INTEGER,
url TEXT,
checked_at DATE NOT NULL,
UNIQUE(keyword_id, checked_at)
);
CREATE INDEX idx_positions_keyword_date ON position_history(keyword_id, checked_at DESC); ריצה יומית של ניטור והתראות
import psycopg2
from datetime import date
def run_daily_check(db_conn, dfs_client, target_domain):
today = date.today().isoformat()
with db_conn.cursor() as cur:
cur.execute('SELECT id, keyword, search_engine, location_code, language_code FROM tracked_keywords WHERE active = true')
keywords = cur.fetchall()
for kw_id, keyword, engine, loc_code, lang_code in keywords:
try:
response = dfs_client.check_positions(keyword=keyword, target_domain=target_domain, location_code=loc_code or 2840, language_code=lang_code or 'en')
result = dfs_client.parse_position(response, target_domain)
position = result['position'] if result else None
url = result['url'] if result else None
with db_conn.cursor() as cur:
cur.execute('''
INSERT INTO position_history (keyword_id, position, url, checked_at)
VALUES (%s, %s, %s, %s)
ON CONFLICT (keyword_id, checked_at) DO UPDATE SET
position = EXCLUDED.position,
url = EXCLUDED.url
''', (kw_id, position, url, today))
db_conn.commit()
except Exception as e:
print(f'Error checking {keyword}: {e}')
def detect_significant_changes(db_conn, threshold=5):
with db_conn.cursor() as cur:
cur.execute('''
WITH ranked AS (
SELECT
k.keyword,
p.position,
p.checked_at,
LAG(p.position) OVER (PARTITION BY p.keyword_id ORDER BY p.checked_at) AS prev_position
FROM position_history p
JOIN tracked_keywords k ON k.id = p.keyword_id
WHERE p.checked_at >= CURRENT_DATE - INTERVAL '2 days'
)
SELECT
keyword,
prev_position,
position,
(COALESCE(prev_position, 101) - COALESCE(position, 101)) AS change
FROM ranked
WHERE prev_position IS NOT NULL
AND ABS(COALESCE(prev_position, 101) - COALESCE(position, 101)) >= %s
ORDER BY ABS(change) DESC
''', (threshold,))
return [{'keyword': row[0], 'prev': row[1], 'current': row[2], 'change': row[3], 'direction': 'up' if row[3] > 0 else 'down'} for row in cur.fetchall()]
הודעות טלגרם
import httpx
def send_telegram_alert(bot_token, chat_id, changes):
if not changes:
return
lines = ['*Изменения позиций за сутки:*\n']
for ch in changes[:20]:
arrow = '↑' if ch['direction'] == 'up' else '↓'
prev = ch['prev'] or '100+'
curr = ch['current'] or '100+'
lines.append(f"{arrow} `{ch['keyword']}`: {prev} → {curr}")
text = '\n'.join(lines)
httpx.post(f'https://api.telegram.org/bot{bot_token}/sendMessage', json={'chat_id': chat_id, 'text': text, 'parse_mode': 'Markdown'}) לוחות זמנים ועלות
הגדרת ניטור לדומיין אחד עם אחסון PostgreSQL והתראות טלגרם אורכת 2–3 ימי עסקים. הוספת ויזואליזציה (Grafana/Metabase), תמיכה במספר אתרים, וייבוא אוטומטי של מילות מפתח מ-Search Console אורכת 4–6 ימים. העלות מחושבת באופן אישי לפי נפח מילות המפתח והאינטגרציות הנדרשות. קבלו ייעוץ להערכה מדויקת.
תיעוד DataForSEO SERP API documentation
בנוסף: אלגוריתמי החיפוש של גוגל — הבנת הדירוג עוזרת לפרש טוב יותר את נתוני הניטור.







