انتقل إلى المحتوى

التغلب على حد واجهة برمجة تطبيقات أماكن Google الذي يبلغ 120 مكانًا: دليل الخبراء

باعتباري خبيرًا في استخراج البيانات من الويب يتمتع بخبرة تزيد عن 5 سنوات في استخراج البيانات من خرائط Google، فقد تعلمت شيئًا أو اثنين حول التغلب على الحدود. هل تريد سحب أكثر من 100,000 مكان من واجهة برمجة تطبيقات أماكن Google؟ حسنًا، لقد أتيت إلى المكان الصحيح!

في هذا الدليل الشامل الذي يزيد عن 2,000 كلمة، سأشارك العديد من الطرق التي أثبتت جدواها لاستخراج أكبر قدر ممكن من بيانات أماكن Google حسب رغبتك.

تذهب هذه التقنيات المتقدمة إلى ما هو أبعد من واجهة برمجة التطبيقات الأساسية، حيث تستفيد من البرامج النصية المخصصة ومصادر البيانات غير الرسمية والوكلاء والمزيد.

سأرشدك أيضًا من خلال أمثلة واقعية ونموذج للتعليمات البرمجية حتى تتمكن من دمج هذه الاستراتيجيات في مشاريعك الخاصة.

وفي النهاية، ستصبح محترفًا في تجاوز حدود Google وإطلاق العنان للقوة الكاملة لبيانات الأماكن لتلبية احتياجاتك.

دعونا الغوص في!

ألم الحصول على 120 مكانًا فقط

وكما تعلم، فإن واجهة برمجة تطبيقات أماكن Google تقيدك بـ 120 مكانًا فقط لكل استعلام. بالنسبة لمعظم المشاريع، 120 مكانًا لا تكفي.

مجرد التفكير في ذلك…

  • يوجد أكثر من 8,000 فرع لستاربكس في الولايات المتحدة وحدها. حظًا سعيدًا في استردادها جميعًا بسعر 120 لكل مكالمة.

  • يوجد في مدينة لوس أنجلوس أكثر من 15,000 مطعم. بمعدل 120 طلبًا لكل استعلام، ستحتاج إلى تقديم 125 طلبًا لواجهة برمجة التطبيقات (API) للحصول عليها جميعًا.

  • إذا كنت تريد إنشاء دليل لكل مركز تسوق في أمريكا (أكثر من 1,000 مركز)، فستصل إلى الحد الأقصى بسرعة كبيرة.

وإذا كنت تعتقد أن 120 لكل طلب يبدو منخفضًا، فاعلم أنه كان هناك 20 مكانًا فقط قبل أن تزيد Google الحد الأقصى في عام 2019. لذا فهم يدركون بشكل أساسي أن هناك حاجة إلى المزيد من النتائج في كثير من الأحيان.

لماذا تحدد جوجل الأماكن بشكل صارم؟

تريد Google منع الطلبات الكبيرة جدًا التي قد تؤدي إلى زيادة التحميل على خوادمها. لذا فقد حددوا عدد الأماكن بحجم معقول لحالات الاستخدام النموذجية.

ولكن بالنسبة للمستخدمين المتميزين مثلنا، فإن 120 مكانًا لا يكفي.

لحسن الحظ، باستخدام الأدوات والتقنيات المناسبة، يمكننا الوصول إلى ملايين الأماكن من Google إذا أردنا ذلك.

دعونا ننظر في كيفية ذلك.

الأسلوب 1: استخدام استعلامات متعددة مع الطلبات المرقّمة

الطريقة المدعومة رسميًا لتجاوز حد 120 مكانًا هي استخدام الطلبات المرقّمة. وإليك كيف يعمل…

أولاً ، قم بتعيين ملف pagetoken المعلمة ل null للحصول على أول 60 نتيجة:

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=null

الرد يتضمن أ next_page_token المجال مثل "CpQCBAAA...". مرر هذا باسم pagetoken في طلبك القادم

https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+LA&pagetoken=CpQCBAAA...

يؤدي هذا إلى إرجاع الستين التالية. استمر في تمرير الأحدث next_page_token لترتيب صفحات النتائج تدريجيًا.

ومن الناحية المثالية، قم بدمج هذا مع مفاتيح واجهة برمجة التطبيقات المتعددة لإجراء استعلامات متزامنة مرقّمة. هذا المحول الذي قمت بإنشائه يستعلم عن 3 مفاتيح في وقت واحد لتسريع عملية ترقيم الصفحات:

// Paginate requests concurrently with multiple API keys

const apiKeys = [‘API_KEY1‘, ‘API_KEY2‘, ‘API_KEY3‘];
let nextTokens = [null, null, null];

function paginateResults(query) {

  let promise1 = placesApi.textSearch({query, pagetoken: nextTokens[0]});
  let promise2 = placesApi.textSearch({query, pagetoken: nextTokens[1]}); 
  let promise3 = placesApi.textSearch({query, pagetoken: nextTokens[2]});

  Promise.all([promise1, promise2, promise3])
    .then(responses => {
      // Extract places from responses

      // Save nextTokens
      nextTokens[0] = responses[0].next_page_token; 
      nextTokens[1] = responses[1].next_page_token;
      nextTokens[2] = responses[2].next_page_token;

      paginateResults(query); // Call again to keep paginating      
    });

}

يتيح لي ذلك تقسيم النتائج بسرعة أكبر بمقدار 3 مرات عن طريق توزيع الطلبات عبر مفاتيح واجهة برمجة التطبيقات المتعددة بشكل متزامن.

باستخدام هذه الإستراتيجية، يمكنك استرداد ما يصل إلى 360 مكانًا لكل مكالمة (120 * 3 مفاتيح). للحصول على المزيد، ما عليك سوى الاستمرار في ترقيم الصفحات مع الطلبات اللاحقة.

برو تلميح: قم بتخزين كل صفحة من النتائج مؤقتًا محليًا حتى لا تكرر استدعاءات واجهة برمجة التطبيقات في حالة حدوث أخطاء.

حدود ترقيم الصفحات

الجانب السلبي هو أنك تحتاج إلى التعامل مع كل منطق ترقيم الصفحات بنفسك. وعلى الرغم من أنه يمكنك تسريع ذلك من خلال الطلبات المتزامنة، إلا أنه لا يزال عادةً أبطأ من استعلام مجمع واحد.

يعمل ترقيم الصفحات بشكل أفضل إذا كنت تحتاج فقط إلى بضعة آلاف من الأماكن الإضافية التي تتجاوز الحد المسموح به. ولكن بمجرد وصولك إلى عشرات أو مئات الآلاف من الأماكن، تصبح الطرق الأخرى أكثر كفاءة…

الطريقة الثانية: تقسيم منطقة البحث إلى شبكات أصغر

بالنسبة للكميات الكبيرة، وجدت أن تقسيم منطقة البحث إلى "شبكات" يؤدي إلى أفضل النتائج.

الخطوات هي:

  1. قم بتقسيم موقعك المستهدف إلى عدة مناطق بحث أصغر.

  2. استعلم عن كل منطقة بشكل مستقل لاسترداد 120 مكانًا كاملاً لكل قسم.

  3. قم بدمج النتائج من كل منطقة في مجموعة البيانات الكاملة الخاصة بك.

دعونا نسير عبر نموذج لسير العمل ...

تخيل أنني بحاجة للحصول على جميع المطاعم في مانهاتن. هذا يزيد عن 15,000 مكان، وهو ما يتجاوز حد الـ 120.

إليك كيفية استخراجهم جميعًا:

  1. تقسيم مانهاتن إلى شبكات. سأقسمها إلى أحياء مختلفة أو رموز بريدية. على سبيل المثال:

    10021
    10022
    10023
    10075

    وهكذا بالنسبة لجميع الرموز البريدية في مانهاتن...

  2. الاستعلام عن كل شبكة. بالنسبة لكل رمز بريدي، سأقوم بإجراء بحث نصي مثل:

    https://maps.googleapis.com/maps/api/place/textsearch/json?query=restaurants+in+10021

    يؤدي ذلك إلى إرجاع أول 120 مطعمًا في هذا الرمز البريدي.

  3. الجمع بين جميع النتائج. سأجري بحثًا عن كل رمز بريدي، ثم أجمع كل الأماكن في قائمة واحدة كبيرة تضم أكثر من 15,000 مطعم!

انظر كيف يعمل ذلك؟ من خلال تقسيم المناطق إلى أجزاء أصغر، يمكنك استرداد 120 مكانًا لكل قسم. وهذا يرقى إلى أي عدد إجمالي من الأماكن.

ومرة أخرى، من المفيد إجراء عمليات البحث هذه على الشبكة بالتوازي للحصول على سرعة أكبر. أحب استخدام Node.js في البرمجة النصية.

إنشاء شبكات الأمثل

هناك عدة طرق لتقسيم الخرائط إلى شبكات:

  • حسب الحي أو المنطقة
  • استخدام الرمز البريدي/الرموز البريدية
  • مع حدود خطوط العرض/الطويلة المحددة
  • تباعد متساوي قدره 0.1 درجة عرضية/طويلة

اجعل شبكاتك صغيرة بما يكفي لتحقيق أقصى قدر من النتائج لكل استعلام. ولكن ليس صغيرًا جدًا لدرجة أنك تضرب نفس الأماكن بشكل متكرر.

تعتمد المقايضة المثالية على إجمالي مساحة الخريطة وكثافة المكان. ولكن بالنسبة لمعظم المدن، تعمل الشبكات التي تتراوح مساحتها من 0.5 إلى 1 ميل مربع بشكل جيد.

قم بتجربة تفاصيل مختلفة لمعرفة ما الذي يُرجع الأماكن الأكثر تميزًا.

الجانب السلبي الرئيسي للبحث على الشبكة هو تعقيد الترميز الإضافي لتقسيم المناطق ودمج النتائج. الطلبات المرقّمة أسهل في التنفيذ.

لكن مكاسب الأداء تجعل الشبكات تستحق العناء. لقد استخدمت هذه الطريقة لاستخراج ما يصل إلى 300,000 مكان من Google بنجاح - وهو ما يتجاوز بكثير الحد الأقصى البالغ 120 مكانًا.

الآن دعونا نلقي نظرة على خيار أكثر قوة (ولكنه صعب)…

الطريقة الثالثة: استخلاص نتائج بحث خرائط جوجل

يعرض بحث خرائط Google نتائج أكثر بكثير مما تسمح به واجهات برمجة التطبيقات الخاصة به. يمكننا الاستفادة من هذا مباشرة عن طريق إلغاء موقعهم على الانترنت.

وهنا هي الخطوات الأساسية:

  1. ابحث عن فئة مكان على خرائط Google، مثل "بيتزا في شيكاغو".

  2. استخدم مكشطة الويب لاستخراج البيانات من النتائج المقدمة.

  3. قم بالتكرار من خلال طرق عرض الخريطة ومستويات التكبير/التصغير لتشغيل المزيد من الأماكن.

  4. قم بدمج جميع البيانات المسروقة في مجموعة البيانات الخاصة بك.

يتيح لك هذا الوصول إلى فهرس Google الكامل للأماكن. تكمن المشكلة في أن موقعهم يستخدم عرض جافا سكريبت وترقيم الصفحات المعقدين.

دعونا نسير عبر عينة من بنية الكاشطة ...

أولاً، أقوم بترميز موقع البحث جغرافيًا للحصول على النقطة المركزية المثالية للخريطة:

// Geocode city to get centerpoint lat/lng

let response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=Chicago+IL`);
let geo = await response.json();

let centerpoint = geo.results[0].geometry.location; 

بعد ذلك، أفتح المتصفح وانتقل إلى عنوان URL لخرائط Google:

// Search Google Maps for place category

let url = `https://www.google.com/maps/search/pizza+in+Chicago/@${centerpoint.lat},${centerpoint.lng}`;

await page.goto(url); 

ثم أقوم باستخراج الأماكن من النتائج المقدمة وترقيم الصفحات حسب الحاجة:

// Extract place data

let places = await page.evaluate(() => {

  let results = [];

  // Logic to parse DOM and extract place data

  return results; 

});

// Click "Next" to paginate
await page.click(‘button[aria-label="Next page"]‘);

أقوم باستمرار بكشط صفحات إضافية ومستويات تكبير/تصغير حتى أحصل على جميع النتائج.

كما ترون، يتطلب هذا إجراء هندسة عكسية دقيقة لرمز الواجهة الأمامية. لكن المكافأة هي الوصول إلى قاعدة بيانات Google الكاملة للأماكن.

لقد تمكنت من استخراج أكثر من 500,000 مكان عبر كاليفورنيا باستخدام هذا النوع من أدوات الكاشطة المخصصة. يتطلب الأمر الكثير من العمل، لكن يمكنه تقديم مجموعات بيانات ضخمة.

كشط مسكتك

فيما يلي بعض النصائح عند استخراج خرائط Google:

  • استخدم Puppeteer في Node أو Selenium في Python لأتمتة المتصفح.

  • تنفيذ تأخيرات عشوائية بين الإجراءات لتبدو "إنسانية".

  • قم بتدوير الوكلاء والرؤوس المزيفة لتجنب اكتشاف الروبوتات.

  • كشط تدريجيا واستمر في الحالة لاستئنافها.

  • موازاة عبر المتصفحات للحصول على نتائج أسرع.

يمكن أن يؤدي استخراج البيانات من الويب إلى فتح مجموعات ضخمة من بيانات الأماكن، لكنه يأتي أيضًا مصحوبًا بتحديات كبيرة. يعد استخدام واجهة برمجة التطبيقات (API) أكثر نظافة بشكل عام... وهو ما يقودنا إلى استراتيجيتنا الرابعة.

الطريقة الرابعة: الاستفادة من واجهات برمجة التطبيقات لأماكن الطرف الثالث

تقدم العديد من الشركات قواعد بيانات بديلة للأماكن بتغطية أكثر شمولاً من تلك التي توفرها Google.

فمثلا:

  • واقعي يحتوي على بيانات حول أكثر من 100 مليون نقطة اهتمام عالمية تم الحصول عليها من مختلف مقدمي الخدمة بما في ذلك Google.

  • شخصيات قصص الابطال الخارقين لديه أكثر من 105 مليون مكان في واجهة برمجة تطبيقات المطور الخاصة بهم.

  • عواء لديه بيانات عن ملايين الشركات المحلية عبر Fusion API الخاصة بهم.

  • GeoNames لديها قاعدة بيانات مفتوحة تضم أكثر من 25 مليون ميزة جغرافية.

ويمكن لهذه جميعها أن تكمل أماكن Google من خلال توفير مجموعات بيانات أكبر.

لقد قمت مؤخرًا بدمج Factual في مشروع لاستخراج النقاط المثيرة للاهتمام بشكل مجمّع في جميع أنحاء اليابان - أكثر من 5 ملايين مكان! أبعد بكثير من حدود جوجل.

الجانب السلبي هو الترميز والدفع مقابل خدمة أخرى. ولكن بالنسبة لحالات استخدام معينة، قد تكون بيانات الطرف الثالث هي الخيار الأفضل لكميات كبيرة من الأماكن.

ما هي الطريقة الأفضل بالنسبة لك؟

إذن ما هو النهج الذي يجب عليك استخدامه لاستخراج ملايين الأماكن من Google؟ هذا يعتمد!

فيما يلي قواعدي الأساسية:

  • ترقيم الصفحات - لما يصل إلى بضعة آلاف من الأماكن الإضافية.

  • شبكة البحث - ما يصل إلى مئات الآلاف من الأماكن.

  • تجريف على شبكة الإنترنت - الملايين من الأماكن ولكن صعبة من الناحية الفنية.

  • واجهات برمجة التطبيقات الخارجية – عشرات الملايين من الأماكن ولكن تكاليف إضافية.

ضع في اعتبارك أيضًا مدى إلحاح حاجتك إلى البيانات، وما هي سمات المكان المحددة التي تحتاجها.

أجد أن معظم المشاريع تتلاءم بشكل جيد مع شبكة البحث للحصول على الأداء الأمثل مقابل البساطة. لكن استكشف جميع الخيارات – لديك العديد من الخيارات!

وغالبًا ما يكون الجمع بين الأساليب هو الأقوى، مثل الشبكات + الاستخراج أو Factual API + أماكن Google.

الحدود لا تتناسب مع طموحاتك المتعطشة للبيانات.

الوجبات السريعة الرئيسية والخطوات التالية

دعونا نلخص ما تعلمناه:

  • تحدد واجهة برمجة تطبيقات أماكن Google عدد الأماكن المسموح بها لكل استعلام بـ 120 مكانًا... ولكن العديد من التطبيقات تحتاج إلى بيانات أكثر بكثير.

  • يمكن لتقنيات مثل ترقيم الصفحات والبحث على الشبكة وتجميع الويب استرداد ملايين الأماكن من Google.

  • توفر واجهات برمجة التطبيقات لأماكن الجهات الخارجية أيضًا بيانات أكثر شمولاً.

  • فكر في مزج طرق مختلفة مثل الشبكات + الكشط للحصول على أفضل النتائج.

الآن لديك دليل الخبراء للتغلب على حدود Google. عالم بيانات الأماكن بين يديك لتستكشفه.

بعد ذلك، اقض بعض الوقت في اختيار النهج الذي يناسب حالة الاستخدام الخاصة بك وابدأ في تنفيذ الحل.

لا تتردد في التواصل معنا إذا كان لديك أي أسئلة أخرى! يسعدني دائمًا مساعدة زملائي المتعصبين للبيانات الجغرافية.

أطلق الآن العنان للإمكانات الكاملة لبيانات الأماكن لدعم مشروع رسم الخرائط التالي!

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *