구글 검색 API 로 업체 연락처 자동 수집 노코드

목표: 시간 절약 + 자동화!

약초 입욕제를 납품할 수 있는 업체를 찾고 싶었어요. 그런데 문제는, 검색 후 하나하나 업체 정보를 확인하고 연락처를 정리하는 게 너무너무 귀찮다는 것...😩 "이거 AI로 자동화하면 편하지 않을까?" 라는 생각이 스쳐 지나갔습니다. 그래서 직접 시스템을 만들어 보기로 했죠! 🔥

⚙️ 사용한 AI 도구 & 방법

💡 사용한 도구

  • Google Custom Search API 👉 업체 정보를 자동 검색하기 위해 활용!

  • Google Apps Script 👉 API 데이터를 Google Sheets에 정리하는 자동화 스크립트!

  • Scrapfly API 👉 업체 홈페이지에서 이메일, 전화번호, 담당자명까지 자동 추출!
    (써보고싶었는데 시간관계상,,,,)

💡 실제 진행 방법

  1. Google Custom Search API를 이용해 특정 키워드(예: "문화재 행사 기획사")로 업체 정보를 검색 🕵️‍♂️

Google Apps Script로 API 호출해서 업체명 & 홈페이지 링크를 Google Sheets에 자동 입력 📄

💡 진행과정

흰색 배경에 한국어 텍스트


회사 연락처를 찾아 리스트업하는 봇을 만들겠다는 목표만으로

패기넘치게 지피티에게 말을 걸었습니다.

흰색 배경에 한국어 텍스트

"뭐가 필요한지도 너가 알려줘 ^^"

한국 문자 메시지의 스크린 샷

지피티가 제공한 4가지 큰 질문에 맞춰서 대답해보았습니다.

처음에는 파이썬 코드를 알려주더군요

한국어 문자 메시지의 스크린 샷

가장 만만한 앱스스크립트로 부탁을 드렸습니다.

1 단계 Google Sheets 한국 Google Sheets 한국 Google Sheets 한국 Google Sheets Korean Google Sheets Kor
흰색 배경에 한국어 텍스트

질문을 잘못했는데 찰떡같이 알아서 답변까지 해주는 gpt 선생님입니다. (개떡->찰떡)

Google 시트

제가 원하는 모습으로 미리보기를 해주셔서 이걸로 결정했습니다.

한국어 문자 메시지의 스크린 샷

하지만 또 계속되는 오류에 그만 정신을 잃고 말았습니다...

이럴 땐 기강을 잡아줍시다 .. ^^

그러면 알아서 잘(!!) 원래 오류들을 해결한 형태로 다시 코딩을 해주더라구요.

네이버 API 는 어떻게 인증하는데 ... ? ->사용신청이 뭐야 ....? -> 와 같은 질문들을 쭉 하면서

결국 간단히 활용할 수 있는 구글 api를 적용해보기로 하였습니다.

구글 API 적용하는 법도 아예 몰랐는데, 지피티에게 물어보면서 하나하나 차근차근 따라가며 적용할 수 있었습니다.

.

API KONEAN

API 키를 생성하고 나니 CSE ID를 달라고 합니다.

이것은 구글 검색 결과를 가져올 때 필수로 필요하다며

생성방법까지 알려주는 아주 똑똑한 지피티에요 ♡

SEO ID 검색 엔진 SEO ID 검색 엔진 SEO ID 검색 엔진 SEO ID 검색 엔진 SEO
로고가있는 웹 사이트의 홈페이지

검색엔진까지 넣고 기다렸는데

되는것처럼 굴더니

키워드만 긁어오고 아무 정보도 없는 상황을 마주했습니다.... 띠요옹

API의 응답이 정상적으로 왔는지 확인하는 코드를 한번 더 추가하였습니다.

알고보니 검색결과가 없기에 공란으로 처리가 되었던것을 확인할 수 있었습니다.

검색엔진에서 검색 영역을 지정할때 www.google.com/* 로 설정해서 결과가 나오지 않는것 같다는 말씀에 , 검색엔진을 새로 만들어 다시 적용했습니다.

전체 웹 검색으로 변경하니 뭐라도 긁혀서 나오네요

업체명이 정리되서 나오길 바랬지만

좀더 연구해보아야 할 것 같습니다..!

더 나아가 업체명, 담당자명, 연락처, 이메일 등도 함께 크롤링할수있는 Scrapfly API를 활용해보고싶습니다.

📝 Google Apps Script 코드 전문

function searchGoogleForKeywords() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("업체 리스트");
  if (!sheet) {
    Logger.log("시트를 찾을 수 없습니다.");
    return;
  }

  var apiKey = "AIzaSyC71M-sM1Bk5NbV50fSDq80P8ARTXAANa0";  // ✅ Google API 키
  var cx = "71fe7c09304ce4308";  // ✅ 새로 생성한 CSE ID
  var scrapflyKey = "YOUR_SCRAPFLY_API_KEY";  // ✅ Scrapfly API 키 입력 (무료 가입 가능)

  var lastRow = sheet.getLastRow();
  for (var row = 2; row <= lastRow; row++) {
    var keyword = sheet.getRange(row, 1).getValue();
    if (!keyword) continue;

    var url = "https://www.googleapis.com/customsearch/v1?q=" + encodeURIComponent(keyword) +
              "&key=" + apiKey + "&cx=" + cx;

    var response = UrlFetchApp.fetch(url);
    var responseText = response.getContentText();
    Logger.log("API 응답: " + responseText);

    var json = JSON.parse(responseText);
    if (!json.items || json.items.length === 0) {
      Logger.log("❌ 검색 결과 없음: " + keyword);
      sheet.getRange(row, 2).setValue("검색 결과 없음");
      continue;
    }

    var insertRow = row;
    json.items.forEach(function(item) {
      sheet.getRange(insertRow, 2).setValue(item.title);  // 업체명
      sheet.getRange(insertRow, 3).setValue(item.link);  // 홈페이지 링크

      // ✅ Scrapfly API로 연락처 정보 가져오기
      var contactInfo = getContactInfo(item.link, scrapflyKey);
      sheet.getRange(insertRow, 4).setValue(contactInfo.email);  // 이메일
      sheet.getRange(insertRow, 5).setValue(contactInfo.phone);  // 전화번호
      sheet.getRange(insertRow, 6).setValue(contactInfo.contactPerson);  // 담당자명

      insertRow++;
    });
  }
}

// ✅ 업체 홈페이지에서 이메일, 전화번호, 담당자명 크롤링 (Scrapfly API 사용)
function getContactInfo(website, scrapflyKey) {
  var apiUrl = "https://api.scrapfly.io/scrape?key=" + scrapflyKey + "&url=" + encodeURIComponent(website);
  try {
    var response = UrlFetchApp.fetch(apiUrl);
    var html = response.getContentText();

    // 이메일, 전화번호, 담당자명 추출 (정규식 사용)
    var emailMatch = html.match(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/);
    var phoneMatch = html.match(/(\d{2,3}-\d{3,4}-\d{4})/);
    var contactMatch = html.match(/(담당자|Manager|Contact Person)[:\s]*([a-zA-Z가-힣\s]+)/);

    return {
      email: emailMatch ? emailMatch[0] : "없음",
      phone: phoneMatch ? phoneMatch[0] : "없음",
      contactPerson: contactMatch ? contactMatch[2] : "없음"
    };
  } catch (e) {
    Logger.log("❌ 연락처 정보 가져오기 실패: " + website);
    return { email: "오류", phone: "오류", contactPerson: "오류" };
  }
}

📌 도움이 된 팁

  • CSE (Custom Search Engine) 설정 시 '전체 웹 검색 포함' 옵션을 활성화해야 함!

  • Google API의 일일 요청 제한(100회)을 초과하지 않도록 주의 필요!

🔍 결과 & 배운 점

잘 된 점

  • 검색부터 데이터 정리까지 자동화되면서 시간 절약 효과 💯

  • 크롤링과 API를 직접 써보니 "와, 이거 재밌는데?!" 하는 생각이 들었음 😆

  • ChatGPT랑 같이 하니까 막히는 부분이 수월하게 해결됨! 🤖

아쉬운 점

  • 단순히 검색창에 키워드를 입력하는 수준으로 그쳐서 아쉬움. 😵

  • B2B 환경에서는 핵심 의사결정권자의 연락처를 찾기가 어려움 😵

🔜 다음 단계 현재 구글 검색 API까지만 활용해서 링크만 얻었는데, 다음엔 Scrapfly API로 홈페이지 내 연락처까지 크롤링해볼 예정! 💪


👉 이 게시글도 읽어보세요