أتمتة البحث عن المرشحين في LinkedIn: دليلك الشامل لاستخدام Google Apps Script!
اكتشف كيف يمكنك بناء نظام مجاني وفعال لجلب بيانات المرشحين مباشرة إلى Google Sheets باستخدام قوة الأتمتة.
في عالم التوظيف سريع الخطى، يعد العثور على المرشحين المناسبين بكفاءة أمرًا بالغ الأهمية. يقدم لك هذا الدليل حلاً شاملاً ومجانياً يعتمد على Google Apps Script لأتمتة عملية البحث عن مرشحين محتملين على LinkedIn، وتحديداً باستخدام تقنية البحث المتقدم المعروفة باسم "X-ray search"، ثم تخزين النتائج مباشرة في Google Sheets. ستتعلم خطوة بخطوة كيف تنشئ سكربتًا يقوم بالبحث، استخراج البيانات، وتخزينها بشكل منظم.
أبرز النقاط الرئيسية
- أتمتة مجانية بالكامل: تعلم كيف تستغل Google Apps Script لإنشاء نظام بحث عن المرشحين دون أي تكاليف إضافية.
- استهداف دقيق مع X-ray Search: استخدم قوة بحث Google المتقدم (X-ray) للعثور على ملفات LinkedIn الشخصية التي تطابق معاييرك بدقة.
- تنظيم البيانات الفوري: احصل على روابط المرشحين ومعلوماتهم الأساسية منظمة تلقائيًا في Google Sheets، جاهزة للمراجعة والاستخدام.
مقدمة إلى أتمتة البحث باستخدام Google Apps Script
Google Apps Script هي منصة تطوير تعتمد على JavaScript وتعمل في سحابة Google. تتيح لك إنشاء تطبيقات تتكامل بسلاسة مع خدمات Google Workspace مثل Sheets, Docs, Gmail وغيرها. في سياقنا هذا، سنستخدمها لإنشاء أداة مخصصة تقوم بالمهام التالية:
- إنشاء ملف Google Sheets جديد تلقائيًا (إذا لم يكن موجودًا).
- إنشاء ورقة عمل جديدة لكل عملية بحث، مع تسجيل تاريخ ووقت التنفيذ لسهولة التتبع.
- تنفيذ بحث على Google باستخدام سلسلة بحث بولينية (Boolean) محددة، تستهدف بشكل خاص ملفات LinkedIn الشخصية (تقنية X-ray).
- استخراج روابط ملفات LinkedIn من صفحات نتائج البحث.
- جلب النتائج بشكل متكرر (عادةً 10 نتائج في كل مرة) حتى الوصول إلى العدد المطلوب (افتراضيًا 50 نتيجة).
- حفظ روابط الملفات الشخصية، ومعلومات إضافية محتملة مثل الاسم والمسمى الوظيفي والشركة الحالية، في ورقة العمل المنشأة.
تقنية X-ray search هي طريقة لاستخدام محركات البحث (مثل Google) للبحث داخل موقع ويب معين عن طريق استخدام عوامل تشغيل متقدمة. على سبيل المثال، يمكنك استخدام site:linkedin.com/in/ مع كلمات مفتاحية أخرى للعثور على ملفات شخصية عامة على LinkedIn.
صورة توضيحية لمفهوم أتمتة سير العمل باستخدام أدوات مشابهة لـ Google Apps Script.
خطوات إنشاء سكربت الأتمتة
لتنفيذ هذا النظام، سنتبع سلسلة من الخطوات المنطقية داخل بيئة Google Apps Script. إليك تفصيل لكل خطوة:
1. إعداد بيئة Google Apps Script
فتح محرر السكربت
أولاً، افتح ملف Google Sheets جديدًا أو موجودًا. من القائمة العلوية، اختر "الامتدادات" (Extensions) ثم "Apps Script". سيؤدي ذلك إلى فتح محرر السكربت في علامة تبويب جديدة بالمتصفح.
2. إنشاء ملف Google Sheets وورقة العمل
التعامل مع جداول البيانات والأوراق
سيقوم السكربت بالتحقق من وجود ملف Sheets محدد. إذا لم يكن موجودًا، سينشئ واحدًا جديدًا. بعد ذلك، لكل عملية بحث، سينشئ ورقة عمل جديدة داخل هذا الملف. سيتم تسمية ورقة العمل بتاريخ ووقت التنفيذ لضمان تنظيم السجلات وسهولة الرجوع إليها.
SpreadsheetApp.create("اسم الملف"): لإنشاء جدول بيانات جديد.SpreadsheetApp.getActiveSpreadsheet()أوSpreadsheetApp.openById("ID_الملف"): للوصول إلى جدول بيانات موجود.spreadsheet.insertSheet("اسم الورقة"): لإدراج ورقة عمل جديدة.
3. تحديد وتنفيذ بحث X-ray على Google
صياغة استعلام البحث
ستحتاج إلى بناء "سلسلة بحث بولينية" (Boolean search string) دقيقة. هذه السلسلة هي التي توجه Google للبحث عن ملفات شخصية محددة على LinkedIn. مثال على سلسلة بحث X-ray:
site:linkedin.com/in/ "Software Engineer" AND "AI" NOT "Intern"
هذه السلسلة تبحث عن ملفات شخصية عامة على LinkedIn (site:linkedin.com/in/) لأشخاص لديهم المسمى "Software Engineer" ومهارة "AI" ولكن ليسوا "Intern".
إرسال طلب البحث
يستخدم السكربت خدمة UrlFetchApp.fetch() لإرسال طلب HTTP إلى Google بعنوان URL يحتوي على سلسلة البحث المشفرة. من المهم إضافة رأس User-Agent مناسب لمحاكاة متصفح حقيقي وتقليل احتمالية الحظر.
var searchQuery = 'site:linkedin.com/in/ "Product Manager" AND "SaaS"';
var googleSearchUrl = "https://www.google.com/search?q=" + encodeURIComponent(searchQuery);
var options = {
"headers": {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
},
"muteHttpExceptions": true // لمنع إيقاف السكربت عند حدوث أخطاء HTTP
};
var response = UrlFetchApp.fetch(googleSearchUrl, options);
var htmlContent = response.getContentText();
ملاحظة هامة: جلب البيانات مباشرة من صفحات نتائج بحث Google (المعروف بـ "scraping") قد يتعارض مع شروط خدمة Google. يجب استخدام هذه التقنية بمسؤولية وبمعدلات طلب معقولة لتجنب الحظر.
4. استخراج البيانات بشكل متكرر
التعامل مع صفحات النتائج المتعددة
عادةً ما يعرض Google حوالي 10 نتائج في كل صفحة. لجلب العدد المطلوب من النتائج (مثلاً 50)، يحتاج السكربت إلى تكرار عملية البحث، مع تعديل معلمة start في عنوان URL للانتقال إلى الصفحات التالية (start=0 للصفحة الأولى، start=10 للثانية، وهكذا).
تحليل محتوى HTML واستخلاص الروابط
بعد الحصول على محتوى HTML لصفحة نتائج البحث، يستخدم السكربت تعابير منتظمة (Regular Expressions) للبحث عن الأنماط التي تطابق روابط ملفات LinkedIn الشخصية (عادةً ما تبدأ بـ https://www.linkedin.com/in/). هذه هي الخطوة الأكثر حساسية لأن بنية صفحات Google قد تتغير، مما قد يؤدي إلى توقف عمل التعابير المنتظمة.
function extractLinkedInLinks(html) {
// هذا التعبير المنتظم هو مثال وقد يحتاج إلى تعديل بناءً على بنية HTML الحالية لـ Google
var regex = /https:\/\/www\.linkedin\.com\/in\/[a-zA-Z0-9_-]+/g;
var matches = html.match(regex);
if (matches) {
// إزالة الروابط المكررة
return [...new Set(matches)];
}
return [];
}
5. تخزين البيانات في Google Sheets
كتابة النتائج في الجدول
بمجرد استخلاص روابط LinkedIn، يتم إضافتها كصفوف جديدة في ورقة العمل المخصصة باستخدام sheet.appendRow([link]). يمكن إضافة أعمدة إضافية مثل "الاسم"، "المسمى الوظيفي"، و "الشركة الحالية".
استخراج معلومات إضافية (اختياري ومتقدم)
محاولة استخراج الاسم، المسمى الوظيفي، والشركة مباشرة من صفحة نتائج بحث Google أو عن طريق زيارة كل رابط ملف شخصي على LinkedIn هي عملية معقدة للغاية وغير موثوقة. زيارة كل ملف شخصي برمجيًا قد ينتهك شروط خدمة LinkedIn وقد يتطلب مصادقة وآليات متقدمة لتجنب الحظر. لذلك، يركز السكربت الأساسي على جلب الروابط. إذا كنت بحاجة إلى هذه البيانات الإضافية، فقد تحتاج إلى أدوات متخصصة أو الوصول إلى LinkedIn API (وهو محدود).
مقارنة نهج الأتمتة
يوضح المخطط الشعاعي التالي مقارنة بين النهج اليدوي للبحث عن المرشحين واستخدام سكربت Google Apps Script بدرجات متفاوتة من التعقيد. التقييمات هي تقديرية لأغراض التوضيح.
شرح المخطط: يشير التقييم الأعلى (باتجاه 10) إلى أداء أفضل أو ميزة أكبر في ذلك الجانب. على سبيل المثال، "التكلفة" العالية تعني أنه أكثر فعالية من حيث التكلفة (أقل تكلفة). "مخاطر الامتثال" العالية تعني مخاطر أعلى.
مخطط سير عمل سكربت الأتمتة
يوضح المخطط الذهني التالي الخطوات الرئيسية التي يتبعها سكربت Google Apps Script لأتمتة عملية البحث عن المرشحين من LinkedIn وتخزين النتائج.
مثال: site:linkedin.com/in/ 'الكلمة المفتاحية' AND 'الموقع'"] id3["3. تنفيذ البحث وجلب النتائج"] id3_1["استخدام
UrlFetchApp.fetch() لإرسال طلب إلى Google"]
id3_2["التكرار عبر صفحات النتائج (معلمة start)للحصول على العدد المطلوب (مثلاً 50 نتيجة)"] id3_3["إضافة تأخير
Utilities.sleep() بين الطلبات"]
id4["4. تحليل HTML واستخراج البيانات"]
id4_1["الحصول على محتوى HTML لصفحة النتائج"]
id4_2["استخدام تعابير منتظمة (Regex) لاستخلاص روابط LinkedInمثال:
https://www.linkedin.com/in/..."]
id4_3["(اختياري وصعب): محاولة استخلاص اسم/مسمى/شركة من HTML- غير موصى به بشدة بسبب عدم الاستقرار ومخاطر الحظر"] id5["5. تخزين النتائج في Google Sheets"] id5_1["إضافة الأعمدة: 'رابط الملف الشخصي', 'الاسم', 'المسمى الوظيفي', 'الشركة'"] id5_2["استخدام
sheet.appendRow() لإضافة كل رابط مستخرج"]
id6["6. اعتبارات هامة وتحديات"]
id6_1["احترام شروط خدمة Google و LinkedIn"]
id6_2["التعامل مع حدود معدل الطلبات (Rate Limits)"]
id6_3["عدم استقرار تحليل HTML بسبب تغييرات بنية الصفحة"]
id6_4["خصوصية البيانات"]
يوضح هذا المخطط التسلسل المنطقي للعمليات التي يقوم بها السكربت، بدءًا من الإعداد وانتهاءً بتخزين البيانات، مع الأخذ في الاعتبار التحديات المحتملة.
مثال على كود Google Apps Script
فيما يلي مثال متكامل لسكربت Google Apps Script يمكنك استخدامه كنقطة انطلاق. تذكر أن هذا الكود هو مثال وقد يحتاج إلى تعديلات ليتناسب تمامًا مع متطلباتك الخاصة ولمواكبة أي تغييرات في بنية صفحات نتائج بحث Google.
// اسم ملف Google Sheets الذي سيتم استخدامه أو إنشاؤه
var SPREADSHEET_NAME = "LinkedIn_XRay_Search_Results";
// سلسلة البحث البولينية الأساسية (يمكنك تعديلها أو جعلها ديناميكية)
var DEFAULT_SEARCH_QUERY = 'site:linkedin.com/in/ "Software Developer" AND "Remote"';
// العدد الإجمالي للنتائج المطلوبة
var TARGET_RESULTS_COUNT = 50;
// عدد النتائج لكل صفحة بحث في Google (عادة 10)
var RESULTS_PER_PAGE = 10;
/**
* الدالة الرئيسية لتشغيل عملية البحث والتخزين.
*/
function runLinkedInXRaySearch() {
var spreadsheet = getOrCreateSpreadsheet_(SPREADSHEET_NAME);
var timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
var sheetName = "Search - " + timestamp;
var sheet = spreadsheet.insertSheet(sheetName);
// إضافة رؤوس الأعمدة
sheet.appendRow(["رابط الملف الشخصي على LinkedIn", "الاسم (مستخرج)", "المسمى الوظيفي (مستخرج)", "الشركة (مستخرجة)"]);
var collectedLinks = [];
var currentQuery = DEFAULT_SEARCH_QUERY; // يمكن تعديل هذا ليكون من خلية في الجدول مثلاً
Logger.log("بدء البحث عن: " + currentQuery);
for (var startIndex = 0; startIndex < TARGET_RESULTS_COUNT; startIndex += RESULTS_PER_PAGE) {
if (collectedLinks.length >= TARGET_RESULTS_COUNT) {
break; // تم الوصول إلى العدد المطلوب
}
var searchUrl = "https://www.google.com/search?q=" + encodeURIComponent(currentQuery) + "&start=" + startIndex + "#=" + RESULTS_PER_PAGE;
Logger.log("جلب النتائج من: " + searchUrl);
var options = {
"method": "GET",
"headers": {
// من المهم استخدام User-Agent معقول
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
},
"muteHttpExceptions": true // مهم لتجنب إيقاف السكربت بسبب أخطاء HTTP
};
var response = UrlFetchApp.fetch(searchUrl, options);
var responseCode = response.getResponseCode();
if (responseCode === 200) {
var htmlContent = response.getContentText();
var newLinks = extractLinkedInLinksFromHtml_(htmlContent);
newLinks.forEach(function(link) {
if (collectedLinks.length < TARGET_RESULTS_COUNT && collectedLinks.indexOf(link) === -1) {
collectedLinks.push(link);
// محاولة استخراج معلومات إضافية (بسيطة جداً وغير موثوقة)
var profileInfo = extractBasicInfoFromLinkText_(htmlContent, link);
sheet.appendRow([link, profileInfo.name, profileInfo.title, profileInfo.company]);
}
});
Logger.log("تم العثور على " + newLinks.length + " رابط جديد. الإجمالي: " + collectedLinks.length);
} else {
Logger.log("فشل جلب الصفحة. رمز الاستجابة: " + responseCode);
// يمكنك إضافة منطق لإعادة المحاولة أو التوقف هنا
}
// انتظار بسيط بين الطلبات لتجنب إرهاق خوادم Google واحتمالية الحظر
Utilities.sleep(2000 + Math.random() * 1000); // انتظار بين 2-3 ثواني
}
Logger.log("اكتمل البحث. تم جمع " + collectedLinks.length + " رابط فريد.");
SpreadsheetApp.flush(); // تأكيد كتابة البيانات
}
/**
* يحصل على جدول البيانات المحدد بالاسم أو ينشئه إذا لم يكن موجودًا.
* @param {string} spreadsheetName اسم جدول البيانات.
* @return {Spreadsheet} كائن جدول البيانات.
*/
function getOrCreateSpreadsheet_(spreadsheetName) {
var files = DriveApp.getFilesByName(spreadsheetName);
if (files.hasNext()) {
var file = files.next();
Logger.log("تم العثور على جدول بيانات موجود: " + file.getName() + " (ID: " + file.getId() + ")");
return SpreadsheetApp.openById(file.getId());
} else {
var newSpreadsheet = SpreadsheetApp.create(spreadsheetName);
Logger.log("تم إنشاء جدول بيانات جديد: " + newSpreadsheet.getName() + " (ID: " + newSpreadsheet.getId() + ")");
// إضافة رؤوس أعمدة افتراضية للورقة الأولى إذا لزم الأمر
newSpreadsheet.getActiveSheet().setName("Sheet1");
return newSpreadsheet;
}
}
/**
* يستخرج روابط LinkedIn من محتوى HTML.
* @param {string} htmlContent محتوى HTML لصفحة نتائج البحث.
* @return {Array<string>} مصفوفة من روابط LinkedIn الفريدة.
*/
function extractLinkedInLinksFromHtml_(htmlContent) {
// هذا التعبير المنتظم قد يحتاج إلى تعديل إذا تغيرت بنية Google SERP
// يبحث عن روابط تبدأ بـ https://[country-code.]linkedin.com/in/
var regex = /https:\/\/(?:[a-z]{2}\.)?linkedin\.com\/in\/[^\"\'\s&<]+/gi;
var matches = htmlContent.match(regex);
if (matches) {
// إزالة أي معلمات URL زائدة مثل ?trk=...
var cleanedMatches = matches.map(function(link) {
return link.split('?')[0];
});
return [...new Set(cleanedMatches)]; // إرجاع روابط فريدة فقط
}
return [];
}
/**
* محاولة استخراج معلومات أساسية (اسم، مسمى، شركة) من نص الرابط أو ما حوله في HTML.
* هذه الدالة بسيطة جداً وغير موثوقة، تعتمد على كيفية عرض Google للنتائج.
* @param {string} htmlContent محتوى HTML لصفحة البحث.
* @param {string} link رابط LinkedIn.
* @return {object} كائن يحتوي على الاسم والمسمى والشركة (قد تكون فارغة).
*/
function extractBasicInfoFromLinkText_(htmlContent, link) {
// هذه مجرد محاولة بدائية جداً وقد لا تعمل بشكل جيد.
// لا تعتمد عليها لبيانات دقيقة.
var name = "غير متوفر";
var title = "غير متوفر";
var company = "غير متوفر";
try {
// محاولة العثور على النص المحيط بالرابط
// هذا الجزء شديد الهشاشة ويعتمد على بنية HTML المتغيرة لـ Google
var linkEscaped = link.replace(/[.*+?^${}()|[\]\]/g, '\$&'); // Escape special characters for regex
var contextRegex = new RegExp('>[^<]*' + linkEscaped + '[^<]*<\/a>[^<]*<h3[^>]*>([^<]+)<\/h3>(?:[^<]*<div>([^<]+)<\/div>)?(?:[^<]*<div>([^<]+)<\/div>)?', 'i');
var contextMatch = htmlContent.match(contextRegex);
if (contextMatch) {
if (contextMatch[1]) name = contextMatch[1].trim().split(' - ')[0]; // غالباً ما يكون الاسم هو النص في H3
// قد يكون المسمى والشركة في الـ div اللاحقة
if (contextMatch[2]) title = contextMatch[2].trim();
if (contextMatch[3] && !title.includes(contextMatch[3].trim())) company = contextMatch[3].trim(); // إذا كان هناك نص إضافي
}
} catch (e) {
Logger.log("خطأ أثناء محاولة استخراج معلومات إضافية للرابط " + link + ": " + e.toString());
}
return { name: name, title: title, company: company };
}
/**
* إضافة قائمة مخصصة في واجهة Google Sheets لتشغيل السكربت بسهولة.
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('أدوات LinkedIn')
.addItem('بدء بحث X-Ray عن المرشحين', 'runLinkedInXRaySearch')
.addToUi();
}
كيفية استخدام الكود:
- انسخ هذا الكود والصقه في محرر Google Apps Script المرتبط بملف Google Sheets الخاص بك.
- احفظ السكربت (أيقونة القرص المرن).
- قد تحتاج إلى منح الأذونات اللازمة للسكربت عند تشغيله لأول مرة (للوصول إلى Drive، Sheets، والخدمات الخارجية).
- لتشغيل السكربت، يمكنك إما تحديد دالة
runLinkedInXRaySearchمن قائمة "تشغيل" (Run) في المحرر، أو إعادة تحميل ملف Google Sheets لتظهر قائمة "أدوات LinkedIn" المخصصة، ثم اختيار "بدء بحث X-Ray عن المرشحين". - يمكنك تعديل المتغيرات في بداية الكود مثل
SPREADSHEET_NAME،DEFAULT_SEARCH_QUERY، وTARGET_RESULTS_COUNTلتناسب احتياجاتك.
تحذير: استخراج المعلومات الإضافية (الاسم، المسمى، الشركة) من خلال دالة extractBasicInfoFromLinkText_ هو أمر تجريبي للغاية وغير موثوق به بسبب الطبيعة المتغيرة لـ HTML الخاص بصفحات نتائج بحث Google. لا تعتمد على هذه البيانات بشكل كامل. التركيز الأساسي للسكربت هو استخراج روابط الملفات الشخصية بشكل موثوق قدر الإمكان.
فيديو تعليمي: تعلم بحث X-ray على LinkedIn
لتعميق فهمك لكيفية عمل بحث X-ray على LinkedIn، والذي يعتبر أساسيًا لفعالية هذا السكربت، يمكنك مشاهدة الفيديو التالي. يشرح الفيديو المفاهيم الأساسية وكيفية صياغة استعلامات بحث فعالة للعثور على المرشحين المناسبين.
فيديو يشرح تقنيات بحث X-ray على LinkedIn بالتفصيل (محتوى من طرف ثالث).
جدول: خدمات Google Apps Script الرئيسية المستخدمة
يلخص الجدول التالي أهم خدمات Google Apps Script التي يعتمد عليها هذا النظام الآلي ودور كل منها:
| الخدمة (Service) | الوظيفة الرئيسية (Main Function) | مثال للاستخدام في السكربت |
|---|---|---|
SpreadsheetApp |
إنشاء جداول بيانات جديدة، فتح جداول موجودة، إدراج أوراق عمل جديدة، وإضافة صفوف إليها. | SpreadsheetApp.create()، spreadsheet.insertSheet()، sheet.appendRow() |
UrlFetchApp |
إرسال طلبات HTTP لجلب محتوى الويب، مثل صفحات نتائج بحث Google. | UrlFetchApp.fetch(url, options) |
Utilities |
يوفر وظائف مساعدة متنوعة مثل التوقيف المؤقت للسكربت (انتظار)، تنسيق التاريخ والوقت. | Utilities.sleep()، Utilities.formatDate() |
DriveApp |
يستخدم للبحث عن ملفات Google Sheets موجودة بالاسم في Google Drive. | DriveApp.getFilesByName() |
Session |
للحصول على معلومات حول الجلسة الحالية، مثل المنطقة الزمنية للمستخدم. | Session.getScriptTimeZone() |
JavaScript (RegExp) |
استخدام التعابير المنتظمة لتحليل نصوص HTML واستخلاص الأنماط المطلوبة (مثل روابط LinkedIn). | htmlContent.match(/regex/gi) |
اعتبارات هامة وتحديات
- شروط خدمة Google و LinkedIn: يجب أن تكون على دراية بشروط خدمة كل من Google و LinkedIn. الكشط الآلي (Scraping) لنتائج البحث أو بيانات الملفات الشخصية بكميات كبيرة قد يكون مخالفًا لهذه الشروط وقد يؤدي إلى حظر مؤقت أو دائم لعنوان IP الخاص بك أو حسابك.
- معدلات الطلب (Rate Limits): تفرض Google و LinkedIn قيودًا على عدد الطلبات التي يمكنك إجراؤها خلال فترة زمنية معينة. تجاوز هذه الحدود يمكن أن يؤدي إلى حظر. لهذا السبب يتضمن السكربت تأخيرات (
Utilities.sleep()) بين الطلبات. - تغييرات في بنية HTML: يعتمد استخلاص البيانات من صفحات HTML على بنيتها الحالية. إذا قامت Google أو LinkedIn بتغيير تصميم صفحاتهما، فقد يتوقف السكربت عن العمل بشكل صحيح وسيحتاج إلى تحديث (خاصة التعابير المنتظمة). استخدام واجهات برمجة تطبيقات رسمية (APIs)، إن وجدت ومناسبة، هو دائمًا الخيار الأكثر استقرارًا.
- الخصوصية وحماية البيانات: يجب التعامل مع بيانات الملفات الشخصية التي يتم جمعها بمسؤولية ووفقًا للوائح حماية البيانات المعمول بها (مثل GDPR).
- موثوقية البيانات المستخرجة: كما ذكر سابقًا، استخراج معلومات مفصلة مثل الاسم والمسمى الوظيفي مباشرة من HTML لنتائج البحث أو ملفات LinkedIn العامة هو أمر غير موثوق به. يجب التحقق من صحة هذه البيانات يدويًا أو عبر وسائل أخرى.
أسئلة شائعة (FAQ)
س: هل هذا الحل مجاني تمامًا؟ +
نعم، استخدام Google Apps Script بحد ذاته مجاني. الخدمات التي يستخدمها مثل SpreadsheetApp و UrlFetchApp هي جزء من Google Workspace وتخضع لحصص وقيود يومية مجانية معقولة للاستخدام العادي. طالما بقيت ضمن هذه الحدود، لن تكون هناك تكاليف مباشرة.
س: كم عدد النتائج التي يمكنني جلبها؟ +
يتم تحديد عدد النتائج في السكربت (افتراضيًا 50). ومع ذلك، هناك قيود عملية. جلب عدد كبير جدًا من النتائج بسرعة كبيرة قد يؤدي إلى حظر مؤقت من Google. من الأفضل الحفاظ على عدد معقول من النتائج لكل عملية تشغيل وإضافة فترات انتظار كافية بين الطلبات.
س: ماذا لو توقف السكربت عن العمل بسبب تغييرات في صفحة Google؟ +
هذا احتمال وارد. إذا غيرت Google بنية صفحات نتائج البحث الخاصة بها، فقد تحتاج التعابير المنتظمة المستخدمة لاستخلاص الروابط إلى تحديث. سيتطلب هذا بعض المعرفة بـ HTML و Regex لتعديل السكربت. هذا هو أحد عيوب الاعتماد على كشط الويب.
س: هل يمكنني جدولة هذا السكربت ليعمل تلقائيًا؟ +
نعم، يوفر Google Apps Script "مشغلات" (triggers) تتيح لك جدولة تنفيذ الدوال في أوقات محددة (مثلاً، يوميًا أو أسبوعيًا). يمكنك إعداد مشغل زمني لدالة `runLinkedInXRaySearch` من قائمة "المشغلات" (أيقونة الساعة) في محرر السكربت.
س: هل يمكنني استخدام هذا السكربت للبحث في مواقع أخرى غير LinkedIn؟ +
نعم، المبدأ الأساسي للبحث باستخدام UrlFetchApp واستخلاص البيانات باستخدام Regex يمكن تطبيقه على مواقع أخرى. ستحتاج إلى تعديل سلسلة البحث (searchQuery) والتعابير المنتظمة (regex) لتناسب الموقع والبيانات التي ترغب في استخلاصها.
مواضيع مقترحة للقراءة الإضافية
- كيفية تحسين استعلامات بحث X-ray على LinkedIn لنتائج أكثر دقة؟
- ما هي أفضل الممارسات لتجنب الحظر عند استخدام Google Apps Script لكشط الويب؟
- هل يمكن استخدام Google Custom Search API كبديل أكثر استقرارًا لـ UrlFetchApp في Google Apps Script؟
- طرق متقدمة لمعالجة وتصفية البيانات المستخرجة في Google Sheets باستخدام Apps Script.
المراجع
Last updated May 13, 2025
