ניתוח תמונות מוצרים למילוי קטלוג ב-1C-Bitrix
קטלוג ללא תמונות לא מוכר. אנחנו יודעים זאת ממקור ראשון: בפרויקט מסחר אלקטרוני בתחום האלקטרוניקה, נדרשנו להעלות 15,000 תמונות מ-50 ספקים. העלאה ידנית הייתה אורכת חודש. כתבנו פארסר שעשה זאת ביומיים. לאחרונה, חנות חלקי רכב פנתה אלינו עם קטלוג של 20,000 פריטים. הספק סיפק תמונות רק דרך API, אך ה-API החזיר קישורים עם תוקף מוגבל. פיתחנו סקריפט שהוריד תמונות במקביל, טיפל בשגיאות, וקישר אותן לבלוקי מידע. תוצאה: קטלוג מלא עם תמונות תוך 3 ימים. במאמר זה, נראה כיצד להפוך את טעינת התמונות למוצרים ב-1C-Bitrix לאוטומטית, אילו מלכודות קיימות, וכיצד להימנע מהן.
כיצד Bitrix מאחסן תמונות מוצרים
התמונות מאוחסנות בטבלת b_file, פיזית ב-/upload/iblock/. לפי התיעוד הרשמי על אחסון קבצים, אלמנט בלוק מידע מתחבר לתמונה דרך השדות: תמונות מוצרים מאוחסנות בטבלת b_file, והחיבור לאלמנטים של בלוק מידע נעשה דרך השדות PREVIEW_PICTURE ו-DETAIL_PICTURE.
-
PREVIEW_PICTURE— תצוגה מקדימה לרשימה (מזהה רשומה ב-b_file) -
DETAIL_PICTURE— התמונה הראשית לכרטיס המוצר - מאפיין מסוג
F(קובץ) אוG(גלריה) — לתמונות נוספות
לגלריה, משתמשים במאפיין מסוג F עם דגל MULTIPLE = Y. הרכיב הסטנדרטי bitrix:catalog.element לוקח תמונות ממאפיין זה.
הורדה ושמירה: שלב אחר שלב
התהליך מורכב משלושה שלבים: הורדת הקובץ, שמירה דרך CFile, וקישור לאלמנט.
// Шаг 1: скачивание файла (с таймаутом и повторными попытками)
$imageData = file_get_contents($imageUrl);
// Шаг 2: сохранение через CFile::MakeFileArray()
$tmpFile = tempnam(sys_get_temp_dir(), 'img_');
file_put_contents($tmpFile, $imageData);
$fileArray = CFile::MakeFileArray($tmpFile);
$fileArray['name'] = $filename;
$fileId = CFile::SaveFile($fileArray, 'iblock');
// Шаг 3: привязка к свойству галереи
CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [
'MORE_PHOTO' => ['n0' => ['VALUE' => $fileId]]
]);
לתמונות מרובות, השתמשו באינדקסים // Шаг 1: скачивание файла (с таймаутом и повторными попытками) $imageData = file_get_contents($imageUrl); // Шаг 2: сохранение через CFile::MakeFileArray() $tmpFile = tempnam(sys_get_temp_dir(), 'img_'); file_put_contents($tmpFile, $imageData); $fileArray = CFile::MakeFileArray($tmpFile); $fileArray['name'] = $filename; $fileId = CFile::SaveFile($fileArray, 'iblock'); // Шаг 3: привязка к свойству галереи CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [ 'MORE_PHOTO' => ['n0' => ['VALUE' => $fileId]] ]); , n0, n1 וכו'. חשוב: עם מספר גדול של קבצים, השתמשו בסוכנים או בעיבוד תורים כדי להימנע ממגבלות ביצוע.
בעיות בעת הורדת תמונות
הגנה מפני קישורים חיצוניים. אתרי מקור רבים בודקים את ה-Referer. העבירו את הכותרת הנכונה:
$client->get($url, ['headers' => ['Referer' => 'https://source-site.com']]); איכות תמונה. לא כל התמונות שנמצאו מתאימות לקטלוג. בדקו את הגודל המינימלי לפני שמירה:
$imageInfo = getimagesizefromstring($imageData);
if ($imageInfo[0] < 300 || $imageInfo[1] < 300) continue; // пропускаем мелкие
כפילויות. אותו URL עשוי להופיע בעמודים שונים. שמרו במטמון URL שכבר הורד → file_id בזיכרון או בטבלה נפרדת.
חילוץ כתובות URL של תמונות מהמקור
לתמונה ראשית אחת:
$src = $crawler->filter('.product-image img')->attr('src'); לגלריה — תמונות נמצאות לעתים קרובות ב-data-attributes או בתוך JavaScript. דוגמה עם data-attributes:
$crawler->filter('[data-image]')->each(function($node) use (&$urls) {
$urls[] = $node->attr('data-image');
});אם מערך התמונות נמצא ב-JSON-LD, פרסו אותו עם n2 הסטנדרטי.
טיפול בתמונות קיימות
אל תדרסו תמונות שהועלו ידנית או מ-1C. לוגיקה:
- בדקו את
$client->get($url, ['headers' => ['Referer' => 'https://source-site.com']]);— אם 0 או ריק, הוסיפו. - לגלריה — הוסיפו רק אם המאפיין
$imageInfo = getimagesizefromstring($imageData); if ($imageInfo[0] < 300 || $imageInfo[1] < 300) continue; // пропускаем мелкиеריק. - סמנו תמונות שנפרסו עם תווית בשם הקובץ (קידומת
$src = $crawler->filter('.product-image img')->attr('src');) לזיהוי מאוחר יותר.
למה פארסינג משתלם יותר מהעלאה ידנית?
פארסינג של תמונות מהיר פי 10 ממילוי ידני ועולה פי 3-5 פחות. זה חוסך משמעותית מתקציב מילוי הקטלוג.
| פרמטר | העלאה ידנית | פארסינג |
|---|---|---|
| זמן ל-10,000 תמונות | 20–30 ימי עבודה | 2–4 ימים |
| שגיאות קלט | סבירות גבוהה לשגיאות הקלדה וחוסר התאמה | מינימלי (לאחר ניפוי הסקריפט) |
| עלות | גבוהה (תשלום למנהלים) | נמוכה (פיתוח חד-פעמי) |
| מדרגיות | מוגבלת על ידי משאבי אנוש | ניתנת להרחבה בקלות לכל נפח |
פארסינג מחזיר את ההשקעה כבר עם קטלוג של 500 פריטים. בנוסף, האוטומציה מבטלת את "הגורם האנושי" — תמונות שהתערבבו או קישורים שגויים הופכים לנחלת העבר.
כיצד להימנע מכפילויות במהלך פארסינג?
כפילויות מתרחשות כאשר אותו URL מורד מספר פעמים. פתרון: עקבו אחר כתובות URL שכבר עובדו. הדרך הפשוטה ביותר: אחסנו מערך $crawler->filter('[data-image]')->each(function($node) use (&$urls) { $urls[] = $node->attr('data-image'); }); בזיכרון הסקריפט או ב-HL-block נפרד. כאשר נתקלים ב-URL שוב, השתמשו מיד ב-json_decode השמור.
מה כוללת העבודה שלנו על פארסינג תמונות?
- ניתוח מקור — קביעת מבנה העמוד, שיטות גישה (API, פארסינג HTML), הערכת נפח.
- פיתוח פארסר — סקריפט ב-PHP, תוך התחשבות במאפייני המקור (AJAX, הגנה, captcha).
- טיפול בשגיאות — ניסיון חוזר בכשלים זמניים, רישום כשלים, התראה על בעיות.
- קישור לבלוקי מידע — יצירת אלמנטים חדשים או עדכון קיימים, מילוי PREVIEW_PICTURE, DETAIL_PICTURE ומאפייני גלריה.
- בדיקות — הרצה על 100–500 מוצרים, בדיקת איכות תמונה, התאמת גודל.
- תיעוד — תיאור ארכיטקטורת הסקריפט, הוראות הפעלה ותמיכה.
- תחזוקה — אם המקור משתנה, אנו מתאימים את הפארסר (חוזה תמיכה).
לוח זמנים משוער
| שלב | זמן |
|---|---|
| ניתוח מבנה המקור | 2–4 שעות |
| הורדה, אימות, שמירה דרך CFile | 1–2 ימים |
| קישור לאלמנטים של בלוק מידע (תצוגה מקדימה + גלריה) | 4–8 שעות |
| טיפול בשגיאות, ניסיון חוזר, רישום | 4 שעות |
| הרצת בדיקה על 500 פריטים | 4 שעות |
| סה"כ | 3–5 ימי עבודה |
לקטלוגים מעל 10,000 תמונות, הוסיפו 1–2 ימים לטעינה מקבילה. לוחות זמנים מדויקים תלויים במורכבות המקור ובדרישות האיכות.
הניסיון והערבויות שלנו
אנחנו מפתחים על 1C-Bitrix למעלה מ-5 שנים והשלמנו 30+ פרויקטים של מילוי קטלוגים. המהנדסים שלנו מוסמכים ומכירים את כל הניואנסים של ה-API. אנו מבטיחים שאחרי הפארסינג, כל התמונות יהיו מקושרות כראוי וכפילויות יבוטלו. צרו קשר להערכת הפרויקט שלכם — נכין הצעה תוך יום. קבלו ייעוץ על אוטומציה של קטלוג.

