أداة Google Places SCRAPER تُخرج 19 نتيجة فقط باستخدام Google API! ما الخطأ الذي أرتكبه؟

لا أعرف ما الذي أفعله بشكل خاطئ للحصول على 19 نتيجة فقط!!!

أهلا وسهلا في مجتمع n8n @SuperNoobStarter
يرجى التحقق من صحة إعدادات جسم الطلب (body) لتقسيم الصفحات.

مرحباً @SuperNoobStarter

السبب في أنك عالق عند حوالي 20 نتيجة هو أن Google ترسل البيانات فقط في “صفحات” صغيرة. للحصول على مجموعة النتائج التالية، تحتاج n8n إلى مفتاح رقمي خاص يسمى “رمز” (token) من Google. حالياً، إعدادك تفشل في الحصول على هذا المفتاح وتفشل في استخدامه بشكل صحيح، لذلك تعتقد n8n أنها وصلت إلى نهاية القائمة بعد الصفحة الأولى.

أولاً، يجب عليك أن تطلب بشكل صريح من Google إرسال هذا المفتاح. في إعداداتك، هناك رأس “Field Mask” حيث تدرج المعلومات التي تريدها (مثل رقم الهاتف والعنوان). لأنك لم تضمّن “nextPageToken” في تلك القائمة، فإن Google ببساطة تحذف المفتاح من الاستجابة، مما يترك n8n بلا طريقة لطلب الصفحة الثانية.

ثانياً، هناك خطأ إملائي صغير في إعدادات التصفح. كتبت “pagetoken” بأحرف صغيرة جميعاً، لكن Google صارمة جداً وتتطلب حرف “T” كبير (“pageToken”). بسبب هذا الخطأ الإملائي، تتجاهل Google طلب المزيد من البيانات. بمجرد إصلاح الرأس والحرف الكبير، ستبدأ برؤية المزيد من النتائج، على الرغم من أنك قد تحتاج أيضاً إلى زيادة حد “max requests” إذا كنت تريد أكثر من 60 نتيجة إجمالية.

إليك JSON المصحح. يمكنك نسخه ولصقه مباشرة في لوحة سير عمل n8n الخاصة بك.

ملاحظة: زيادة maxRequests إلى 10 (بدلاً من 3) حتى تتمكن من استرجاع ما يصل إلى 200 نتيجة. يمكنك ضبط هذا الرقم بناءً على عدد المطاعم التي تحتاجها

مرحبا!

شكرا جزيلا على إجابتك التفصيلية!

سأجربها مباشرة! أعتذر عن السؤال الساذج، لكنني بحثت طويلا عبر الإنترنت عن الإجابة! سأخبرك إذا نجح!

☆☆☆☆☆ إجابة رائعة! أرسل لك بعض الطاقة الإيجابية:wink::face_blowing_a_kiss:!!! أتمنى لك يوما مثاليا!!!

لقد ارتكبت خطأ! أنا أبحث عن الشركات التي لا تملك موقعًا إلكترونيًا.

ماذا يجب أن أكتب؟ WebsiteUri=null أم شيء من هذا القبيل؟

شكرًا!

مرحباً @SuperNoobStarter

أولاً، أنت ترى نفس البيانات بشكل متكرر لأن لديك عدداً كبيراً جداً من العقد. عقدة HTTP Request في n8n تتمتع بميزة ترقيم صفحات مدمجة تتعامل مع رموز «الصفحة التالية» بشكل تلقائي. من خلال ربط ثلاث عقد متطابقة معاً، أنت في الواقع تخبر n8n ببدء البحث بالكامل من الصفحة الأولى ثلاث مرات مختلفة. تحتاج فقط إلى عقدة HTTP Request واحدة فقط للحصول على جميع النتائج.

ثانياً، لا يمكنك أن تطلب من API غوغل أن تعرض فقط الشركات بدون مواقع ويب؛ API ببساطة لا يملك مرشح «null» أو «فارغ». لتحقيق هذا، يجب أن تحمّل جميع النتائج أولاً ثم تستخدم عقدة «Filter» في n8n. هذه العقدة ستنظر إلى القائمة وتحذف أي شركة لديها موقع ويب، مما يتركك فقط مع تلك التي لا تملك.

وأخيراً، هناك خطر أمني خطير جداً: لقد شاركت عن طريق الخطأ مفتاح Google API السري الخاص بك في رسالتك. بما أن هذا المفتاح أصبح الآن عام، يمكن لأي شخص استخدامه وتحميل التكاليف على حسابك. تحتاج إلى الدخول إلى Google Cloud Console الخاص بك فوراً، حذف ذلك المفتاح المحدد، وإنشاء واحد جديد لحماية حسابك.

يرجى محاولة هذا:

حاسم: لقد استبدلت مفتاح API المُسرب الخاص بك بعنصر نائب YOUR_NEW_API_KEY. يجب عليك استبدال هذا بالمفتاح الجديد الذي تنشئه في Google Cloud Console.

شكراً جزيلاً! لقد حذفت API وأنشأت واحداً جديداً تماماً! سأجرب سير العمل أيضاً وأعدّل عليه قليلاً! شكراً لك على وقتك وتفانيك!

أحصل على 60 نتيجة الآن… هذا يسير في الاتجاه الصحيح :slight_smile: !

لدي إدخال واحد مع WebsiteUri غير محدد وأريد تصفيته! لقد أرفقت لقطة شاشة لكيفية محاولتي! لكن هناك شيء أفعله بشكل خاطئ! هل يمكنك مساعدتي في هذه الواحدة الأخيرة؟ كيف أحصل على المزيد من النتائج؟ شكراً لك :heart_eyes:

السبب في أن المرشح لديك لا يعمل هو أنك تخبر n8n بالبحث عن الكلمة الفعلية “undefined” المكتوبة كنص. في عالم البيانات، “undefined” ليست كلمة—بل هي حالة تعني أن المعلومات مفقودة تماماً. لأن حقل الموقع الإلكتروني فارغ بدلاً من أن يحتوي على النص “undefined”، فإن المرشح يتجاهله. لإصلاح هذا، غيّر المشغّل من “يحتوي على” إلى “فارغ”. هذا يخبر n8n بالاحتفاظ بأي شيء حيث يكون حقل الموقع الإلكتروني مفقوداً أو null أو فارغاً.فيما يتعلق بنتائجك، ترسل Google البيانات في “صفحات” من 20 نشاطاً تجارياً في كل مرة. تُظهر لقطة الشاشة الخاصة بك أن لديك 19 أو 20 مكاناً في نتيجة واحدة، وهو الحد الأقصى الذي تسمح به Google لكل صفحة. إعدادات الترقيم الخاصة بك صحيحة بالفعل، لكن لدى Google حد أقصى ثابت لعدد النتائج الإجمالية التي ستعرضها للبحث الواحد (عادة حوالي 60 في المجموع). إذا وصلت إلى هذا الحد، فإن nextPageToken سيختفي ببساطة، وسيتوقف البحث.للحصول على نتائج أكثر تجاوزاً لهذا الحد، لا يمكنك ببساطة تغيير إعداد؛ يجب عليك “خداع” API بكونك أكثر تحديداً. بدلاً من البحث عن “Restaurant München”، حاول البحث عن أحياء محددة (مثل “Restaurant Maxvorstadt München” أو “Restaurant Schwabing München”). بتقسيم البحث الكبير الواحد إلى عدة بحوث أصغر قائمة على الموقع، يمكنك تجاوز حد 60 نتيجة وجمع مئات النشاطات التجارية.إليك سير العمل المحسّنjson { "nodes": [ { "parameters": { "jsCode": "return [\n { json: { neighborhood: \"Altstadt\" } },\n { json: { neighborhood: \"Maxvorstadt\" } },\n { json: { neighborhood: \"Schwabing\" } },\n { json: { neighborhood: \"Au-Haidhausen\" } },\n { json: { neighborhood: \"Neuhausen-Nymphenburg\" } },\n { json: { neighborhood: \"Sendling\" } },\n { json: { neighborhood: \"Bogenhausen\" } },\n { json: { neighborhood: \"Ramersdorf-Perlach\" } }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 0, 0 ], "id": "neighborhood-list", "name": "Munich Neighborhoods" }, { "parameters": { "method": "POST", "url": "https://places.googleapis.com/v1/places:searchText", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" }, { "name": "X-Goog-Api-Key", "value": "YOUR_NEW_API_KEY" }, { "name": "X-Goog-FieldMask", "value": "places.displayName,places.formattedAddress,places.websiteUri,places.nationalPhoneNumber,nextPageToken" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"textQuery\": \"Restaurant {{ $json.neighborhood }} München\"\n}", "options": { "pagination": { "pagination": { "parameters": { "parameters": [ { "type": "body", "name": "pageToken", "value": "={{ $response.body.nextPageToken }}" } ] }, "paginationCompleteWhen": "other", "completeExpression": "={{ !$response.body.nextPageToken }}", "limitPagesFetched": true, "maxRequests": 10, "requestInterval": 500 } } } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 220, 0 ], "id": "fetch-restaurants", "name": "Fetch Restaurants" }, { "parameters": { "fieldToSplitOut": "places", "options": {} }, "type": "n8n-nodes-base.splitOut", "typeVersion": 1, "position": [ 440, 0 ], "id": "split-out", "name": "Split Into Individual Places" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict" }, "conditions": [ { "id": "filter-website", "leftValue": "={{ $json.websiteUri }}", "operator": { "type": "string", "operation": "isEmpty" } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.filter", "typeVersion": 2.2, "position": [ 660, 0 ], "id": "filter-empty", "name": "Keep Only No Website" } ], "connections": { "Munich Neighborhoods": { "main": [ [ { "node": "Fetch Restaurants", "type": "main", "index": 0 } ] ] }, "Fetch Restaurants": { "main": [ [ { "node": "Split Into Individual Places", "type": "main", "index": 0 } ] ] }, "Split Into Individual Places": { "main": [ [ { "node": "Keep Only No Website", "type": "main", "index": 0 } ] ] } } } تذكير: استبدل YOUR_NEW_API_KEY بمفتاحك الجديد.

واو! رائع! أنت محترف حقيقي! سأتمكن من حلها بعد قيلولتي! شكراً مرة أخرى!

N8n معقد جداً للمبتدئين، لذا أنا ممتن لوجود أشخاص مثلك! احترام كبير!

سلام!

لقد جربت كل شيء وعدلت الأمور بشتى الطرق.

لا أستطيع إيجاد طريقة لفصله ;-(… من فضلك ساعدني ;-01

جرّب هذا:

1)أزل تعبير fx.
2)انقر على الحقل وحدّد websiteUri من قائمة الخيارات (منتقي المتغيرات) بدلاً من كتابته في صندوق التعبير.
3)اترك المشغّل على Is Empty.

مرحباً وأهلاً وسهلاً! هناك مشكلتان هنا. أولاً، JSON حساس لحالة الأحرف، pagetoken و pageToken شيئان مختلفان تماماً. Google يتعرف فقط على pageToken (مع حرف T كبير)، لذا يتجاهل الرمز المرسل ويرجع الصفحة الأولى في كل مرة.

ثانياً، تحتاج Google Places API إلى حوالي ثانيتين قبل أن يصبح رمز الصفحة صالحاً، 500 ميلي ثانية سريعة جداً، والرمز يتم رفضه بصمت.

شكراً لك على ردك التفصيلي! سأطبق نصائحك على سير عملي!

سلام!