वापस ब्लॉग पर

Activepieces + Scrapeless: एक नो-कोड स्थानीय लीड फ्लो

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

20-Aug-2026

TL;DR:

  • Activepieces अपने अंतर्निहित HTTP पीस के साथ लाइव खोज डेटा तक पहुँचता है, इसलिए एक लीड फ्लो को किसी कस्टम पीस, किसी प्रकाशित पैकेज, और किसी सेवा की मेज़बानी की आवश्यकता नहीं होती है।
  • Google Search अभिनेता प्रति अनुरोध लगभग 20 स्थानीय व्यवसायों को लौटाता है — 20, 21 और 22 पर कैप्चर करते हैं — इसलिए एक स्थानीय फ्लो आमतौर पर एकल कॉल और एक डीडुप्लिकेशन कुंजी की आवश्यकता होती है न कि एक पेजिनेशन लूप की।
  • पार्स की गई प्रतिक्रिया body के तहत बैठती है, जो {{step_1.body.local_results.places}} को कार्यात्मक संदर्भ बनाती है; body छोड़ दें और लूप एक फ्लो के अंदर ज़ीरो बार चलते हुए सफल होने की रिपोर्ट करता है।
  • phone फील्ड में केवल आधे रिकॉर्ड में एक फोन नंबर होता है — बाकी खुलने के घंटे या एक सेवा लेबल ले जाते हैं — इसलिए एक कोड पीस को इसे मान्य करना चाहिए, केवल इसे ट्रिम नहीं करना चाहिए।
  • API कुंजी को प्रोजेक्ट-स्तरीय मान के रूप में संग्रहीत करें बजाय इसके कि इसे हेडर फील्ड में टाइप करें, क्योंकि फ्लो निर्यात और साझा किए जाते हैं।

What This Flow Gives You

एक कार्यशील Activepieces फ्लो जो एक श्रेणी और एक शहर को स्थानीय व्यवसायों की पंक्तियों में बदलता है — नाम, श्रेणी, रेटिंग, समीक्षा संख्या, और फोन — CRM, एक शीट, या एक डेटाबेस के लिए तैयार।

Activepieces ऐप्स को अच्छी तरह से व्यवस्थित करता है और पृष्ठों को नहीं लाता है। खोज परिणाम Deep SerpApi से उसके scraper.google.search अभिनेता के माध्यम से आते हैं, जो स्थानीय पैक को JSON के रूप में लौटाता है। नीचे दिया गया फ्लो एक स्वयं-होस्टेड Activepieces 0.82.0 इंस्टेंस पर बनाया गया था जिसमें piece-http 0.11.18 है।

Prerequisites

  • एक Activepieces इंस्टेंस, क्लाउड या स्वयं-होस्टेड
  • एक Scrapeless API कुंजी — एक मुफ्त खाता बनाएँ
  • पंक्तियों के लिए एक गंतव्य पीस: Google Sheets, Airtable, Postgres, या आपका CRM

कुंजी को प्रोजेक्ट-स्तरीय मान या एक कनेक्शन में डालें, स्टेप के हेडर फील्ड में नहीं। एक फ्लो परिभाषा उसके शाब्दिक फील्ड मान ले जाती है, और फ्लो निर्यातित, डुप्लिकेट और प्रोजेक्ट के बीच साझा होते हैं।

Configure the HTTP Step

HTTP → Send HTTP request जोड़ें और पाँच फ़ील्ड भरें:

Field Value
Method POST
URL https://api.scrapeless.com/api/v1/scraper/request
Headers x-api-token → आपकी कुंजी
Body type JSON
Body नीचे दिया गया ऑब्जेक्ट
json Copy
{
  "actor": "scraper.google.search",
  "input": {
    "q": "plumbers in Austin, TX",
    "tbm": "lcl"
  }
}

tbm को lcl पर सेट किया गया है जो व्यवसायों को वेब पृष्ठों के बजाय लौटाता है। क्वेरी में स्थानीय इरादा होना चाहिए: "plumbers in Austin, TX" एक स्थानीय पैक लौटाता है, जबकि एक सामान्य "plumbing" अक्सर नहीं करता है।

फ्लो के बाकी हिस्से को कनेक्ट करने से पहले, निर्माणकर्ता के बाहर अनुरोध की पुष्टि करें। शेल से वही कॉल आपको बताता है कि क्या ख़ाली परिणाम अनुरोध की गलती है या फ्लो की:

bash Copy
curl -sS -X POST https://api.scrapeless.com/api/v1/scraper/request \
  -H 'Content-Type: application/json' \
  -H "x-api-token: $SCRAPELESS_API_KEY" \
  -d '{"actor":"scraper.google.search","input":{"q":"plumbers in Austin, TX","tbm":"lcl"}}' \
  | python3 -c 'import json, sys
data = json.load(sys.stdin)
places = (data.get("local_results") or {}).get("places") or []
print(len(places), "places")
if places:
    print("raw phone:", repr(places[0]["phone"]), "| raw type:", repr(places[0]["type"]))
else:
    print("no local pack in this response; top-level keys were", sorted(data))'

यह स्थानों की संख्या और पहले रिकॉर्ड के कच्चे phone और type को प्रिंट करता है — दो फ़ील्ड जो पैडेड आती हैं। else शाखा पर कुंजियों को पढ़ना सीधे local_results में इंडेक्स करने के बजाय वही आदत है जिसकी फ्लो को आवश्यकता है: यह सुनिश्चित करें कि आप जिस आकार की अपेक्षा करते हैं वह उपस्थित है उससे पहले कि आप उस पर पहुँचें।

What Comes Back

एक सफल रन लगभग 20 स्थान लौटाता है local_results.places के तहत, प्रत्येक में title, type, rating, reviews, phone, और address होता है। कैप्चर ने एक ही क्वेरी के लिए 20, 21 और 22 स्थानों पर उतरा, इसलिए पृष्ठ के आकार को स्थिर की बजाय अनुमानित समझें: अगले पृष्ठ के लिए "start": 20 को input ऑब्जेक्ट में जोड़ें, और नाम और फोन के आधार पर डीडुप्लिकेट करें न कि सटीक पृष्ठ सीमाओं को मानते हुए।

tbm को lcl पर सेट करने से लिफाफा local_results, metadata, pagination, और search_information होता है — कोई organic_results और कोई related_searches नहीं। एक अस्वीकृत कॉल एक लिफाफा लौटाता है जिसमें code और message होते हैं बजाय किसी भी परिणाम के, यही कारण है कि फ्लो को केवल HTTP स्थिति पर निर्भर होने की बजाय local_results की उपस्थिति पर शाखा करना चाहिए।

संदर्भ पथ वह भाग है जो सही होना चाहिए। Activepieces में, पार्स की गई JSON body के तहत रहती है:

Reference Result
{{step_1.body.local_results.places}} स्थानों का ऐरे
{{step_1.body.organic_results}} वेब परिणाम, जब tbm छोड़ दिया जाता है
{{step_1.organic_results}} कुछ नहीं — न कोई त्रुटि, न चेतावनी

अंतिम पंक्ति महंगी होती है। एक संदर्भ जिसमें body खंड अनुपस्थित होता है वह कुछ भी नहीं लौटाता है, Loop on Items स्टेप शून्य बार इटरट करता है, और रन अभी भी सफल के रूप में समाप्त होता है। एक ख़ाली गंतव्य तालिका दिखने में समान होती है चाहे क्वेरी ने कुछ नहीं लौटाया हो या संदर्भ गलत था, इसलिए पहले पथ की जांच करें।

हर व्यवसाय को एक वस्तु के रूप में संभालने के लिए {{step_1.body.local_results.places}} पर Loop on Items जोड़ें न कि एक ब्लोब को एकल सेल में लिखा जाए।
इसको मुफ्त योजना पर बनाना पूर्ण स्थानीय-पैक प्रतिक्रिया प्राप्त करने के लिए पर्याप्त है — Scrapeless खाता के साथ शुरू करें और कुंजी को परियोजना मान में रखें।

स्टोर करने से पहले सामान्य करें

दो व्यवहार तय करते हैं कि आपके पंक्तियाँ उपयोगी हैं या नहीं, और दूसरा यह है कि एक लीड प्रवाह को कोड की आवश्यकता क्यों होती है।

स्ट्रिंग्स पेडेड आती हैं। phone, type, और hours में एक अग्रणी स्थान होता है — " Plumber", " (512) 690-4935"। यह केवल सौंदर्य की बात नहीं है: एक डिडुप्लीकेशन कुंजी के रूप में उपयोग की जाने वाली पेडेड फोन नंबर अगली बार एक ही व्यवसाय के लिए एक दूसरा रिकॉर्ड बनाती है, और "Plumber" पर श्रेणी फ़िल्टर कुछ भी मेल नहीं खाता। ITU-T नंबरिंग योजना सिफारिश एक फोन नंबर को एक मानक रूप में सामान्य बनाने का कारण है इससे पहले कि यह एक पहचानकर्ता बने।

कई फ़ील्ड मौजूद हैं लेकिन कुछ भी उपयोगी नहीं ले जाते। उसी कैप्चर में, place_id, thumbnail, और lsig सभी 20 रिकॉर्ड में खाली थे। gps_coordinates फंदा है: यह {"latitude": 0, "longitude": 0} के रूप में मौजूद है, इसलिए सत्यता जांच सफल होती है और एक मैपिंग कदम प्रत्येक व्यवसाय को समान बिंदु पर रखता है। address से स्थान लें और समन्वय जोड़े को अनुपस्थित मानें जब तक दोनों मान शून्य ना हों।

phone फ़ील्ड हमेशा एक फोन नंबर नहीं होता। "plumbers in Austin, TX" के लिए 20-स्थान कैप्चर में, केवल 11 रिकॉर्ड में फोन के आकार का मान था। अन्य नौ में उद्घाटन-घंटों का टेक्स्ट था जैसे " Closes 6 PM " या एक सेवा लेबल जैसे "Online estimates"। उस फ़ील्ड को सीधे एक CRM कॉलम में मैप करें और लगभग आधी पंक्तियाँ बिना उपयोगी आएं, प्रवाह में कहीं भी कोई त्रुटि नहीं। उन घंटों की स्ट्रिंग भी एक संकीर्ण नॉन-ब्रेक स्पेस (U+202F) रखती है बजाय एक सामान्य स्थान के, इसलिए " " पर एक नासमझ विभाजन अप्रत्याशित रूप से व्यवहार करता है भले ही ट्रिमिंग के बाद।

फ़ील्ड का मान.Validate करें बजाय इसके नाम पर भरोसा करने के, और फेंके गए टेक्स्ट को न छोड़ें:

एक कोड टुकड़ा अनुरोध और गंतव्य के बीच जोड़ें। Activepieces शरीर को export const code = async (inputs) => { … } के रूप में लपेटता है; इसके अंदर की लॉजिक साधारण JavaScript है:

javascript Copy
// `phone` sometimes carries opening hours or a service label instead of a number,
// so the value is validated before it becomes a contact field.
const PHONE = /\(?\d{3}\)?[ -]?\d{3}-?\d{4}/;

const code = async (inputs) => {
  const clean = (value) => (typeof value === 'string' ? value.trim() : value);
  const places = inputs.response?.local_results?.places ?? [];
  return places.map((place) => {
    const contact = clean(place.phone) ?? '';
    const isPhone = PHONE.test(contact);
    return {
      name: clean(place.title),
      category: clean(place.type),
      rating: place.rating ?? null,
      reviews: place.reviews ?? 0,
      phone: isPhone ? contact : null,
      phone_field_note: isPhone ? null : contact,
      address_snippet: clean(place.address),
    };
  });
};

const sample = {
  response: {
    local_results: {
      places: [
        {
          title: 'Radiant Plumbing, Air Conditioning, & Electrical',
          type: ' Plumber',
          rating: 4.8,
          reviews: 18000,
          phone: ' (512) 690-4935',
          address: '25+ years in business \u00b7 Austin, TX',
        },
        {
          title: 'Beyond Wow Plumbing & Drains',
          type: ' Plumber',
          rating: 4.9,
          phone: ' Closes 6\u202fPM ',
          address: 'Austin, TX',
        },
      ],
    },
  },
};

code(sample).then((rows) => console.log(JSON.stringify(rows, null, 2)));

{{step_1.body}} को टुकड़े के response इनपुट में पास करें। यहाँ दो विवरण महत्वपूर्ण हैं। ?? 0 डिफ़ॉल्ट इसलिए मौजूद है क्योंकि एक व्यवसाय के पास कोई समीक्षाएँ नहीं हैं, इसका कोई reviews कुंजी नहीं है, और एक संख्यात्मक गंतव्य कॉलम undefined को अस्वीकार करता है जबकि 0 को स्वीकार करता है। और phone_field_note रखता है जो भी फ़ील्ड में था जब यह एक संख्या नहीं थी, ताकि एक ऑपरेटर देख सके कि एक पंक्ति में उद्घाटन घंटे हैं न कि एक गायब फोन।

रेटिंग और समीक्षाओं की संख्या दो फ़ील्ड हैं जो संख्यात्मक रखने योग्य हैं। बाकी सब टेक्स्ट है, और यदि प्रवाह एक स्प्रेडशीट निर्यात में समाप्त होता है बजाय एक डेटाबेस के, तो कामे-सेपरेटेड वैल्यूज़ फॉर्मेट स्पेसिफिकेशन यह तय करती है कि एक व्यवसाय नाम जिसमें कामा होता है, कैसे यात्रा करता है।

व्यवसाय संपर्क डेटा की जिम्मेदारी से हैंडलिंग

यह प्रवाह व्यवसाय संपर्क विवरण इकट्ठा करता है, इसलिए इसके साथ कुछ दायित्व आते हैं। केवल सार्वजनिक खोज परिणामों से और केवल उन फ़ील्ड से एकत्र करें जिनकी वर्कफ़्लो को आवश्यकता है। संपर्क डेटा को संग्रहीत करने के लिए एक कानूनी आधार रखो और ऑप्ट-आउट अनुरोधों का सम्मान करें, क्योंकि एक व्यवसाय का फोन नंबर एक स्वतंत्र व्यापार को एक व्यक्ति के रूप में पहचान सकता है — सामान्य डेटा संरक्षण विनियमन व्यावसायिक संदर्भ में भी व्यक्तिगत डेटा पर लागू होता है, और अन्य न्यायालयों में समकक्ष नियम मौजूद हैं। प्रत्येक गंतव्य प्लेटफ़ॉर्म के आयातित संपर्कों के लिए शर्तों का सम्मान करें, पंक्तियों को अनंत काल के लिए रखने के बजाय एक अवधिक अवधि निर्धारित करें, और जिस देश में आप संपर्क कर रहे हैं उसके मार्केटिंग-सहमति नियमों का पालन करें। इनमें से कोई भी कानूनी सलाह नहीं है; आउटरीच करने से पहले अपने दायित्वों की जांच करें।

निष्कर्ष

पूरे प्रवाह को बनाने वाले तीन टुकड़े: HTTP, अभिनेता को कॉल करने के लिए, फ़ील्ड को ट्रिम और डिफ़ॉल्ट करने के लिए कोड, और व्यवसाय के लिए एक पंक्ति लिखने के लिए वस्तुओं पर लूप। विफलता मोड जिसे देखना है वह संदर्भ पथ में होता है: body को छोड़ दें और एक सफल रन एक खाली तालिका लिखता है।

यहां से, शहरों की सूची के लिए क्वेरी को स्वैप करें और वही प्रवाह एक क्षेत्र निर्माण में बदल जाता है। Make इंटीग्रेशन वॉकथ्रू अलग नो-कोड बिल्डर से उसी अनुरोध का कवर करता है, और Dify मॉनिटरिंग निर्माण उसी अभिनेता के एजेंट-चालित संस्करण को दिखाता है।
इसे बनाने के लिए तैयार हैं? पूरे पैरामीटर सेट के लिए डीप सेर्पएपीआई दस्तावेज़ की समीक्षा करें, योजनाओं और शामिल मात्रा की तुलना करें, और नि:शुल्क योजना पर शुरू करें

FAQ

प्रश्न: क्या मुझे Scrapeless का उपयोग करने के लिए एक कस्टम Activepieces पीस की आवश्यकता है?

नहीं। अंतर्निहित HTTP पीस हर अभिनेता को कवर करता है, क्योंकि API एकल POST के साथ एक actor फ़ील्ड और एक input ऑब्जेक्ट लेता है। एक कस्टम पीस केवल तभी मदद करता है जब आप एक ब्रांडेड स्टेप चाहते हैं जिसमें टाइप किए गए फ़ील्ड हों, जिसके लिए एक टीम को कच्चा अनुरोध नहीं देखना चाहिए, और यह क्षमता का निर्णय नहीं बल्कि पैकेजिंग का निर्णय है।

प्रश्न: जब HTTP स्टेप सफल होता है तो मेरा आइटम पर लूप स्टेप शून्य बार क्यों दोहराता है?

पार्स किया गया उत्तर body के तहत नेस्टेड है, इसलिए {{step_1.local_results.places}} कुछ नहीं होता जबकि {{step_1.body.local_results.places}} ऐरे की ओर इंगित करता है। एक गायब संदर्भ कोई त्रुटि नहीं उठाता, इसलिए प्रवाह एक खाली लूप के साथ सफलता की रिपोर्ट करता है। क्वेरी की जांच करने से पहले संदर्भ पथ की जांच करें।

प्रश्न: एक अनुरोध कितने परिणाम लौटाता है, और मैं और प्राप्त कैसे करूँ?

एक स्थानीय-पैक अनुरोध लगभग 20 स्थान लौटाता है; एक प्रश्न के दोहराए गए कैप्चर ने 20, 21 और 22 लौटाए। अगले पृष्ठ के लिए "start": 20 को input ऑब्जेक्ट में जोड़ें, उसके बाद के लिए "start": 40, और इसी तरह। क्योंकि पृष्ठ का आकार बिल्कुल निश्चित नहीं है, नाम और फोन पर डुप्लिकेट करें बजाय इस पर भरोसा करने के कि ऑफसेट्स संरेखित हो जाएं, और अंतिम संक्षिप्त पृष्ठ को सेट का अंत मानें।

प्रश्न: स्थानीय परिणामों पर place_id और gps_coordinates का उपयोग क्यों नहीं किया जा सकता?

place_id, thumbnail, और lsig हर स्थानीय-पैक रिकॉर्ड पर खाली लौटते हैं, इसलिए प्रवाह जिसे place_id की आवश्यकता होती है वह सभी 20 परिणामों को अस्वीकार कर देता है। gps_coordinates भिन्न और अधिक खतरनाक तरीके से व्यवहार करता है: यह {"latitude": 0, "longitude": 0} के साथ भरा होता है, जो एक निर्वात जांच को सहन करता है जबकि हर व्यवसाय को समान समन्वय की ओर इंगित करता है। स्थान के लिए address का उपयोग करें और केवल तब समन्वय युग्म पर भरोसा करें जब दोनों संख्याएं गैर-शून्य हों।

प्रश्न: API कुंजी को Activepieces प्रवाह में कहाँ होना चाहिए?

एक परियोजना-स्तरीय मान या एक कनेक्शन में, जो पृष्ठ शीर्षक फ़ील्ड से संदर्भित है। प्रवाह परिभाषाएँ सटीक फ़ील्ड मान ले जाती हैं और परियोजनाओं के बीच निर्यात और डुप्लिकेट होती हैं, इसलिए चरण में सीधे टाइप की गई एक कुंजी हर कॉपी के साथ यात्रा करती है।

प्रश्न: क्या यह प्रवाह वेबहुक के बजाय एक कार्यक्रम पर चल सकता है?

हाँ। ट्रिगर को कार्यक्रम के लिए स्वैप करें और प्रवाह के बाकी हिस्से में कोई परिवर्तन नहीं होगा, जो एक क्षेत्रीय पुनः ताज़ा करने का सामान्य आकार है। चलाने की आवृत्ति को उस दर से मेल खाने के लिए रखें जिस पर स्थानीय रैंकिंग वास्तव में चलती हैं; दैनिक अधिकांश श्रेणियों के लिए पर्याप्त है, और धीमे ताल प्रवाह को पूर्वानुमानित बनाए रखता है।

प्रश्न: क्या समान प्रवाह व्यवसायों के बजाय वेब परिणामों के लिए काम करता है?

हाँ। tbm को input ऑब्जेक्ट से हटा दें और परिणाम {{step_1.body.organic_results}} के तहत पहुँचते हैं, प्रत्येक में title, link, और snippet होते हैं। कोड पीस को उसका पथ अपडेट करने की आवश्यकता है, और वेब परिणामों पर छंटाई अनावश्यक है।

स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।

सबसे लोकप्रिय लेख

सूची