디버깅의 필요성2
계속 차단되는 포인트가 뭘까.. 여러가지 시도를 해봤다. 일단 구글링과 StackOverflow를 뒤져가면서 알아낸 사실은
1. Selenium Webdriver의 Preference는 Runtime 중에 (Webdriver가 Instance로 만들어진 상태)는 변경할 수 없다.
2. Proxy IP 또한 마찬가지로 바꿀 수 없다.
Firefox의 경우 webdriver에서 about:config로 접속해서 바꿀 순 있긴 하지만, 영 찜찜..
1번의 경우는 header의 User-Agent 필드 값을 사전에 List로 정의해서 연결할 때마다 다른 User-Agent를 갖도록 위장하기 위해서 시도했었는데, Selenium을 사용하는 경우 불가능하다고 한다.
2번의 경우도 마찬가지, 크롤링하려는 페이지로 이동할때마다 IP 등을 다르게 요청하려 했지만, 한 번 Webdriver가 만들어진 이후에는 변경할 수 없다고 한다.
결론은, Selenium은 정말 필요한 곳에만 사용하고 나머지는 requests 모듈을 이용해서 구현, 그리고 적절한 딜레이가 필요하며... 결정적으로 Headless의 사용 여부가 Key인 듯 하다.
지금까지는 WSL 환경에서 테스트를 해왔는데, 디버깅할 때 눈으로 직접적으로 보기에는 힘들어도 Response를 출력해보면 상관없지 않나 싶어서 계속 Headless로 써왔다. 근데 예외없이 자꾸 크롤러가 멈췄다. 예기치 못한 Element 때문도 아니었고, 어디서 멈추는 것 인지 코드를 확인해보면 (driver.get(url)) 서버로부터의 차단이 의심되긴 하는데, Response를 찍기가 힘들었다. ( 사실 이전 포스팅에서 어떻게 찍었는지가 기억이 안...난다..)
어..?
그러다가 우연히 다른 카테고리의 제품 코드를 크롤링하는 코드에서 프로그램이 엉뚱하게 작동했는데,
Webdriver는 성공적으로 불러오는데 productIDs가 없어서 크롤링 로직을 시작하지 못하고 브라우저가 종료된다.
해당 제품의 코드를 확인해봤는데, 약간 다른 형식의 제품 코드가 존재했다. 아무래도 정규식이 문제구나 해서 정규식을 추가하고, 다시 돌리려다가... 이 현상이 뭔가 낯이 익었다. 이전에 UI 환경에서 테스트를 진행하는데 자꾸 Webdriver 구동 후 브라우저가 꺼져버리는 현상이 있었다. 이게 그 때문이었고, 정규식을 고쳐서 UI 환경에서 브라우저를 띄우고 진행하니 거짓말 처럼 완벽하게 크롤링은 진행이 됐다.
아... 그러면 차단되는 이유는 Headless가 명확한 듯 하다. Headless를 숨기는 방법은 정말 다양한데, (정확히는 사람처럼 보이는 방법) 서버에서 어떤 로직을 채택하고 있는지 알 수가 없으니 맨 땅에 헤딩하는 느낌... 해도해도 안된다면 XWindow를 띄우는 수 밖에..
사람인척
webdriver에서 디폴트 설정으로 패킷을 보내면 원래 채워져있어야 할 헤더들이 비어져 있다. 일부 서버에서는 이런 패턴을 보고 크롤러로 판단한다고 한다. 물론, 전부 그렇지는 않다. 이어지는 포스팅에서는 이 Header의 Field를 채우는 과정을 쓸 것이다.
'프로그래밍 > 크롤링(PYTHON)' 카테고리의 다른 글
Bot Detection / 크롤러 차단 / 크롤러 우회 #4 (END) (0) | 2019.03.20 |
---|---|
Bot Detection / 크롤러 차단 / 크롤러 우회 #3 (1) | 2019.03.17 |
Bot Detection / 크롤러 차단 / 크롤러 우회 #1 (2) | 2019.03.11 |
[190125] performance in selenium / 셀레니움에서 성능 향상과 관련하여 (4) | 2019.01.25 |
[190119] requests In Python (0) | 2019.01.19 |