Python에서 회사명으로 기업 웹사이트를 찾으려면 회사명과 사용 가능한 국가 정보를 Datablist의 Company Name to Domain API로 전송하세요. API가 백그라운드에서 조회를 처리한 뒤 도메인과 전체 웹사이트 URL을 반환합니다.

먼저 간단한 Python API 요청 방법을 살펴보겠습니다. 그런 다음 같은 함수를 재사용해 기존 URL은 그대로 유지하면서 회사 레코드 목록에서 웹사이트가 비어 있는 항목만 채워 보겠습니다.

스프레드시트와 비슷한 인터페이스를 선호한다면 회사명으로 웹사이트를 일괄 검색하는 가이드를 참고하세요.

💡 바쁜 분을 위한 요약

회사명으로 웹사이트를 찾는 Python 함수 하나를 만든 다음, 기존 URL을 덮어쓰지 않고 웹사이트가 비어 있는 레코드만 완성하세요.

  • 입력: 회사명과 선택 사항인 국가 정보
  • 출력: 도메인, 전체 웹사이트 URL, 신뢰도, 결과 상태, 사용된 크레딧

Python과 Datablist API 키 설정하기

이 예제에서는 Requests 패키지로 동기식 HTTP 호출을 수행합니다. 가상 환경에 패키지를 설치하세요.

shell
python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests

REST API 접근은 Growth 기능이므로 Datablist Growth 플랜도 필요합니다. Datablist API 계정 페이지에서 Personal API Key를 만든 다음 환경 변수에 저장하세요.

shell
export DATABLIST_API_KEY="exampleuser-exampleaccount-EXAMPLE_TOKEN_NOT_VALID-2"

🔑 이미 API 키가 있나요? 이전 키는 auth0|<userId>:<accountId>:<secret>:1 형식을 사용하며 지금도 지원됩니다. 기존 키를 변경하거나 형식을 바꿀 필요 없이 생성된 그대로 사용하세요.

위의 예시 값을 계정 페이지에서 생성한 키로 바꾸세요. 기업 웹사이트 조회에는 크레딧이 사용됩니다. 스크립트를 확장하기 전에 1크레딧 및 2.5크레딧 경로를 설명하겠습니다. 최신 플랜 정보는 Datablist 요금 페이지에서 확인할 수 있습니다.

Python으로 기업 웹사이트 한 건 조회하기

find_company_websites.py 파일을 만드세요. 이 스크립트는 하나의 함수 안에서 회사명을 제출하고, 작업이 끝날 때까지 기다린 뒤 결과를 가져옵니다. 각 입력의 inputId에는 변경되지 않는 레코드 ID를 사용하므로 응답 순서가 달라져도 모든 결과를 올바른 레코드와 연결할 수 있습니다.

python
import json
import os
import time
import uuid
import requests
API_BASE_URL = "https://api.datablist.com/v1"
def find_domains(companies, api_key):
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"X-API-Key": api_key,
}
inputs = [
{
"inputId": company["id"],
"data": {
"companyName": company["company_name"],
"targetCountry": company.get("country", ""),
},
}
for company in companies
]
unique_id = f"python-domain-lookup-{uuid.uuid4().hex}"
payload = {
"enrichmentId": "company-name-to-domain",
"uniqueId": unique_id,
"settings": {
"workflow": "dataset_google",
"countryOverwrite": True,
"acceptNonRoot": True,
},
"inputs": inputs,
}
print(f"Task uniqueId: {unique_id}")
response = requests.post(
f"{API_BASE_URL}/enrichments/tasks",
headers=headers,
json=payload,
)
response.raise_for_status()
task_id = response.json()["@id"]
while True:
response = requests.get(
f"{API_BASE_URL}/enrichments/tasks/{task_id}",
headers=headers,
)
response.raise_for_status()
task = response.json()
if task["status"] in {"completed", "failed", "stopped"}:
break
time.sleep(3)
if task["status"] != "completed":
raise RuntimeError(
f"Task {task_id} ended with status {task['status']}: {task.get('error')}"
)
results = []
cursor = None
while True:
params = {"limit": 100}
if cursor is not None:
params["cursor"] = cursor
response = requests.get(
f"{API_BASE_URL}/enrichments/tasks/{task_id}/results",
headers=headers,
params=params,
)
response.raise_for_status()
page = response.json()
results.extend(page["results"])
cursor = page.get("nextCursor")
if cursor is None:
break
return results
api_key = os.environ["DATABLIST_API_KEY"]
companies = [
{
"id": "direct-microsoft-us",
"company_name": "Microsoft",
"country": "US",
}
]
lookup_results = find_domains(companies, api_key)
for result in lookup_results:
print(json.dumps(result, indent=2))

키를 export한 터미널에서 실행하세요.

shell
python find_company_websites.py

Microsoft 조회 결과는 다음과 같습니다.

json
{
"inputId": "direct-microsoft-us",
"status": "success",
"outputs": {
"companyUrl": "https://microsoft.com",
"companyDomain": "microsoft.com",
"domainConfidence": "High"
},
"creditsUsed": "1",
"error": null
}

inputId를 사용해 이 결과를 원본 레코드와 연결하세요. status는 success, no_result, error, skipped 중 하나입니다. 성공한 결과에는 companyDomain, 전체 companyUrl, domainConfidence가 포함될 수 있습니다. creditsUsed는 해당 입력에 청구된 크레딧을 보여 주며, error는 항목 단위의 실패 원인을 설명합니다.

함수는 다음 세 가지 API 호출을 순서대로 수행합니다.

첫째, 조회 작업을 제출합니다. Payload에는 설정과 회사 레코드가 들어갑니다. POST 요청은 202 Accepted를 반환하며, @id는 이후 호출에 필요한 작업 ID입니다.

python
response = requests.post(
f"{API_BASE_URL}/enrichments/tasks",
headers=headers,
json=payload,
)
response.raise_for_status()
task_id = response.json()["@id"]

DATABLIST_API_KEY가 설정되어 있지 않으면 HTTP 요청을 보내기 전 환경 변수를 조회하는 단계에서 Python이 KeyError를 발생시킵니다. 변수를 export한 뒤 스크립트를 다시 실행하세요. 변수에 유효하지 않은 키가 들어 있으면 POST 요청이 API에 도달한 후 HTTP 401을 반환합니다. 계정 페이지에서 현재 Personal API Key를 복사해 유효하지 않은 값을 교체하세요.

둘째, 작업 상태를 폴링합니다. POST 요청은 백그라운드 작업을 시작합니다. 따라서 스크립트는 상태가 completed, failed, stopped 중 하나가 될 때까지 3초마다 작업 정보를 조회합니다.

python
while True:
response = requests.get(
f"{API_BASE_URL}/enrichments/tasks/{task_id}",
headers=headers,
)
response.raise_for_status()
task = response.json()
if task["status"] in {"completed", "failed", "stopped"}:
break
time.sleep(3)

크레딧 부족으로 작업이 실패하면 오류 사유가 credits_error로 표시됩니다. 크레딧을 추가하거나 월간 크레딧이 갱신될 때까지 기다린 다음, 이미 반환된 결과를 확인하고 완료되지 않은 입력만 새 작업으로 제출하세요.

셋째, 모든 결과 페이지를 가져옵니다. 각 응답의 결과를 목록에 추가하고 다음 요청에 사용할 cursor를 받습니다.

python
results.extend(page["results"])
cursor = page.get("nextCursor")
if cursor is None:
break

nextCursor가 null이 될 때까지 다음 페이지를 계속 가져옵니다.

스크립트는 POST 요청 전에 생성된 uniqueId를 출력합니다. 작업 생성 응답을 받기 전에 연결이 끊겼다면 새 작업을 만들기 전에 먼저 작업 목록에서 상태를 확인하세요.

shell
curl --get "https://api.datablist.com/v1/enrichments/tasks" \
--header "X-API-Key: $DATABLIST_API_KEY" \
--data-urlencode "enrichmentId=company-name-to-domain"

스크립트가 생성한 값과 uniqueId가 일치하는 작업을 찾은 뒤 해당 작업의 @id를 복사하세요. 목록 endpoint는 enrichmentId로 필터링할 수 있지만 uniqueId로는 필터링할 수 없습니다. 스크립트와 동일한 상태 및 결과 URL에 @id를 사용하세요. 작업이 아직 진행 중이면 계속 폴링합니다. 작업이 중단되거나 실패했다면 입력을 다시 제출하기 전에 부분 결과가 있는지 확인하세요.

Dataset 매칭과 국가 기반 fallback 이해하기

스크립트는 권장 기본값인 dataset_google을 사용합니다. Datablist는 먼저 자체 기업 Dataset을 확인합니다. 일치 항목이 없거나 결과가 서로 충돌하면 Google을 fallback으로 사용할 수 있습니다. 가능한 일치 항목을 검토한 뒤 신뢰도를 반환합니다.

먼저 Dataset을 확인하고 필요할 때 Google을 사용한 뒤 도메인, URL, 신뢰도를 반환하는 기업 웹사이트 조회 과정
먼저 Dataset을 확인하고 필요할 때 Google을 사용한 뒤 도메인, URL, 신뢰도를 반환하는 기업 웹사이트 조회 과정

국가 정보는 이름이 모호할 때 유용합니다. 이 예제에서는 같은 회사명으로 서로 다른 결과가 나왔습니다.

  • Mercury와 US를 입력하면 shipmercury.com과 https://www.shipmercury.com/이 반환되었습니다.
  • Mercury와 IE를 입력하면 mercuryeng.com과 http://www.mercuryeng.com이 반환되었습니다.

두 결과 모두 신뢰도는 High였습니다. 국가 정보는 이름이 같은 여러 회사 중 적절한 회사를 선택하는 데 도움이 되며, 신뢰도는 어떤 결과를 검토해야 하는지 판단하는 기준이 됩니다.

업종, 회사 규모 또는 다른 비즈니스 정보까지 고려해야 한다면 AI Agent 리서치 워크플로를 사용하세요. AI Agent가 더 풍부한 비즈니스 맥락으로 원하는 회사를 조사할 수 있도록 해당 정보를 prompt에 추가하세요.

기존 레코드에서 누락된 웹사이트만 채우기

이제 find_domains()로 회사명에서 웹사이트를 찾을 수 있으므로, 이 함수를 재사용해 회사 레코드에서 누락된 웹사이트만 채워 보겠습니다. 이미 웹사이트가 있는 레코드는 API를 거치지 않으므로 기존 값이 바뀌지 않고 조회 크레딧도 사용하지 않습니다.

find_company_websites.py에서 companies = [부터 마지막 출력 loop까지를 아래 블록으로 교체하세요. 그 위의 api_key 할당 코드는 그대로 두면 됩니다. 빈 값 검사는 None, 빈 문자열, 공백으로만 구성된 문자열을 모두 처리합니다. 모든 웹사이트가 채워져 있으면 API를 호출하지 않습니다.

python
records = [
{
"id": "crm-001",
"company_name": "Microsoft",
"country": "US",
"website": "https://www.microsoft.com",
},
{
"id": "crm-002",
"company_name": "boulangerie du palais lyon",
"country": "FR",
"website": "",
},
{
"id": "crm-003",
"company_name": "Mercury Engineering",
"country": "IE",
"website": None,
},
{
"id": "crm-004",
"company_name": "Mercury",
"country": "US",
"website": " ",
},
{
"id": "crm-005",
"company_name": "Datablist",
"country": "FR",
"website": "https://www.datablist.com",
},
{
"id": "crm-006",
"company_name": "Mercury",
"country": "IE",
"website": None,
},
]
def website_is_missing(value):
return not isinstance(value, str) or not value.strip()
records_to_lookup = [
record for record in records if website_is_missing(record.get("website"))
]
lookup_results = (
find_domains(records_to_lookup, api_key) if records_to_lookup else []
)
results_by_id = {result["inputId"]: result for result in lookup_results}
for record in records:
if not website_is_missing(record.get("website")):
record["website_lookup"] = {"status": "not_requested"}
continue
result = results_by_id.get(record["id"])
if result is None:
record["website_lookup"] = {
"status": "missing_result",
"domain": None,
"confidence": None,
"credits": None,
"error": {
"code": "missing_result",
"message": "No result was returned for this inputId.",
},
}
continue
outputs = result.get("outputs") or {}
if result["status"] == "success" and outputs.get("companyUrl"):
record["website"] = outputs["companyUrl"]
record["website_lookup"] = {
"status": result["status"],
"domain": outputs.get("companyDomain"),
"confidence": outputs.get("domainConfidence"),
"credits": result.get("creditsUsed"),
"error": result.get("error"),
}
print(json.dumps(records, indent=2))

코드는 먼저 inputId를 기준으로 결과를 인덱싱한 다음 원본 레코드를 처음 순서대로 순회합니다. website_lookup 객체에는 조회에 실패했거나 결과가 누락된 경우까지 포함해 각 대상 레코드의 처리 결과와 검토 정보가 함께 저장됩니다.

crm-001에는 Microsoft URL이 이미 있으므로 website_is_missing()이 False를 반환합니다. 이 레코드는 records_to_lookup에 추가되지 않아 API로 전송되지 않습니다. 병합 후에도 웹사이트는 그대로 유지되며 상태는 not_requested로 기록됩니다.

crm-002는 웹사이트가 비어 있으므로 빵집 정보를 inputId: crm-002와 함께 전송합니다. API도 동일한 inputId를 반환합니다. results_by_id는 이를 이용해 올바른 결과를 찾고, 결과 순서에 의존하지 않은 채 해당 레코드에 https://boulangerie-du-palais-lyon.eatbu.com을 기록합니다.

ID회사병합 후 웹사이트상태도메인신뢰도크레딧
crm-001Microsoft · UShttps://www.microsoft.comnot_requested
crm-002boulangerie du palais lyon · FRhttps://boulangerie-du-palais-lyon.eatbu.comsuccessboulangerie-du-palais-lyon.eatbu.comHigh1
crm-003Mercury Engineering · IEhttps://mercuryeng.comsuccessmercuryeng.comHigh1
crm-004Mercury · UShttps://www.shipmercury.com/successshipmercury.comHigh1
crm-005Datablist · FRhttps://www.datablist.comnot_requested
crm-006Mercury · IEhttp://www.mercuryeng.comsuccessmercuryeng.comHigh1

이 빵집은 비즈니스 전용 subdomain인 boulangerie-du-palais-lyon.eatbu.com을 사용합니다. 이를 eatbu.com으로 축약하지 말고 companyUrl에 담긴 정확한 주소를 저장하세요. acceptNonRoot: true 설정은 hostname 뒤에 경로가 붙은 호스팅형 비즈니스 페이지도 허용하므로 두 경우 모두 전체 URL이 중요합니다.

완료된 작업에도 no_result, error, skipped 항목이 포함될 수 있습니다. 이 예제는 상태가 success이고 companyUrl이 있을 때만 website를 변경합니다. no_result라면 웹사이트는 빈 상태로 유지되고 상태는 website_lookup에 남습니다. 먼저 회사명과 국가가 정확한지 확인하세요. 둘 중 하나가 잘못되었다면 수정한 뒤 해당 레코드를 새 작업으로 제출합니다. 입력이 정확하다면 수동 검토를 위해 웹사이트를 빈 상태로 남겨 두세요.

스크립트 확장 전 조회 크레딧 계산하기

예제의 조회 5건은 모두 High 신뢰도의 success 결과를 반환했으며 총 5크레딧을 사용했습니다.

Dataset에서 결과를 찾은 조회는 1크레딧, Google로 처리된 조회는 2.5크레딧입니다. 두 경로 모두가 아니라 실제 사용된 경로에 대해서만 비용을 지불합니다. 입력이 1,000개라면 모두 Dataset에서 해결될 경우 1,000크레딧, 모두 Google을 사용할 경우 2,500크레딧이 필요합니다. 이는 계획을 위한 시나리오이며 모든 조회의 성공을 보장하는 것은 아닙니다.

슬라이더를 움직여 목록의 크레딧 사용량을 비교해 보세요.

Loading pricing…

20,000크레딧에 20달러를 기준으로 하면 각 시나리오의 비용은 각각 1달러와 2.50달러입니다. Growth 구독료는 별도이며, 현재 매월 20,000크레딧이 포함되어 충전 크레딧보다 먼저 사용됩니다. 플랜과 패키지 구성은 변경될 수 있으므로 최신 요금을 확인하세요.

한 작업에는 최대 10,000개의 입력을 넣을 수 있으며, 입력당 제한은 16KiB, 요청당 제한은 10MiB입니다. 이 예제는 blocking 방식의 Requests 호출로 소규모 Datablist 비동기 작업 하나를 제출하고, 폴링한 뒤 결과를 가져옵니다. 공식 유지보수 repository에는 CSV batching과 non-blocking client 예제도 있습니다.

다음 단계

반환된 웹사이트가 찾으려는 기업의 사이트로 확인되면 Python으로 Impressum을 스크래핑해 법인 정보와 법적 고지 페이지의 원본 URL을 같은 공급업체 레코드에 추가할 수 있습니다. 웹사이트 매칭 검토와 이후의 데이터 추출 과정은 분리해서 진행하세요.

예제 레코드를 실제 데이터의 일부로 교체한 다음 스크립트를 실행하고 병합된 레코드를 확인하세요. 변경되지 않는 ID와 국가 정보를 유지하고, 스크립트가 기존 웹사이트를 보존하면서 예상한 빈 항목을 채우는지 확인한 뒤 규모를 확장하세요. 다운로드 가능한 스크립트, CSV batching 또는 비동기 버전이 필요하다면 GitHub의 공식 Company Name to Domain API 예제에서 시작할 수 있습니다.