모든 파일은 zstd로 압축된 JSON Lines 형식이며, 한 줄에 도메인 하나가 들어 있습니다. 파일을 열고, 질문을 던지고, 사용 중인 스택에 적재하는 방법을 안내합니다. 각 레시피는 무료 10,000행 미리보기에서 실행했으며, 표시된 결과는 실제 출력입니다.
형식
JSON Lines, zstd 압축
.jsonl.zst
행 하나당
도메인 하나, 모든 키 항상 포함
값은 null일 수 있음
파일명
데이터셋과 내보내기 날짜
all-data-2026-10-16.jsonl.zst
최신성
매일 새로운 내보내기
열 구성은 매일 동일
1 · 다운로드하는 파일
다운로드하는 파일
모든 webatla 데이터셋은 JSON Lines 형식이며, 한 줄에 도메인 하나, 한 줄에 JSON 객체 하나가 들어 있습니다. 유료 파일은 zstd로 압축되어 있습니다.
파일
내용
형식
전체 데이터셋
데이터셋의 모든 행
.jsonl.zst
일부 데이터
TLD, TLD 접미사, 국가(IP 기준) 또는 기술 하나에 해당하는 모든 행이며, 필드는 전체 파일과 같습니다
.jsonl.zst
무료 미리보기 (10,000행)
전체 파일의 처음 10,000줄
.jsonl 일반 텍스트, 압축 없음
TLD, 국가, 기술 페이지의 20행 미리보기
해당 항목의 행이며, 필드 이름은 유료 파일과 같습니다. 무작위 행이 아니라 정보가 가장 풍부한 행 중 일부를 보여 줍니다.
페이지에 표시
전체 파일을 필터링하는 대신 일부 데이터를 받으세요
하나의 존, 국가 또는 기술이 필요하다면 해당 일부 데이터는 이미 필터링되어 있고 크기도 몇 배나 작습니다.
무료 미리보기는 형식을 보여 줄 뿐, 전형적인 구성이 아닙니다
대부분의 파일은 TLD 접미사 순으로 정렬되어 있어서 처음 10,000줄에는 알파벳 앞쪽의 몇몇 접미사만 포함되며 .com은 들어 있지 않습니다. 미리보기에서 결과가 없는 필터가 전체 파일에서는 수백만 행을 반환할 수 있습니다. 미리보기는 명령어를 만들고 테스트하는 데 사용하세요. 같은 명령어가 유료 파일에서도 그대로 실행됩니다.
2 · 파일 열기
압축을 풀지 않고 내용 확인하기
여기 있는 모든 도구는 압축 파일을 스트림으로 읽습니다. 미리보기와 유료 파일의 차이는 파일을 여는 방식뿐입니다.
import io, json, zstandard
with open("dns-2026-10-16.jsonl.zst", "rb") as fh:
stream = zstandard.ZstdDecompressor().stream_reader(fh, read_across_frames=True)
for line in io.TextIOWrapper(stream, encoding="utf-8"):
row = json.loads(line)
mx = (row["DNS records"] or {}).get("MX") or []
if any((m.get("host") or "").lower().endswith(".google.com") for m in mx):
print(row["Domain"])
PR value 순으로 정렬하여 12행의 woocommerce-de.csv로 저장합니다. CRM이나 스프레드시트에서 바로 열 수 있는 CSV입니다.
쿼리 보기
COPY (SELECT Domain, "PR value" FROM read_json('technologies-2026-10-16.jsonl.zst',
columns = {Domain: 'VARCHAR', "Country by IP": 'VARCHAR',
Technologies: 'JSON', "PR value": 'DOUBLE'})
WHERE "Country by IP" = 'DE' AND list_contains(CASE json_type(Technologies)
WHEN 'OBJECT' THEN json_keys(Technologies)
WHEN 'ARRAY' THEN from_json(Technologies, '["VARCHAR"]') END, 'WooCommerce')
ORDER BY "PR value" DESC
) TO 'woocommerce-de.csv';
전체 웹사이트가 아니라 이 여섯 개 빌더 사이의 비중입니다. 국가별 일부 데이터에 실행하면 한 시장을 비교할 수 있습니다.
쿼리 보기
SELECT tech, count(*) AS sites,
round(100 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM (SELECT unnest(CASE json_type(Technologies)
WHEN 'OBJECT' THEN json_keys(Technologies)
WHEN 'ARRAY' THEN from_json(Technologies, '["VARCHAR"]') END) AS tech
FROM read_json('technologies-2026-10-16.jsonl.zst', columns = {Technologies: 'JSON'}))
WHERE tech IN ('WordPress', 'Wix', 'Squarespace', 'Webflow', 'Drupal', 'Joomla')
GROUP BY tech ORDER BY sites DESC;
최근 30일 동안 등록된 도메인이며 레지스트라도 함께 표시합니다. shop을 브랜드 이름으로 바꿔 사용하세요.
쿼리 보기
SELECT "Domain creation date"[:10] AS created, Domain, Registrar
FROM read_json('rdap-whois-2026-10-16.jsonl.zst', columns = {Domain: 'VARCHAR',
"Domain creation date": 'VARCHAR', Registrar: 'VARCHAR'})
WHERE Domain LIKE '%shop%'
AND "Domain creation date" >= CAST(current_date - 30 AS VARCHAR)
ORDER BY created DESC;
PR value 순으로 정렬했습니다. 많은 레지스트리가 자동으로 갱신하므로 곧 풀릴 도메인 목록이 아니라 지켜보기 위한 관찰 목록으로 활용하세요.
쿼리 보기
SELECT Domain, "Domain expiration date"[:10] AS expires
FROM read_json('websites-ranking-2026-10-16.jsonl.zst', columns = {Domain: 'VARCHAR',
"Domain expiration date": 'VARCHAR', "PR value": 'DOUBLE'})
WHERE "Domain expiration date"
BETWEEN CAST(current_date AS VARCHAR) AND CAST(current_date + 30 AS VARCHAR)
ORDER BY "PR value" DESC LIMIT 3;
사용 가능한 NS 레코드가 있는 도메인의 비율이며, 호스트 이름의 마지막 두 레이블 기준으로 묶었습니다.
쿼리 보기
CREATE OR REPLACE MACRO provider(h) AS
array_to_string(string_split(lower(rtrim(h, '.')), '.')[-2:], '.');
SELECT provider(json_extract_string("DNS records", '$.NS[0]')) AS dns,
count(*) AS domains, round(100 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM read_json('dns-2026-10-16.jsonl.zst', columns = {"DNS records": 'JSON'})
WHERE dns <> '' GROUP BY dns ORDER BY domains DESC, dns LIMIT 3;
전체 파일은 스프레드시트에 들어가지 않으므로 먼저 필터링하거나 일부 데이터에서 시작하세요. 기술, TLD, TLD 접미사, 국가 중 하나를 별도 파일로 받는 방식이며, webatla 페이지나 API에서 받을 수 있습니다. Technologies 또는 All data 이용권이 있으면 모든 기술 페이지에 해당 일부 데이터를 받는 다운로드 상자가 표시됩니다.
전체 파일에서
TLD 하나 또는 접미사 하나
jq
TLD는 도메인의 마지막 레이블입니다. TLD 접미사는 정확한 공개 접미사(public suffix)입니다.
# every domain under one TLD (de covers every suffix that ends in .de)
zstd -dc all-data-2026-10-16.jsonl.zst | jq -c 'select(.TLD == "de")' > de.jsonl
# exactly one suffix
zstd -dc all-data-2026-10-16.jsonl.zst | jq -c 'select(."TLD suffix" == "2ix.de")' > 2ix.de.jsonl
# a suffix that equals its TLD (com, de, ac) has no file of its own:
# filter the TLD slice instead
zstd -dc webatla-all-data-ac-2026-10-16.jsonl.zst | jq -c 'select(."TLD suffix" == "ac")' > ac.jsonl
COPY (
SELECT Domain AS Website, "Country by IP" AS Country
FROM read_json('webatla-technologies-WooCommerce-2026-10-16.jsonl.zst',
columns = {'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'PR value': 'DOUBLE'})
WHERE "Country by IP" = 'DE'
ORDER BY "PR value" DESC
) TO 'woocommerce-germany.csv';
COPY (
SELECT Domain AS Website, "Country by IP" AS Country
FROM read_json('webatla-technologies-HubSpot-2026-10-16.jsonl.zst', columns = {
'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'Technologies': 'JSON'})
WHERE list_contains(CASE json_type(Technologies) WHEN 'OBJECT' THEN json_keys(Technologies)
ELSE json_extract_string(Technologies, '$[*]') END, 'WordPress')
) TO 'hubspot-on-wordpress.csv';
무료 10,000행 미리보기의 실제 출력
Website,Country
ateliercrescendo.ac,US
영업 운영
담당 지역별 파일
일부 데이터를 서버 국가별 CSV 하나씩으로 나눕니다.
COPY (
SELECT Domain AS Website, coalesce("Country by IP", 'unknown') AS Country
FROM read_json('webatla-technologies-WooCommerce-2026-10-16.jsonl.zst',
columns = {'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR'})
) TO 'woocommerce-by-country'
(FORMAT csv, PARTITION_BY (Country), WRITE_PARTITION_COLUMNS true, OVERWRITE);
각 줄이 하나의 jsonb 행이 되며, Technologies에 GIN 인덱스를 만듭니다.
psql -c 'CREATE TABLE domains (doc jsonb)'
zstdcat technologies-2026-10-16.jsonl.zst \
| psql -c "\copy domains FROM STDIN WITH (FORMAT csv, QUOTE e'\x01', DELIMITER e'\x02')"
psql -c "CREATE INDEX ON domains USING gin ((doc->'Technologies'))"
psql -c "SELECT doc->>'Country by IP' AS country, count(*) AS sites FROM domains
WHERE doc->'Technologies' ? 'WordPress' GROUP BY 1 ORDER BY 2 DESC, 1 LIMIT 5"
무료 10,000행 미리보기의 실제 출력
COPY 10000
country | sites
---------+-------
US | 300
DE | 110
CA | 29
Parquet
DuckDB
타입이 지정된 열로 변환되며, Technologies는 이름 목록이 됩니다. BigQuery, Snowflake, Spark, pandas에 적재할 수 있습니다.
CREATE OR REPLACE MACRO techs(t) AS CASE json_type(t) WHEN 'OBJECT'
THEN json_keys(t) WHEN 'ARRAY' THEN t->>'$[*]' ELSE []::VARCHAR[] END;
COPY (SELECT "Domain" AS domain, "Country by IP" AS country,
"PR value" AS pr_value, techs("Technologies") AS technologies
FROM read_json('technologies-2026-10-16.jsonl.zst', columns = {
'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR',
'PR value': 'DOUBLE', 'Technologies': 'JSON'}))
TO 'technologies.parquet' (FORMAT parquet);
무료 10,000행 미리보기의 실제 출력
technologies.parquet: 10000 rows
domain · country · pr_value · technologies (list of names)
보유한 목록 보강하기
DuckDB
한쪽에는 사용자의 CSV, 다른 쪽에는 내보내기 파일을 두고 Domain 기준으로 매칭합니다.
SELECT c.domain, w."Country by IP" AS country, w."Registrar" AS registrar,
w."HTTP status" AS http, w."Domain creation date"[:10] AS created
FROM read_csv('my-domains.csv') c
LEFT JOIN read_json('all-data-2026-10-16.jsonl.zst', columns = {
'Domain': 'VARCHAR', 'Country by IP': 'VARCHAR', 'Registrar': 'VARCHAR',
'HTTP status': 'INTEGER', 'Domain creation date': 'VARCHAR'}) w
ON w."Domain" = lower(trim(c.domain))
ORDER BY 1;
무료 10,000행 미리보기의 실제 출력
domain country registrar http created
Tamm.AbuDhabi AE ADSIC Registry Operator 200 2018-07-09
easy.ac US MarkMonitor Inc. 200 2014-02-27
global.abb US CSC Corporate Domains, Inc. 301 2019-10-03
6 · 일일 업데이트
밤사이 달라진 내용 확인하기
새로운 내보내기가 매일 제공됩니다. 이틀치 파일을 Domain 기준으로 비교해 변경분만 다음 단계로 보내세요. 두 파일의 순서를 바꾸면 빠진 도메인 목록을 얻을 수 있습니다.
COPY (
SELECT "Domain" FROM read_json('all-active-domains-2026-10-16.jsonl.zst',
columns = {'Domain': 'VARCHAR'})
EXCEPT
SELECT "Domain" FROM read_json('all-active-domains-2026-10-15.jsonl.zst',
columns = {'Domain': 'VARCHAR'})
) TO 'new-since-yesterday.csv' (HEADER false);
7 · 자주 하는 실수
헷갈리기 쉬운 점
필드 이름에 공백이 있습니다
SQL과 jq 모두에서 따옴표로 감싸세요.
jq: ."TLD suffix"SQL: "TLD suffix" = 'com.sa'
DNS Status는 텍스트입니다
불리언이 아니라 "TRUE" 또는 "FALSE"라는 텍스트이므로 문자열로 비교하세요.
select(."DNS Status" == "TRUE")
Technologies에는 여러 형태가 있습니다
이름과 버전을 짝지은 맵(또는 버전이 든 객체와 짝지은 맵), 이름 목록, 또는 null입니다. 맵은 키를, 목록은 항목을 읽으면 어느 쪽이든 하나의 목록을 얻습니다.
jq: (.Technologies // []) | if type == "object" then keys else . end
전체 파일을 디스크에 풀지 마세요
All data 전체 파일은 압축 상태 약 34 GB, 압축을 풀면 수백 GB입니다. 여기 있는 모든 레시피처럼 스트림으로 처리하세요.
처음 몇 행을 확인하세요
DuckDB에서는 철자를 잘못 쓴 열 이름이 오류가 아니라 NULL로 반환됩니다.
8 · 문제 해결
문제가 생겼을 때
증상
원인과 해결 방법
무료 미리보기에서 zstd: … unsupported format
미리보기는 압축되지 않은 일반 JSONL입니다. jq에 직접 넘기거나 두 가지를 모두 읽는 zstdcat을 사용하세요.
Python이 반환하는 행이 zstd -dc FILE | wc -l보다 훨씬 적습니다
파일에 zstd 프레임이 여러 개 있는데 첫 번째 프레임에서 멈추는 호출로 읽었기 때문입니다. Python 레시피처럼 read_across_frames=True와 함께 stream_reader를 사용하세요.
.TLD suffix에서 jq: syntax error
공백이 들어 있는 이름은 따옴표로 감싸세요: ."TLD suffix"
SQL이 오류 없이 0행을 반환합니다
작은따옴표 안의 이름('Country by IP')은 열이 아니라 문자열입니다. 열 이름에는 큰따옴표를 사용하세요.
DuckDB가 Expected OBJECT, but got ARRAY 오류를 내며 중간에 멈춥니다
자동 스키마 감지는 처음 몇 행만 살펴봅니다. 중첩 필드는 JSON으로 지정하여 열을 직접 선언하세요.
다운로드가 완전한가요?
zstd -tq FILE && echo OK 실행 시 파일이 완전히 압축 해제되면 OK가 출력됩니다.
모든 레시피는 매일 받는 전체 파일에서 실행됩니다
월간 또는 연간 이용권으로 매일 새로운 내보내기를 받고, 일부 데이터를 위한 API도 이용하실 수 있습니다. 모든 계정은 각 데이터셋의 무료 10,000행 미리보기도 다운로드할 수 있습니다.