무언가를 스크래핑해 본 사람이라면, 지루한 부분은 페이지를 가져오는 것이 아니라는 것을 압니다. 진짜 문제는 그 다음입니다: £51.77이나 $135k - $160k / year, 또는 2,350/mo와 같이 쓰인 가격들, 텍스트에 섞여 있는 쿠키 배너, CSS 클래스로만 존재하는 별점, 그리고 사이트마다 레이아웃이 다 다르다는 점입니다. 결국 사이트별로 수많은 셀렉터(selectors)와 정규식(regexes)을 작성하게 되고, 사이트가 변경될 때마다 이들이 작동을 멈춥니다.
저는 바로 그 단계를 위해 작은 도구인 spruce_the_data를 만들었습니다. 사용자가 원하는 JSON 구조를 JSON Schema로 설명하고, 지저분한 텍스트, HTML 또는 페이지 링크를 제공하면, 이 도구가 해당 모양으로 데이터를 반환합니다. Apify에서 실행되므로 브라우저에서 시도하거나 코드에서 호출할 수 있습니다.
이 게시물에서는 이 도구를 사용하는 세 가지 방법을 안내하겠습니다:
- URL에서 바로 깔끔한 웹 페이지 가져오기
- 원하는 필드를 가진 이미 가지고 있는 HTML 처리하기
- 기존에 사용하던 스크래퍼 뒤에 실행하거나 Python으로 실행하기
1. 링크를 JSON으로 한 번에 변환하기
Apify Store의 spruce_the_data에서 열고 입력을 JSON으로 전환하세요. 다음 내용을 붙여넣으세요:
{
"urls": [
"https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
...
Start를 클릭하세요. 페이지당 몇 초 후, Output 탭에 링크별로 한 줄씩 데이터가 나타납니다:
{
"index": 0,
"url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
...
두 번째 책은 `
<div class="job-card"><nav>Home > Jobs > Engineering</nav><h2 class="title">Senior Data Engineer</h2><div class="company">Northwind Analytics</div><span class="loc">Austin, TX (하이브리드, 사무실 출근 2일)</span><ul><li class="full-time">풀타임</li><li class="salary">$135k - $160k / year</li></ul><p>저희는 데이터 엔지니어를 채용하여 인제스션 파이프라인(ingestion pipelines)을 담당하게 할 것입니다.</p><div class="cookie">쿠키를 사용합니다. 동의하시겠습니까?</div></div>
정확도에 큰 차이를 만드는 몇 가지 사항:
- 필드 설명:
"ISO 4217 코드, 예: USD" 또는 "단순 숫자로 된 연간 금액"과 같이 필드를 설명하면 모델에게 원하는 형식을 정확히 알려줄 수 있습니다.
- 열거형(Enums) 사용:
work_mode와 같이 고정된 값의 집합에 대해서는 열거형을 사용하세요.
- Nullable 필드 설정: 값이 누락될 수 있는 경우 필드를 Nullable로 설정하세요 (
["number", "null"]). 이렇게 하면 추측하는 대신 "없음"이라고 말할 수 있습니다.
- 형식(Formats) 사용:
"format": "email", "uri", "date" 및 "phone"과 같은 형식을 사용하면 추출 후 검사가 이루어집니다. Nullable 필드가 이 검사에 실패하면 null로 반환되며, 어떤 값을 확인해야 하는지 알 수 있도록 droppedFields에 나열됩니다.
3. 스크래퍼 실행 후 또는 코드를 통해 가져오기
스크래퍼 체이닝(Chaining with a scraper). 이미 Apify에서 스크래퍼를 실행했다면, 해당 실행의 데이터셋 ID(dataset ID)를 복사하여 Source dataset ID에 붙여넣고, **Source dataset 내 텍스트 필드(Text field in the source dataset)**를 페이지 텍스트 또는 HTML을 담고 있는 필드(예: text 또는 html)로 설정하세요. 모든 항목이 스키마에 맞춰 정리됩니다. Apify의 통합 기능을 사용하면 스크래퍼가 완료될 때마다 자동으로 이를 트리거할 수 있습니다.
Python에서 가져오기. 클라이언트를 pip install apify-client (버전 3 이상)으로 설치한 다음, 다음 코드를 사용합니다:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN") # Apify 콘솔 > 설정 > API 및 통합
...
적합하지 않은 경우
미리 알려드리는 것이 좋습니다.
- 크롤러가 아닙니다. URL 모드는 단순 다운로드만 수행합니다. JavaScript를 통해 콘텐츠를 표시해야 하거나, 로그인이 필요하거나, 봇을 차단하는 페이지는 로드되지 않습니다. 그러한 경우에는 적절한 스크래퍼(scraper)를 먼저 실행하여 그 결과를 입력으로 제공하세요 (옵션 3).
- 페이지당 하나의 항목이 가장 좋습니다. 제품 하나, 채용 공고 하나, 목록 하나가 좋습니다. 긴 리스트 페이지도 작동하지만 느리고, 매우 긴 페이지는 메시지와 함께 거부됩니다.
- 페이지 내부의 링크 주소나 이미지 URL은 읽지 않고, 보이는 텍스트만 읽습니다.
- 항목을 한 번에 하나씩 처리합니다. 항목당 약 5초가 소요되므로, 대량 배치(big batches)는 시간이 오래 걸립니다.
가격 책정 (Pricing)
결과 건수별로 비용이 청구됩니다. 깨끗하게 반환된 항목에 대해서만 요금이 부과되며, 실패한 항목은 무료입니다. Apify free-plan 계정으로 실행할 경우, 테스트를 위해 한 번의 실행당 5개의 항목을 처리할 수 있습니다. 현재 가격은 Store 페이지에서 확인할 수 있습니다.
피드백 환영 (Feedback welcome)
이것은 새로운 도구이며 저는 적극적으로 개선하고 있습니다. 만약 이 도구를 사용하다가 잘못 처리되는 페이지를 발견했다면, 입력 데이터(개인 정보 제외)와 함께 Actor의 Issues 탭에서 이슈를 열어주세요. 이러한 보고서가 더 빠르게 개선될 수 있는 가장 좋은 방법입니다.