>백엔드 개발 >파이썬 튜토리얼 >Easy Guide에서 Python을 사용하여 Crunchbase를 긁는 방법)

Easy Guide에서 Python을 사용하여 Crunchbase를 긁는 방법)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-16 12:57:59308검색

Python 개발자는 훈련을 알고 있습니다. 신뢰할 수 있는 회사 데이터가 필요하며 Crunchbase가 이를 제공합니다. 이 가이드에서는 필요한 데이터를 얻는 효과적인 Crunchbase 스크레이퍼를 Python으로 구축하는 방법을 보여줍니다.

Crunchbase는 위치, 비즈니스 초점, 창립자, 투자 내역 등 중요한 세부정보를 추적합니다. 이렇게 큰 데이터 세트에서 수동으로 추출하는 것은 실용적이지 않습니다. 이 정보를 분석 가능한 형식으로 변환하려면 자동화가 필수적입니다.

이 블로그를 마치면서 Python용 Crawlee를 사용하여 Crunchbase에서 데이터를 추출하는 세 가지 방법을 살펴보겠습니다. 우리는 그 중 두 가지를 완전히 구현하고 세 번째의 세부 사항과 과제에 대해 논의할 것입니다. 이를 통해 올바른 데이터 소스를 올바르게 선택하는 것이 얼마나 중요한지 더 잘 이해할 수 있습니다.

참고: 이 가이드는 성장하는 커뮤니티의 개발자가 작성한 것입니다. Crawlee와 함께 흥미로운 프로젝트를 구축해 보셨나요? Discord에 가입하여 귀하의 경험과 블로그 아이디어를 공유하세요. 우리는 귀하와 같은 개발자의 기여를 소중하게 생각합니다.

우리가 다룰 주요 단계:

  1. 프로젝트 설정
  2. 데이터 소스 선택
  3. 사이트맵 기반 크롤러 구현
  4. 검색 기반 접근 방식의 분석과 한계
  5. 공식 API 크롤러 구현
  6. 결론 및 저장소 액세스

전제 조건

  • 파이썬 3.9 이상
  • 웹 스크래핑 개념 숙지
  • Python v0.5.0용 Crawlee
  • 시 v2.0 이상

프로젝트 설정

스크래핑을 시작하기 전에 프로젝트를 설정해야 합니다. 이 가이드에서는 크롤러 템플릿(Playwright 및 Beautifulsoup)을 사용하지 않으므로 프로젝트를 수동으로 설정하겠습니다.

  1. 시 설치

    pipx install poetry
    
  2. 프로젝트 폴더를 생성하고 탐색하세요.

    mkdir crunchbase-crawlee && cd crunchbase-crawlee
    
  3. Poetry를 사용하여 프로젝트를 초기화하고 모든 필드를 비워 둡니다.

    poetry init
    

    메시지가 표시되면:

    • '호환되는 Python 버전'의 경우 다음을 입력하세요: >={Python 버전},<4.0 (예를 들어 Python 3.10을 사용하는 경우 >=3.10,<4.0을 입력하세요.)
    • Enter를 눌러 다른 모든 필드를 비워 두세요
    • "yes"를 입력하여 세대를 확인하세요
  4. Poetry를 사용하여 프로젝트에 필요한 종속성과 함께 Crawlee를 추가하고 설치하세요.

    poetry add crawlee[parsel,curl-impersonate]
    
  5. Python 프로젝트용 Crawlee의 표준 파일 구조를 생성하여 프로젝트 설정을 완료합니다.

    mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
    

기본 프로젝트 구조를 설정한 후 Crunchbase에서 데이터를 얻는 다양한 방법을 탐색할 수 있습니다.

데이터 소스 선택

회사 페이지에서 직접 타겟 데이터를 추출할 수 있지만 사이트를 탐색하는 가장 좋은 방법을 선택해야 합니다.

Crunchbase의 구조를 주의 깊게 살펴보면 데이터를 얻는 데 세 가지 주요 옵션이 있음을 알 수 있습니다.

  1. 사이트맵 - 전체 사이트 순회를 위한 것입니다.
  2. 검색 - 타겟 데이터 수집을 위해
  3. 공식 API - 권장 방식

각 접근 방식을 자세히 살펴보겠습니다.

사이트맵과 Python용 Crawlee를 사용하여 Crunchbase 스크래핑

사이트맵은 Google, Ahrefs 및 기타 검색 엔진과 같은 크롤러에서 사용하는 표준 사이트 탐색 방법입니다. 모든 크롤러는 robots.txt에 설명된 규칙을 따라야 합니다.

Crunchbase의 사이트맵 구조를 살펴보겠습니다.

Sitemap first lvl

보시다시피 조직 페이지 링크는 gzip을 사용하여 압축된 2차 수준 Sitemap 파일 내에 있습니다.

이 파일 중 하나의 구조는 다음과 같습니다.

Sitemap second lvl

여기서 lastmod 필드가 특히 중요합니다. 이전 데이터 수집 이후 어떤 회사가 정보를 업데이트했는지 추적할 수 있습니다. 이는 정기적인 데이터 업데이트에 특히 유용합니다.

1. 스크래핑을 위한 크롤러 구성

사이트 작업을 위해 Safari 브라우저를 가장하는 CurlImpersonateHttpClient를 사용하겠습니다. 이 선택은 사이트맵 작업 시 예상치 못한 것처럼 보일 수 있지만 Crunchbase의 보호 기능에는 필요합니다.

그 이유는 Crunchbase가 Cloudflare를 사용하여 자동 액세스로부터 보호하기 때문입니다. 이는 회사 페이지의 트래픽을 분석할 때 명확하게 드러납니다.

Cloudflare Link

흥미로운 기능은 데이터가 포함된 문서를 로드한 후 Challenge.cloudflare가 실행된다는 것입니다. 이는 우리가 먼저 데이터를 받은 다음 JavaScript가 우리가 봇인지 확인한다는 것을 의미합니다. HTTP 클라이언트의 지문이 실제 브라우저와 충분히 유사하면 데이터를 성공적으로 수신할 수 있습니다.

Cloudflare는 사이트맵 수준에서도 트래픽을 분석합니다. 크롤러가 합법적이지 않은 것으로 보이면 액세스가 차단됩니다. 이것이 바로 우리가 실제 브라우저를 가장하는 이유입니다.

지나치게 공격적인 크롤링으로 인한 차단을 방지하기 위해 ConcurrencySettings를 구성하겠습니다.

이 접근 방식을 확장할 때는 프록시가 필요할 수 있습니다. 프록시 설정에 대한 자세한 내용은 설명서에서 확인할 수 있습니다.

스크래핑 결과는 JSON 형식으로 저장됩니다. 기본 크롤러 구성은 다음과 같습니다.

pipx install poetry

2. 사이트맵 탐색 구현

사이트맵 탐색은 두 단계로 이루어집니다. 첫 번째 단계에서는 조직 정보가 포함된 모든 파일 목록을 가져와야 합니다.

pipx install poetry

두 번째 단계에서는 gzip 형식으로 저장된 두 번째 수준 사이트맵 파일을 처리합니다. 먼저 데이터의 압축을 풀어야 하므로 특별한 접근 방식이 필요합니다.

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. 데이터 추출 및 저장

각 회사 페이지에는 많은 양의 정보가 포함되어 있습니다. 시연을 위해 회사 이름, 간략한 설명, 웹사이트, 위치 등 주요 필드에 중점을 두겠습니다.

Crunchbase의 장점 중 하나는 모든 데이터가 페이지 내에서 JSON 형식으로 저장된다는 것입니다.

Company Data

이렇게 하면 데이터 추출이 크게 단순화됩니다. 하나의 Xpath 선택기만 사용하여 JSON을 가져온 다음 jmespath를 적용하여 필요한 필드를 추출하면 됩니다.

poetry init

수집된 데이터는 context.push_data 메소드를 사용해 Python 내부 저장소용 Crawlee에 저장됩니다. 크롤러가 완료되면 수집된 모든 데이터를 JSON 파일로 내보냅니다.

poetry add crawlee[parsel,curl-impersonate]

4. 프로젝트 실행

모든 구성 요소가 준비되었으면 크롤러에 대한 진입점을 만들어야 합니다.

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

Poetry를 사용하여 크롤러 실행:

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')




<h3>
  
  
  5. 마지막으로 사이트맵 크롤러 사용의 특징
</h3>

<p>사이트맵 접근 방식에는 뚜렷한 장점과 한계가 있습니다. 다음과 같은 경우에 이상적입니다.</p>

<ul>
<li>플랫폼 내 모든 기업에 대한 데이터를 수집해야 할 때</li>
<li>특별한 기업 선정 기준이 없는 경우</li>
<li>시간과 컴퓨터 자원이 충분한 경우</li>
</ul>

<p>그러나 고려해야 할 중요한 제한 사항이 있습니다.</p>

<ul>
<li>수집 중 데이터 필터링 기능이 거의 없음</li>
<li>Cloudflare 블록에 대한 지속적인 모니터링 필요</li>
<li>솔루션을 확장하려면 프록시 서버가 필요하므로 프로젝트 비용이 증가합니다</li>
</ul>

<h2>
  
  
  Crunchbase 스크래핑을 위해 검색 사용
</h2>

<p>사이트맵 접근 방식의 한계로 인해 검색이 다음 솔루션이 될 수 있습니다. 그러나 Crunchbase는 공개 페이지에 비해 검색 기능에 더 엄격한 보안 조치를 적용합니다.</p>

<p>가장 큰 차이점은 Cloudflare 보호 작동 방식에 있습니다. 회사 페이지에 액세스할 때 Challenge.cloudflare 확인 전에 데이터를 수신하는 동안 검색 API에는 이 확인을 통과한 유효한 쿠키가 필요합니다.</p>

<p>이를 실제로 확인해 보겠습니다. 시크릿 모드에서 다음 링크를 엽니다:<br>
</p>

<pre class="brush:php;toolbar:false"># routes.py

from crawlee.crawlers import ParselCrawlingContext
from crawlee.router import Router
from crawlee import Request

router = Router[ParselCrawlingContext]()


@router.default_handler
async def default_handler(context: ParselCrawlingContext) -> None:
    """Default request handler."""
    context.log.info(f'default_handler processing {context.request} ...')

    requests = [
        Request.from_url(url, label='sitemap')
        for url in context.selector.xpath('//loc[contains(., "sitemap-organizations")]/text()').getall()
    ]

    # Since this is a tutorial, I don't want to upload more than one sitemap link
    await context.add_requests(requests, limit=1)

트래픽을 분석하면 다음과 같은 패턴을 볼 수 있습니다.

Search Protect

이벤트 순서는 다음과 같습니다.

  1. 먼저 코드 403으로 페이지가 차단되었습니다.
  2. 그런 다음 Challenge.cloudflare 검사가 수행됩니다
  3. 검사를 성공적으로 통과한 후에만 코드 200이 포함된 데이터를 수신합니다.

이 프로세스를 자동화하려면 Cloudflare Turnstile을 우회할 수 있는 헤드리스 브라우저가 필요합니다. Python용 Crawlee의 현재 버전(v0.5.0)은 향후 개발이 계획되어 있지만 이 기능을 제공하지 않습니다.

이 예에 따라 Camoufox를 통합하여 Python용 Crawlee의 기능을 확장할 수 있습니다.

공식 Crunchbase API로 작업하기

Crunchbase는 기본 기능을 갖춘 무료 API를 제공합니다. 유료 구독 사용자는 확장된 데이터 액세스 권한을 갖습니다. 사용 가능한 엔드포인트에 대한 전체 문서는 공식 API 사양에서 찾을 수 있습니다.

1. API 액세스 설정

API 작업을 시작하려면 다음 단계를 따르세요.

  1. Crunchbase 계정 만들기
  2. 통합 섹션으로 이동
  3. Crunchbase 기본 API 키 생성

문서에는 키 활성화에 최대 1시간이 걸릴 수 있다고 명시되어 있지만 일반적으로 키 생성 후 즉시 작동이 시작됩니다.

2. API 작업을 위한 크롤러 구성

중요한 API 기능은 제한입니다. 즉, 분당 요청이 200개를 넘을 수 없지만 무료 버전에서는 이 수가 훨씬 낮습니다. 이를 고려하여 ConcurrencySettings를 구성해 보겠습니다. 우리는 공식 API로 작업하고 있으므로 HTTP 클라이언트를 마스킹할 필요가 없습니다. 우리는 헤더가 미리 설정된 표준 'HttpxHttpClient'를 사용하겠습니다.

먼저 API 키를 환경 변수에 저장해 보겠습니다.

pipx install poetry

API 작업을 위한 크롤러 구성은 다음과 같습니다.

mkdir crunchbase-crawlee && cd crunchbase-crawlee

3. 검색결과 처리

API 작업을 위해서는 두 가지 주요 엔드포인트가 필요합니다.

  1. get_autocompletes - 검색용
  2. get_entities_organizations__entity_id - 데이터 가져오기

먼저 검색결과 처리를 구현해 보겠습니다.

poetry init

4. 회사 데이터 추출

회사 목록을 가져온 후 각 회사에 대한 자세한 정보를 추출합니다.

poetry add crawlee[parsel,curl-impersonate]

5. 고급 위치 기반 검색

보다 유연한 검색 기능이 필요한 경우 API가 특별한 검색 엔드포인트를 제공합니다. 다음은 프라하의 모든 회사를 검색하는 예입니다.

mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}

검색 결과 및 페이지 매김 처리를 위해 다음 핸들러를 사용합니다.

# main.py

from crawlee import ConcurrencySettings, HttpHeaders
from crawlee.crawlers import ParselCrawler
from crawlee.http_clients import CurlImpersonateHttpClient

from .routes import router


async def main() -> None:
    """The crawler entry point."""
    concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50)

    http_client = CurlImpersonateHttpClient(
        impersonate='safari17_0',
        headers=HttpHeaders(
            {
                'accept-language': 'en',
                'accept-encoding': 'gzip, deflate, br, zstd',
            }
        ),
    )
    crawler = ParselCrawler(
        request_handler=router,
        max_request_retries=1,
        concurrency_settings=concurrency_settings,
        http_client=http_client,
        max_requests_per_crawl=30,
    )

    await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml'])

    await crawler.export_data_json('crunchbase_data.json')

6. 마지막으로 무료 API 제한 사항

API 무료 버전에는 상당한 제한이 있습니다.

  • 사용 가능한 엔드포인트가 제한되어 있습니다
  • 자동 완성 기능은 회사 검색에만 작동합니다
  • 모든 데이터 필드에 접근할 수 있는 것은 아닙니다
  • 제한된 검색 필터링 기능

프로덕션 수준 작업의 경우 유료 구독을 고려해 보세요. API는 속도 제약에도 불구하고 Crunchbase 데이터에 액세스하는 가장 안정적인 방법을 제공합니다.

앞으로 나아갈 최선의 길은 무엇입니까?

Crunchbase에서 데이터를 얻는 세 가지 접근 방식을 살펴보았습니다.

  1. 사이트맵 - 대규모 데이터 수집용
  2. 검색 - Cloudflare 보호로 인해 자동화가 어려움
  3. 공식 API - 상업 프로젝트를 위한 가장 안정적인 솔루션

각 방법마다 장단점이 있지만 대부분의 프로젝트에서는 무료 버전의 한계에도 불구하고 공식 API를 사용하는 것이 좋습니다.

전체 소스 코드는 내 저장소에서 확인할 수 있습니다. 질문이 있거나 구현 세부 사항에 대해 논의하고 싶으십니까? Discord에 참여하세요. 개발자 커뮤니티가 도와드리겠습니다.

위 내용은 Easy Guide에서 Python을 사용하여 Crunchbase를 긁는 방법)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.