본문 바로가기

프로그래밍/크롤링(PYTHON)

Crawler (Bot) Detection Avoid / 크롤러 탐지 우회

반응형

+ 2021-04-08 수정

지금은 당시 글 썼을 때와 좀 생각이 달라졌습니다.. 😅 당시에는 개인 서버라고는 운영해본 적도 없는 대학생이어서 크롤링이 안되면 되게 하는 방법으로 고민했는데, 하지말라는 것에는 다 이유가 있기 마련이네요.. 이제는 회사에서 서버를 담당하고 있는 입장에서 크롤링 시도들이 달갑게 느껴지지는 않기 때문에.. 차단을 우회하면서까지 하는 건 분명 문제가 있어보입니다.

당시에는 그런 고려조차 안했었네요. 글을 삭제하지는 않고 서두에 수정내용만 달아놓겠습니다 🙇‍♂️
피드백주신 분 감사드립니다 🙇‍♂️

 

긁어오기

처음 크롤러를 만들면서 생각한 건 오로지 성능이었다... 지난 포스팅들도 보면 그렇고 "Selenium은 상당히 느려서 어떻게하면 성능을 끌어올릴 수 있을까"가 초점이었는데, 막상 긁어오다보니 꼭 그런것 만은 아니었다. 웹 서버 관리자가 가만 둘리가 없었다. 무지막지한 속도로 자신의 웹서버 데이터를 긁어가는데 가만히 보고만 있는 관리자는 없을테니.. 그래서 각 웹페이지 호스트 도메인바로 아래있는 robots.txt 에 봇에의한 크롤링을 어느 범위정도로 허용 / 거절 하는지 기술해둔다. 뭐.. 대체로 어느정도 규모가 있는 사이트 들은 


User-Agent : *

Disallow /


라는 방식으로 가차없이 거절한다. 다만, 이 robots.txt는 우리는 이렇게 규칙을 정해뒀어~ 지켜줬으면 좋겠다. 라는 권고안이 므로 가차없이 위반해... 도 되는 것은 아니다. 저런 규약을 위반하고 크롤링을 하다보면 웹서버에 탐지되고 차단된다.

 

IP, User-Agent, Referer

온갖 우회방법을 찾아다니면서 내린 결론은 위의 세가지다. 물론 가장 원초적인 기준은 크롤링을 진행하는 속도겠지만, 이는 당연한 것이므로 배제하고, 웹 서버에서 지금 내 위를 기어다니고 있는 놈이 Bot인지 아닌지를 판단하는 또 다른 기준은 "이녀석이 사람같이 생겼나? 사람같이 행동하나?" 이다. 

 

첫 번째로 IP의 관점에서 보자.

하나의 IP로 계속해서 웹 페이지를 돌아다닌다. 30분, 1시간, 광고를 걸어둔 웹 서버 관리자 입장에선 아주 고마운 존재라고 생각할 수 도있지만, 뭔가 이상하다. 같은 IP로 5시간, 6시간 째 웹 서버 페이지의, 그것도 제품 목록과 제품 세부사항을 왔다갔다만 하고 있다. 분명 이상한 행동이다.

 

두 번째로 User-Agent의 관점

User-Agent의 경우 2가지 관점에서 볼 수 있다. IP와 같이 User를 식별하는 용도로 쓸 수 있지만.. 우리가 사용하는 Crawler의 경우 다른 독자적인 User-Agent를 사용한다. 바로 자신이 파이썬의 urllib임을 명시한다. (정확한 이름은 잘 기억이 안난다.) 웹서버 관리자 입장에서는 대놓고 이자식이 데이터를 긁어가고 있는 것을 알 수 있다. 이 또한 이상한 행동이다.

 

세 번째로 Referer의 관점

Referer는 User-Agent와 마찬가지로 HTTP request에 있는 header 내용이다. 지금 웹서버에 넣은 요청 이전에, 내가 어디로부터 왔는지에 대한 내용이 들어있다. 정상적인 사용자라면, 웹페이지의 호스트 도메인이 적혀져있거나 바로 이전 페이지의 url이 들어있겠지만, Bot의 경우 들어있지 않을 것이다. 관리자는 이자식도 Bot임을 의심할 수 있다.

 

바꾸면 돼요

해결책은 생각보다 간단하다. 그냥 바꾸면 된다. 다른 IP인 척, 다른 브라우저(User-Agent)인 척, 정말 웹페이지의 호스트 도메인으로부터 온 척 (Referer). 이제는 이에 대한 방법을 기술할텐데, 내가 사용한 환경은 다음과 같다.

Firefox 65.0

geckodriver 0.22

Firefox add-on : Referer control

 

IP를 바꾸는 방법

은 생각보다 다양한데, 나는 tor 브라우저를 이용하는 방법을 사용했다. 사용법은 다음 링크에 자세하게 기술되어 있다.

Selenium에서 임의의 ip로 크롤링하기

 

selenium에서 임의의 ip로 크롤링하기 (python, Ubuntu, Firefox)

selenium으로 크롤링을 하다보면 ip를 막아버리는 사이트도 있습니다. 이를 피하기 위해 Tor를 이용해, selenium에서 임의의 ip로 크롤링하는 방법에 대해서 작성했습니다.(Ubuntu, Firefox)

wkdtjsgur100.github.io

 

User-Agent를 바꾸는 방법

은 FirefoxProfile을 사용하면 된다.

 

firefox_profile = webdriver.FirefoxProfile()

firefox_profile.set_preference('general.useragent.override', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0')

self.driver = webdriver.Firefox(executable_path=".\geckodriver.exe", firefox_profile=firefox_profile)

firefox profile 을 설정해주면 된다. 음.. 가운데 라인의 set_preference의 경우 상당히 유용한 메소드로 구글에 찾아보면 설정할 수 있는 많은 key들을 찾을 수 있다. 이미지, css, cookie Disable 부터 위처럼 User-Agent 설정, ip 프록시등 많은 유용한 사용자 설정을 구현할 수 있게 해준다.

 

마지막으로 Referer을 바꾸는 방법

은.. Firefox 기준 Referer control이라는 extension을 사용하면 된다. 별도로 코드로 구현할 필요 없이, 

 

해당 extesion을 추가하고 crawler를 돌리는 환경의 firefox에서 referer 설정만 해주면 된다.

 

 

Referer control의 설정화면

extension이 설치되면 우측 상단 아이콘 지구본 모양을 누르고 위와 같은 설정화면으로 들어올 수 있는데, 아래 보이는 default referer for all other sites에서 Custom을 선택하고,

 

적절히 넣어주면 된다.

반응형