서버 측 블랙리스트 처리에 대응하는 방법
앞서 서버가 스크래핑 프로그램을 감지하고 대응하는 방법에 대해 설명하였고, 이번에는 스크래핑 프로그램이 서버에 감지되지 않는 몇가지 방법에 대해 알아보겠습니다.
1. 프록시 서버 및 IP 교체. 스크래핑 프로그램이 프록시 서버 및 IP를 여러번 교체하면 서버는 여러 사용자가 웹사이트를 탐색하는 것으로 착각할 것입니다. 요청과 스크래피(requests and scrapy)는 프록시를 교체하는 기능이 있는데 프록시를 교체 사용하면서 유의해야 할 사항은 다음과 같습니다.
- 무료로 제공되는 프록시 주소는 일반적으로 기간이 정해져 있습니다. 일정 기간이 지나면 연결 오류가 발생하기 시작합니다. 그래서 스크래핑을 할 때에는 프록시를 동적으로 사용해야 합니다. 프록시 여러개를 돌아가면서 사용하도록 프로그래밍 하거나 특정 API(프리미엄 프록시 서비스는 교체 기능을 제공함)를 사용해야 합니다.
- 몇몇 프록시 서버는 해당 프록시를 사용하고 있는지 확인 하기위해 (사용하는 실제 IP 주소를 확인 하기도 함) HTTP_X_FORWARDED_FOR 나 HTTP_VIA 또는 두가지 모두 헤더 필드값을 설정해 놓습니다. 그렇기 때문에 엘리트 프록시(헤더 설정값을 지정해 놓지 않는)를 사용하는 것이 좋습니다.
2. 유저 에이전트 속이기와 교체. 이 방법은 다른 사용자 에이전트(또는 여러 사용자 에이전트의 정보를 돌아가면서 사용)의 헤더 필드값을 전달하여 서버를 속이는 것입니다. 유저 에이전트를 식별하기 위해 어떤 웹사이트는 클라이언트 측 JS 메쏘드(method)를 사용하는데 그러면 서버를 속이려는 유저 에이전트가 작동하지 않을 수도 있습니다. 유저 에이전트의 IP 주소를 적절하게 교체하지 않으면 서버에 경고 시그널이 갈 수 있습니다.
3. 크롤링 속도 조절. 크롤링 동작(요청 생성, 데이터 입력, 요소 클릭 등) 사이에 불규칙하게 대기 시간을 설정합니다. 그러면 탐색 패턴이 모호해 지고 서버가 실제 사용자와 스크래퍼를 구분하기 어려워집니다.
스크래피(Scrapy)에는 스로틀링(throttling)을 구현하는 오토 스로틀(auto-throttle) 기능이 있습니다. 실제 사용자들이 웹을 사용하는 패턴을 구현하기 위한 기능이 많이 있습니다.
리다이랙션 및 캡챠(Captcha) 처리
요청(requests)과 같은 최신 라이브러리는 HTTP 리다이랙션을 관리하고 (히스토리 유지) 최종 페이지를 반환하는 방식으로 HTTP 리다이랙션을 이미 구현하였습니다. 스크래피(Scrapy)는 리다이랙션을 처리하기 위한 리다이랙션 미들웨어가 있습니다. 찾고자하는 데이터가 있는 페이지로 리다이랙션 되면 문제가 되지 않습니다. 그러나 캡챠(Captcha)페이지로 리다이랙션 되면 문제가 심각해집니다.
OCR을 사용하면 간단한 텍스트 기반 캡챠(Captcha)를 해결 할 수 있습니다(pytesseract라는 Python 라이브러리 이용). 간단한 텍스트 기반 캡챠(Captcha)는 고급 OCR 기술(딥 러닝 기반 등)로 처리가 가능하기 때문에, 기계가 처리하지 못하는 캡챠(Captcha) 이미지를 만드는 것이 관건이 되었습니다.
또한 캡챠(Captcha)를 해결하는 또 다른 방법은, 죽음의 보안 문자(Death by Captcha), 안티게이트(Antigate) 및 안티캡챠(Anti Captcha) 등의 API 서비스를 이용하는 것입니다. 어떤 서비스사는 캡챠(Captcha)를 해결하기 위해 사람을 고용하기도 합니다. 그러나 근본적으로, 프록시와 IP 교체 사용을 이용해 가능한 캡챠(Captcha)를 회피하는 것이 좋습니다.
iframe 태그와 구조화되지 않은 응답의 처리
iframe 태그에서 원하는 데이터를 다시 가져 오려면 올바른 URL을 요청하면 됩니다. 외부 페이지를 요청한 다음 iframe을 찾고 iframe의 src 속성(attribute)에 한번더 HTTP 요청을 해야합니다. 구조화되지 않은 HTML 또는 URL 패턴에 대해서는 복잡한 XPath 쿼리를 쓰고 regexes를 사용 하는것 외에 달리 해결 방법이 없습니다.
그외 유용한 스크래핑 도구와 라이브러리
다음과 같은 도구가 여러 상황에서 유용 할 수 있습니다.
- 신문: Newspaper3k는 기사 스크랩에 유용한 라이브러리입니다. 여러 언어를 지원하고 작성자 세부 정보, 게시 날짜와 같은 메타 정보를 얻는 API와 요약, 키워드, 저자 추출과 같은 NLP 기능을 제공합니다.
- PyAutoGUI: PyAutoGUI는 프로그래밍으로 키보드와 마우스를 제어 할 수있는 GUI 자동화 모듈입니다. PyAutoGUI가 제공하는 유용한 기능 중 하나는 화면에서 이미지를 찾는 것입니다.
- EditThisCookie 브라우저 확장 프로그램은 쿠키나 쿠키와 관련된 컨텐츠를 다룰 때 유용합니다.
- Cloudflare-Scrape : Cloudflare의 안티 봇 검사를 피하기 위해 이 모듈을 사용합니다. 파이썬으로 스크래핑을 하면 오픈 소스 또는 스택 오버플로(Stack Overflow)에서 스니펫(snippet) 형태로 제공되는 많은 기능을 이용할 수 있어 편리합니다.
- Tcpdump : tcpdump를 사용하여 두 요청 (스크래핑 프로그램이 전송하는 요청과 실제로 사이트를 탐색하는 브라우저가 전송하는 요청)의 헤더를 비교할 수 있습니다.
- Burp Suite: Burp Suite는 브라우저가 사이트에서 요청한 내용을 가로채서 이를 분석하는 데 유용합니다.
- Stem : TOR에서 python으로 요청을 생성하는 경우에 유용합니다.
연재를 마치면서
웹사이트를 스크래핑 하는데 예상되는 복잡한 경우, 가능한 해결 방법, 그리고 파이썬에서 사용할 수 있는 도구와 라이브러리를 살펴 보았습니다.
도입 부분에 언급한 바와 같이 스크래핑은 법의 회색영역에 있는 고양이와 쥐 게임과 같아 조심스럽게 수행하지 않으면 양쪽 모두에게 문제가 발생할 수 있습니다. 저작권을 침해하거나 정보를 남용하면 법적 분쟁에 휘말리게 됩니다.
스크래핑 프로그램은 웹사이트 소유자의 인덱싱/크롤링 의도를 전달받고 준수하도록 설계되어야 합니다. 웹 스크래핑 프로그램은 서버의 robots.txt 파일 지침을 따라야 합니다. robots.txt에 스크래핑이 허용되어 있더라도 스크래핑을 과도하게 수행하면 서버에 성능 문제나 리소스 부족 (오류 발생)을 야기 시킬 수 있습니다.
서버가 응답하는 데 시간이 오래 걸릴 경우를 대비해 백 오프 시간(back-off time)을 설정하는 것이 좋습니다. 또한 스크래핑 하기 전에 사이트 관리자에게 API나 데이터 덤프(data-dumps)에 대해 직접 허락을 받는 것도 좋은 방법입니다.
여기가지 총 4부에 걸쳐 파이썬(Python)으로 웹 스크래핑 하는 경우에 발생할 어려움, 해결 방법에 대해 알아 보았습니다. 파이썬(Python) 개발자를 위한 고급 웹 스크래핑에 대해 더 궁금하시다면, 스파이더킴 웹사이트를 방문해 보세요. 감사합니다!
Hozzászólások