웹사이트 크롤링 방법: Python, JavaScript로 크롤링하는 단계별 가이드와 2023년에 차단되지 않고 크롤링하는 12가지 팁

웹 크롤링이라는 모험적인 여정에 나서는 일은 짜릿하면서도 어려울 수 있습니다. 가치 있는 데이터를 찾아 인터넷의 복잡한 골목길을 헤쳐 나가야 하기 때문입니다. 광활한 디지털 세계에서 웹 크롤링 기술은 핵심 역량으로 부상했습니다. 이를 통해 정보를 효율적으로 수집하고, 통찰력을 얻으며, 끊임없이 확장되는 월드 와이드 웹을 이해할 수 있습니다.

이 유익한 글에서는 웹 크롤링의 복잡한 지형을 살펴보며 웹 크롤링과 웹 스크래핑의 차이를 알아보고, 웹 크롤링 실력을 한 단계 끌어올릴 다양한 전략과 기술을 살펴봅니다.

역동적인 JavaScript 웹사이트부터 강력하면서도 간편한 Python까지, 웹 크롤링 여정을 원활하고 효과적이며 막힘없이 진행할 수 있도록 다양한 팁과 기법을 안내해 드리겠습니다.

목차

그럼 안전벨트를 매고, 매력적인 웹 크롤링의 세계로 떠나는 흥미진진한 여정을 준비해 보세요!

웹 크롤링과 웹 스크래핑의 차이

웹 스크래핑과 웹 크롤링은 흔히 같은 것으로 여겨지며, 둘 다 데이터 마이닝에 사용되지만 중요한 차이점이 있습니다. 이러한 차이를 살펴보고 어떤 접근 방식이 여러분의 필요와 비즈니스 목표에 가장 적합한지 알아보겠습니다.

주요 차이점

간단히 말해, 웹 크롤링은 검색 엔진이 하는 일입니다. 웹을 탐색하며 이용 가능한 정보를 찾고, 접근 가능한 모든 링크를 따라갑니다. 이 일반적인 과정의 목적은 특정 웹사이트에서 가능한 한 많은 정보(또는 모든 정보)를 수집하는 것입니다. 기본적으로 Google이 하는 일과 같습니다. 웹페이지 전체를 살펴보고 이용 가능한 모든 데이터를 색인화합니다.

반면, 수집한 정보를 다운로드하려는 경우에는 웹 스크래핑을 사용합니다. 웹 스크래핑(웹 데이터 추출이라고도 함)은 좀 더 구체적인 과정입니다. 명령을 맞춤 설정하고 스크래핑 프록시를 활용하면 대상 웹사이트에서 특정 데이터를 추출할 수 있습니다. 그런 다음 JSON이나 Excel처럼 적절한 형식으로 결과를 다운로드할 수 있습니다.

경우에 따라 하나의 목표를 달성하기 위해 웹 크롤링과 웹 스크래핑을 모두 사용할 수 있으며, 사실상 작업 과정의 1단계와 2단계로 기능합니다. 두 가지를 결합하면 크롤러로 주요 웹사이트에서 방대한 양의 정보를 수집한 다음, 스크래퍼로 필요한 특정 데이터를 추출하고 다운로드할 수 있습니다.

웹 크롤링 전략 4가지

일반적으로 웹 크롤러는 크롤링 예산에 따라 웹페이지의 일부만 방문합니다. 크롤링 예산은 도메인당 최대 페이지 수, 깊이 또는 기간과 같은 요소로 정할 수 있습니다.

많은 웹사이트는 사이트에서 크롤링할 수 있는 부분과 접근이 금지된 부분을 명시하는 robots.txt 파일을 제공합니다. 또한 robots.txt보다 더 상세한 sitemap.xml도 있습니다. 이 파일은 봇이 크롤링할 경로를 안내하고 각 URL에 대한 추가 메타데이터를 제공합니다.

웹 크롤러의 일반적인 용도는 다음과 같습니다.

  1. Googlebot, Bingbot, Yandex Bot과 같은 검색 엔진은 웹의 상당 부분에서 HTML을 수집하고, 데이터를 색인화하여 쉽게 검색할 수 있도록 합니다.
  2. SEO 분석 도구는 HTML뿐만 아니라 응답 시간 및 응답 상태와 같은 메타데이터도 수집하여 손상된 페이지를 찾아내고 백링크 분석을 위해 도메인 간의 링크를 추적합니다.
  3. 가격 모니터링 도구는 전자상거래 웹사이트를 크롤링하여 제품 페이지를 찾고 메타데이터, 특히 가격을 추출합니다. 그런 다음 이러한 제품 페이지를 주기적으로 다시 방문합니다.
  4. Common Crawl은 34억 5천만 개의 웹페이지가 포함된 2022년 5월 아카이브와 같은 웹 크롤링 데이터 공개 저장소를 관리합니다.

JavaScript 웹사이트 크롤링 방법

JavaScript 웹사이트는 콘텐츠가 JavaScript 코드로 로드되고 조작되는 경우가 많기 때문에 정적 HTML 페이지보다 크롤링하기 어려울 수 있습니다. 이러한 웹사이트를 크롤링하려면 JavaScript를 실행하고 페이지 콘텐츠를 렌더링할 수 있는 헤드리스 브라우저를 사용해야 합니다. 이 작업에 널리 사용되는 방법 중 하나는 Puppeteer 라이브러리와 Node.js 런타임 환경을 함께 사용하는 것입니다.

Puppeteer와 Node.js를 사용해 JavaScript 웹사이트를 크롤링하는 단계별 가이드는 다음과 같습니다.

1. Node.js 설치

공식 웹사이트(https://nodejs.org/)에서 최신 버전의 Node.js를 다운로드하여 설치합니다.

2. 새 프로젝트 디렉터리 만들기

프로젝트용 디렉터리를 새로 만들고 명령줄을 사용해 해당 디렉터리로 이동합니다.

mkdir js-crawler cd js-crawler

3. 새 Node.js 프로젝트 초기화

프로젝트 디렉터리에서 다음 명령을 실행해 기본 설정으로 새 package.json 파일을 만듭니다.

npm init -y

4. Puppeteer 설치

프로젝트 디렉터리에서 다음 명령을 실행해 Puppeteer를 설치합니다.

npm install puppeteer

5. 새 JavaScript 파일 만들기

새 파일을 만듭니다.

crawler.js

이 파일은 프로젝트 디렉터리에 만들며, JavaScript 웹사이트를 크롤링하는 코드가 들어갑니다.

6. 크롤러 코드 작성

다음을 엽니다.

crawler.js

그런 다음 다음 코드를 추가합니다.

const puppeteer = require('puppeteer');async function crawlJavaScriptWebsite(url) {

새 브라우저 인스턴스를 실행합니다.

constbrowser =awaitpuppeteer.launch({headless:true});

브라우저에서 새 페이지를 만듭니다.

constpage =awaitbrowser.newPage();

대상 URL로 이동합니다.

awaitpage.goto(url, {waitUntil:'networkidle2'})

페이지에서 데이터를 추출하려면

evaluate()constdata =awaitpage.evaluate(() =>{

필요한 데이터를 추출하는 사용자 지정 JavaScript 코드를 작성합니다. 예를 들어 페이지의 모든 제목(h1 요소)을 추출해 보겠습니다.

constheadings =Array.from(document.querySelectorAll('h1')).map(heading=>heading.textContent);return{ headings, }; });

브라우저를 닫습니다.

awaitbrowser.close();

추출한 데이터를 반환합니다.

returndata; }

사용 예시:

crawlJavaScriptWebsite('https://example.com/') .then(data=>console.log(data)) .catch(err=>console.error(err));

다음의

https://example.com/

URL을 대상 웹사이트 URL로 바꾸고, 필요한 데이터를 추출하도록

page.evaluate()

함수를 맞춤 설정합니다.

7. 크롤러 실행

프로젝트 디렉터리에서 다음 명령을 실행해 크롤러를 실행합니다.

node crawler.js

스크립트가 헤드리스 브라우저를 실행하고 대상 URL로 이동한 다음

page.evaluate()

함수에 지정된 JavaScript 코드를 실행합니다. 추출한 데이터는 콘솔에 출력됩니다.

이는 JavaScript 웹사이트를 크롤링하는 기본적인 예시입니다. 더 복잡한 사용 사례에서는 페이지와 상호작용하거나, AJAX 요청을 처리하거나, 페이지를 스크롤하거나, CAPTCHA와 쿠키를 처리해야 할 수도 있습니다.

Python으로 웹 크롤링하는 방법

Python으로 웹사이트를 크롤링하려면 웹페이지를 가져오고, 콘텐츠를 파싱한 다음, 다른 페이지로 연결되는 링크를 따라가야 합니다. 이 가이드에서는 널리 사용되는 Python 라이브러리인 Requests와 Beautiful Soup을 사용합니다. 이 가이드는 Python이 설치되어 있고 Python 프로그래밍에 대한 기본적인 이해가 있다고 가정합니다.

1단계: 필요한 라이브러리 설치

pip를 사용하여 Requests 및 Beautiful Soup 라이브러리를 설치합니다.

pip install requests beautifulsoup4

2단계: 라이브러리 가져오기

Python 스크립트에서 필요한 라이브러리를 가져옵니다.

importrequests frombs4importBeautifulSoup

3단계: 웹페이지 콘텐츠를 가져오는 함수 만들기

Requests 라이브러리를 사용하여 웹페이지 콘텐츠를 가져오는 함수를 만듭니다.

deffetch_page(url):response = requests.get(url)ifresponse.status_code ==200:returnresponse.text else:print(f"Failed to fetch{url}(status code{response.status_code})")returnNone

4단계: 웹페이지 콘텐츠를 파싱하는 함수 만들기

Beautiful Soup 라이브러리를 사용하여 웹페이지 콘텐츠를 파싱하는 함수를 만듭니다.

defparse_page(html): soup = BeautifulSoup(html,"html.parser")returnsoup

5단계: 파싱된 콘텐츠에서 링크를 추출하는 함수 만들기

파싱된 웹페이지 콘텐츠에서 모든 링크를 추출하는 함수를 만듭니다.

defextract_links(soup, base_url):links = []fora_taginsoup.find_all("a"):href = a_tag.get("href")ifhrefandnothref.startswith("#"):ifnothref.startswith("http"):href = base_url + href links.append(href)returnlinks

6단계: 웹사이트를 크롤링하는 함수 만들기

웹사이트를 재귀적으로 크롤링하는 함수를 만듭니다.

defcrawl_website(url, max_depth=2, depth=0):ifdepth > max_depth:return html = fetch_page(url)ifnothtml:return soup = parse_page(html)links = extract_links(soup, url)print(f"{' ' * depth}[{depth}]{url}")forlinkinlinks:crawl_website(link, max_depth, depth +1)

7단계: 크롤러 실행

다음 함수를 호출하여 크롤러를 실행합니다.

crawl_website

원하는 URL과 최대 깊이를 지정합니다.

if__name__ =="__main__":start_url ="https://example.com/"max_depth =2 crawl_website(start_url, max_depth)

이 단계별 가이드에서는 Python을 사용하여 웹사이트를 크롤링하는 방법을 보여줍니다. 다음 함수를 원하는 대로 수정하여

crawl_website

특정 웹사이트 구조를 처리하고, 추출한 정보를 저장하는 로직을 추가하거나, robots.txt 처리, 요청 속도 제한 또는 요청 병렬화와 같은 고급 크롤링 기능을 구현할 수 있습니다.

차단당하지 않고 웹사이트를 크롤링하는 12가지 팁

차단을 당하지 않고 웹 크롤링을 하기 위한 주요 전략은 다음과 같습니다.

#1: 로봇 배제 프로토콜 확인하기

웹사이트를 크롤링하거나 스크래핑하기 전에 대상 웹사이트가 페이지에서 데이터 수집을 허용하는지 확인하세요. 웹사이트의 로봇 배제 프로토콜(robots.txt) 파일을 살펴보고 웹사이트의 규정을 준수하세요.

웹사이트가 크롤링을 허용하더라도 사이트에 피해를 주지 않도록 주의하세요. 로봇 배제 프로토콜에 명시된 규정을 준수하고, 이용량이 적은 시간대에 크롤링하며, 단일 IP 주소에서 발생하는 요청 수를 제한하고, 요청 간 지연 시간을 설정하세요.

하지만 웹사이트가 웹 스크래핑을 허용하더라도 차단당할 수 있으므로 추가 단계도 따르는 것이 중요합니다. 자세한 내용은 웹 스크래핑 Python 튜토리얼을 참조하세요.

#2: 프록시 서버 이용하기

프록시 없이는 웹 크롤링이 거의 불가능합니다. 평판이 좋은 프록시 서비스 제공업체를 선택하고 작업에 따라 데이터센터 프록시와 주거용 IP 프록시 중에서 고르세요.

기기와 대상 웹사이트 사이에 중개자를 두면 IP 주소가 차단될 가능성이 줄어들고, 익명성이 보장되며, 해당 지역에서 이용할 수 없는 웹사이트에 접속할 수 있습니다. 예를 들어 독일에 있다면 미국의 웹 콘텐츠에 접속하기 위해 미국 프록시를 이용해야 할 수 있습니다.

최상의 결과를 얻으려면 IP 풀이 크고 다양한 위치를 제공하는 프록시 제공업체를 선택하세요.

#3: IP 주소 순환하기

프록시 풀을 사용할 때는 IP 주소를 순환하는 것이 중요합니다.

동일한 IP 주소에서 너무 많은 요청을 보내면 대상 웹사이트는 곧 사용자를 위협으로 인식하고 IP 주소를 차단합니다. 프록시 순환을 이용하면 여러 인터넷 사용자인 것처럼 보일 수 있어 차단될 가능성이 줄어듭니다.

Oxylabs 주거용 프록시는 모두 IP를 순환하지만, 데이터센터 프록시를 사용한다면 프록시 로테이터 서비스를 이용해야 합니다. IPv6 및 IPv4 프록시도 순환합니다. IPv4와 IPv6의 차이점에 관심이 있다면 동료 Iveta가 작성한 기사를 읽어보세요.

#4: 실제 사용자 에이전트 사용하기

웹사이트를 호스팅하는 대부분의 서버는 크롤링 봇이 생성하는 HTTP 요청의 헤더를 검사할 수 있습니다. 사용자 에이전트라고 하는 이 HTTP 요청 헤더에는 운영 체제와 소프트웨어부터 애플리케이션 유형과 버전에 이르기까지 다양한 정보가 포함됩니다.

서버는 의심스러운 사용자 에이전트를 쉽게 감지할 수 있습니다. 실제 사용자 에이전트에는 자연 방문자가 보내는 일반적인 HTTP 요청 구성이 포함됩니다. 차단을 피하려면 사용자 에이전트를 자연스러운 사용자 에이전트처럼 보이도록 맞춤 설정하세요.

웹 브라우저에서 보내는 각 요청에는 사용자 에이전트가 포함되므로 사용자 에이전트를 자주 바꿔야 합니다.

최신 버전이면서 가장 널리 사용되는 사용자 에이전트를 사용하는 것도 중요합니다. 지원되지 않는 Firefox 버전의 5년 된 사용자 에이전트로 요청을 보내면 많은 의심을 살 수 있습니다. 인터넷에서 현재 가장 널리 사용되는 사용자 에이전트를 보여주는 공개 데이터베이스를 찾을 수 있습니다. 정기적으로 업데이트되는 자체 데이터베이스도 있으니 이용이 필요하면 문의하세요.

#5: 지문을 올바르게 설정하기

스크래핑 방지 메커니즘이 점점 더 정교해지고 있으며, 일부 웹사이트는 봇을 감지하기 위해 전송 제어 프로토콜(TCP) 또는 IP 지문 인식을 사용합니다.

웹을 스크래핑하면 TCP에 다양한 매개변수가 남습니다. 이러한 매개변수는 최종 사용자의 운영 체제나 기기에 따라 설정됩니다. 스크래핑 중 블랙리스트에 오르지 않는 방법이 궁금하다면 매개변수가 일관적인지 확인하세요. 또는 동적 지문 인식 기능을 갖춘 AI 기반 프록시 솔루션인 Web Unblocker를 사용할 수 있습니다. Web Unblocker는 여러 지문 인식 변수를 결합하므로 가장 효과적인 지문 하나를 식별하더라도 지문이 무작위처럼 보이며 봇 방지 검사를 통과할 수 있습니다.

#6: 허니팟 함정 주의하기

허니팟 함정은 HTML 코드에 포함된 링크로, 웹 스크래퍼는 감지할 수 있지만 자연 사용자는 볼 수 없습니다. 이러한 함정은 로봇만 링크를 따라간다는 점을 이용해 웹 크롤러를 식별하고 차단하는 데 사용됩니다. 허니팟을 설정하려면 많은 작업이 필요하지만, 일부 대상 웹사이트는 이를 사용해 웹 크롤러를 감지할 수 있으므로 요청이 차단되고 크롤러가 감지되었다는 메시지가 표시되면 주의하세요.

#7: CAPTCHA 해결 서비스 이용하기

CAPTCHA는 방문자에게 인간임을 확인하기 위해 퍼즐을 풀도록 요구하므로 웹 크롤링에 큰 어려움을 줍니다. 이 퍼즐에는 컴퓨터가 해독하기 어려운 이미지가 자주 포함됩니다. CAPTCHA를 우회하려면 전용 CAPTCHA 해결 서비스나 CAPTCHA를 해결하고 바로 사용할 수 있는 결과를 제공하는 Oxylabs의 데이터 크롤링 도구와 같은 즉시 사용 가능한 크롤링 도구를 이용하세요. 의심스러운 행동으로 인해 대상 웹사이트에서 CAPTCHA 해결을 요구할 수 있습니다.

#8: 크롤링 패턴 변경하기

차단을 피하려면 크롤러의 탐색 패턴을 수정해 예측하기 어렵게 만드세요. 일반 사용자의 브라우징 행동을 모방하도록 무작위 클릭, 스크롤, 마우스 움직임을 추가할 수 있습니다. 모범 사례를 위해 일반 사용자가 웹사이트를 어떻게 탐색할지 생각해 보고 그 원칙을 도구에 적용하세요. 예를 들어 내부 페이지를 요청하기 전에 홈페이지를 방문하는 것은 자연스러운 패턴입니다.

#9: 스크래퍼 속도 낮추기

차단될 위험을 줄이려면 요청 사이에 무작위로 휴식 시간을 추가하거나 작업을 수행하기 전에 대기 명령을 실행해 스크래퍼 속도를 늦추세요. URL에 요청 속도 제한이 적용된다면 웹사이트의 제한을 준수하고 요청이 제한되지 않도록 스크래핑 속도를 낮추세요.

#10: 이용량이 적은 시간대에 크롤링하기

크롤러는 일반 사용자보다 빠르게 움직이며 서버 부하에 큰 영향을 미칠 수 있습니다. 부하가 높은 시간대에 크롤링하면 서비스가 느려져 사용자 경험에 부정적인 영향을 줄 수 있습니다. 이를 방지하려면 자정 직후와 같이 서버 부하가 줄어드는 이용량이 적은 시간대에 크롤링하세요(서비스의 현지 시간 기준).

#11: 이미지 스크래핑 피하기

이미지는 데이터 용량이 큰 경우가 많고 저작권으로 보호될 수 있으므로 이미지 스크래핑은 위험할 수 있습니다. 또한 이미지는 JavaScript 요소 안에 숨겨져 있는 경우가 많아 스크래핑 과정이 복잡해지고 웹 스크래퍼 속도가 느려질 수 있습니다. JS 요소에서 이미지를 추출하려면 더 복잡한 스크래핑 절차를 사용해야 합니다.

#12: 헤드리스 브라우저 사용하기

헤드리스 브라우저는 그래픽 사용자 인터페이스 없이 일반 브라우저처럼 작동하는 도구입니다. JavaScript 요소를 렌더링해 로드되는 콘텐츠를 스크래핑할 수 있습니다. 가장 널리 사용되는 브라우저인 Chrome과 Firefox에는 차단을 유발하지 않고 웹 스크래핑에 사용할 수 있는 헤드리스 모드가 있습니다.

웹사이트 크롤링 방법 동영상 튜토리얼

Oxylabs 튜토리얼에서는 웹 크롤링의 기본 사항과 데이터 수집에서의 중요성을 알아보고, 윤리적·법적 측면도 살펴봅니다. Scrapy, Beautiful Soup, Selenium과 같은 인기 도구를 소개하고 필요에 가장 적합한 도구를 선택하는 데 도움을 줍니다.

이 튜토리얼을 통해 웹사이트의 구조를 파악하고, 간단한 웹 크롤러를 만들고, 필요한 정보를 추출하는 방법을 익힐 수 있습니다. 또한 robots.txt 규칙을 준수하고 서버에 과도한 부하를 주지 않는 등 바람직한 웹 스크래핑 예절을 지키도록 안내합니다.

동영상에서는 동적 페이지에서 데이터를 가져오거나 여러 페이지를 처리하고 차단을 피하는 등의 어려움에 대처하는 방법도 알려줍니다. 데이터를 저장하고 정리하는 방법을 보여주며, 웹 크롤링 프로젝트를 더 큰 규모로 확장하고 효율성을 높이는 팁도 제공합니다. 마지막으로 언제나 윤리적·법적 지침을 준수해야 한다는 점을 강조합니다.

결론

웹 크롤링의 세계를 신나게 탐험하는 여정을 마무리하며, 이 기술을 숙달하는 것은 광활하고 끊임없이 변화하는 인터넷 세상에서 보물 지도를 손에 넣는 것과 같다는 사실이 분명해집니다. 웹 크롤링과 웹 스크래핑을 구분하는 복잡한 요소를 살펴보고, 다양한 전략을 알아보았으며, JavaScript 웹사이트와 Python 기반 웹 크롤링의 역동적인 세계도 탐험했습니다.

풍부한 팁과 조언을 바탕으로 하면 웹 크롤링을 책임감 있고 윤리적으로 수행하고, 그 과정에서 생길 수 있는 함정과 장애물을 피할 수 있습니다. 그러니 이 종합적인 글을 통해 얻은 지식과 지혜를 바탕으로 끝없이 펼쳐진 디지털 바다로 항해를 떠나 보세요. 웹 크롤링의 힘을 활용하는 능력은 경쟁에서 앞서 나가게 하고 디지털 세계의 깊은 곳에 숨겨진 보물을 발견하게 해준다는 점을 잊지 마세요.