한달간 2개의 크롤링 작업을 하였는데, 41,000페이지를 크롤링하며 겪었던 경험을 정리해보고자 게시글 작성하게 되었습니다.
배운 점들
GPU뿐만 아니라 CPU 성능이 중요하고 항상 CPU의 가용성을 확보할 수 있도록 처리하는 것이 필요합니다.
수백개의 크롤링을 하면 잘 작동하던 파이썬 프로그램도 1,000 페이지가 넘어가면 고질적으로 에러가 나오는데, 많은 경우, CPU 가용성 부족에서 발생하였습니다. 이 부분은 웹 크롤링과 CPU 성능에서 좀 더 자세히 기술하겠습니다.
필요 이상으로 빈번한 요청을 보내지 않도록 주의하세요.
구글 스프레드시트에 DB를 정리하는 작업을 하는 경우, 빈빈한 API 요청시, 읽기, 쓰기 제한에 걸려 자주 전체 크롤링이 멈추었던 경험이 있습니다.
웹사이트 구조를 파악하는 것이 생각보다 오래 결렸습니다.
웹사이트 구조가 변경될 경우 선택자(selector)를 업데이트해야 할 수 있으니 주기적으로 확인하세요.
파이썬 선택자를 얼마나 잘 사용하는지에 따라 크롤링 성공 여부가 달랐습니다.
파이썬에서 선택자는 주로 웹 크롤링이나 웹 스크래핑을 할 때 HTML 문서에서 특정 요소를 선택하기 위해 사용됩니다. 선택자의 종류와 특징은 다음과 같습니다:
1. CSS 선택자
- 특징: CSS 선택자는 HTML 문서의 스타일링에 사용되는 선택자와 동일한 방식으로 요소를 선택합니다.
BeautifulSoup 라이브러리에서 select() 메서드를 사용하여 CSS 선택자를 활용할 수 있습니다. - 예시:
- 클래스 선택자:
.class-name - ID 선택자:
#id-name - 태그 선택자:
tag-name - 복합 선택자:
tag.class 또는 tag#id
2. XPath 선택자
- 특징: XPath는 XML 문서에서 노드를 탐색하기 위한 언어로, HTML 문서에서도 사용할 수 있습니다.
lxml 라이브러리와 함께 사용되며, 매우 강력하고 유연한 선택 방법을 제공합니다. - 예시:
- 절대 경로:
/html/body/div - 상대 경로:
//div[@class='class-name'] - 속성 선택:
//input[@type='text']
3. 태그 기반 선택자
- 특징:
BeautifulSoup의 기본 기능으로, HTML 태그 이름을 직접 사용하여 요소를 선택합니다. 이 방법은 간단하지만 복잡한 선택에는 적합하지 않을 수 있습니다. - 예시:
soup.find('div'): 첫 번째 div 태그를 찾음soup.find_all('a'): 모든 a 태그를 찾음
4. 정규 표현식
- 특징: 정규 표현식을 사용하여 태그 이름, 속성, 텍스트 등을 매칭하여 요소를 선택할 수 있습니다. 복잡한 패턴 매칭에 유용합니다.
- 예시:
soup.find_all('a', href=re.compile('^https://')): href 속성이 https://로 시작하는 모든 a 태그를 찾음
이러한 선택자들은 각각의 특징과 장점을 가지고 있어, 특정 상황에 맞게 적절한 선택자를 사용하여 효율적으로 원하는 데이터를 추출할 수 있습니다.
데이터 백업을 주기적으로 하는 것이 좋습니다.
사이트의 구조가 바뀌는 경우 처음부터 다시 해야하는 문제가 발생하였습니다. 데이터 백업은 항상 중요했습니다.
웹 크롤링과 CPU 성능
웹 크롤링에서 CPU 성능이 중요한 이유:
- 병렬 처리: 여러 페이지를 동시에 크롤링할 때 CPU 성능이 중요합니다.
- 데이터 처리: 크롤링한 데이터의 파싱, 정제, 분석 등에 CPU가 사용됩니다.
- 브라우저 에뮬레이션: Selenium 같은 도구를 사용할 때 브라우저 에뮬레이션에 CPU 리소스가 필요합니다.
- 네트워크 요청 처리: 많은 HTTP 요청을 처리할 때 CPU가 관여합니다.
웹 크롤링을 위한 CPU 권장 사양:
- 최소 듀얼 코어 프로세서, 가능하면 쿼드 코어 이상
- 클럭 속도 2.5GHz 이상
- 최신 세대의 프로세서 (예: Intel i5/i7 10세대 이상 또는 AMD Ryzen 5/7 3000 시리즈 이상)
CPU 사용량을 줄이기 위한 파이썬 조치 방법:
- 비동기 프로그래밍: asyncio와 aiohttp를 사용하여 I/O 작업을 최적화합니다.
- 멀티프로세싱: multiprocessing 라이브러리를 사용하여 여러 코어를 활용합니다.
- 효율적인 데이터 구조 사용: 리스트 대신 제너레이터를 사용하여 메모리 사용을 줄입니다.
- 캐싱: 이미 처리한 데이터를 저장하여 중복 작업을 줄입니다.
- 요청 제한: 동시 요청 수를 제한하여 CPU 부하를 관리합니다. 크롬 웹드라이브를 주기적으로 종료시켜 CPU를 확보해주세요.
- 코드 최적화: 비효율적인 루프나 연산을 개선합니다.
- 필요한 데이터만 처리: 불필요한 데이터 처리를 최소화합니다.
- 적절한 라이브러리 선택: lxml과 같은 빠른 파싱 라이브러리를 사용합니다.
이러한 방법들을 적용하면 CPU 사용량을 줄이고 크롤링 성능을 향상시킬 수 있습니다.Copy
크롤링 시 저작권 침해를 방지하는 방법은?
크롤링 시 저작권 침해를 방지하기 위해 고려해야 할 방법은 다음과 같습니다:
- 이용약관 및 로봇 배제 프로토콜(
robots.txt 파일) 확인: 웹사이트의 robots.txt 파일과 이용약관을 확인하여 크롤링이 허용되는지 여부를 파악해야 합니다. 이는 서비스 제공자가 크롤링을 허용하는 범위를 설정해 놓은 것이므로 이를 준수하는 것이 중요합니다. - 데이터베이스 권리(DB권) 준수: 데이터베이스 제작자의 권리를 침해하지 않도록 주의해야 합니다. 이는 허락 없이 데이터베이스의 전부 또는 상당한 부분을 복제하는 것을 피하는 것을 의미합니다. 데이터베이스의 규모와 제작자의 투자 등을 고려하여 DB권 침해 여부를 판단해야 합니다.
- 부정경쟁행위 방지: 타인의 상당한 투자나 노력으로 만들어진 성과를 무단으로 사용하여 경제적 이익을 침해하지 않도록 주의해야 합니다. 이는 공정한 상거래 관행이나 경쟁 질서를 반하지 않도록 조심해야 한다는 것을 의미합니다.
- 법적 책임 인식: 크롤링을 통해 수집한 데이터가 여러 법률에서 보호받고 있는지 확인하고, 법적 책임이 발생하지 않도록 주의해야 합니다. 데이터 수집 행위가 정보통신망 침입이나 부정경쟁행위로 평가되지 않도록 해야 합니다.
이러한 방법들을 통해 크롤링 시 저작권 침해를 방지할 수 있습니다.
고려해야 할 요소
- 데이터의 정확성과 반복성: 원하는 데이터가 많을수록 크롤링 시 데이터의 정확성을 유지하기 위해 반복적으로 데이터를 수집해야 할 수 있습니다. 이는 데이터의 최신성과 일관성을 보장하기 위함입니다.
- 웹사이트의 규제 정책: 각 웹사이트는 자동화 프로그램에 대한 규제를 명시하고 있습니다. 크롤링을 시도하기 전에 해당 웹사이트의 정책을 확인하여 크롤링이 허용되는지 파악해야 합니다.
- 데이터베이스 권리(DB권) 침해 여부: 크롤링을 통해 수집한 데이터가 데이터베이스 제작자의 권리를 침해하지 않는지 검토해야 합니다. 이는 DB의 전부 또는 상당한 부분이 허락 없이 복제되지 않았는지를 확인하는 것을 포함합니다.
주의해야 하는 사항
- 정보통신망 침해: 타인의 웹사이트나 앱에 크롤링 목적으로 접속하는 것이 정당한 권한 없이 정보통신망에 침입하는 행위로 평가될 수 있습니다. 따라서 서비스 제공자가 접근 권한을 제한하고 있는지 여부를 사전에 파악해야 합니다.
- 부정경쟁행위: 크롤링을 통해 타인의 상당한 투자나 노력으로 만들어진 성과를 무단으로 사용하여 경제적 이익을 침해하는 경우, 부정경쟁행위로 간주되어 민·형사적 문제가 발생할 수 있습니다.
- 로봇 배제 프로토콜 준수:
robots.txt 파일을 확인하여 크롤러가 접근 가능한 경로와 제한된 경로를 파악해야 합니다. 이는 웹사이트 소유자가 크롤러에게 어떤 페이지를 크롤링할 수 있는지 명시하는 역할을 합니다.