[Crawler] 파이썬으로 크롤러 만들때 알야아할 것

🌟크롤링

🎯웹크롤러란?

자동으로 웹페이지를 돌아다니며 웹페이지에 포함된 각종 정보들 중 원하는 정보를 수집해오는 프로그램입니다. 크롤러를 사용하면 사람이 손으로 일일히 데이터를 가져오지 않아도 자동적으로 데이터를 수집할 수 있다는 장점이 있습니다. 하지만 한편으로는 개인정보를 긁어가는 등 악용의 여지가 있으니 사용에 주의를 기울여야합니다.

🎯크롤러 만들때 알아두면 좋은 Headless

selenium라는 브라우저 자동화툴을 이용하여 크롤링을 진행하는데 데이터만 필요하고 창을 직접적으로 볼 필요가 없을땐 어떻게 해야할까요? 이때 사용할 수 있는게 headless 옵션입니다. headless옵션을 사용하게 된다면 사용자에게는 창이 보이지않지만 브라우저를 조종하여 화면에 나타나는 데이터를 가져올 수 있습니다. 근데 사실 이렇게 데이터를 가져오는건 웹사이트 입장에서는 트래픽이 늘어나는거라서 달갑지 않을 수 있습니다. 그래서 일부 웹사이트는 headless 접근을 막아놓기도 하는데요. 이를 우회하기 위해선 다음의 사항들을 보완해주어야 합니다.

🎯Headless로 만들때 건드려야하는 것들

1. User-agent

브라우저는 지금 접근한 유저가 headless인지 아닌지를 user-agent를 통해 식별합니다. (user agent 값 안에 chrome이 아닌 headlesschrome으로 뜹니다.) 이는 user-agent 값을 바꾸어 줌으로써 해결할 수 있습니다.

ptions.add_argument("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36")

위의 코드를 통해 driver의 option으로 user-agent값을 headless가 아닌 일반 크롬 user agent값으로 바꾸어서 driver에 값으로 넘겨주어 식별을 피합니다.

2. Plugins 개수

브라우저 중 크롬은 브라우저 실행시 자동적으로 설치되는 플러그인이 있는데 headless는 이 플러그인란이 비어있습니다. 따라서 headless를 식별할 때 플러그인 설치여부를 확인하기도합니다. 이는 javascript로 플러그인을 가짜로 넣어주는걸로 해결할 수 있습니다.

driver.execute_script("Object.defineProperty(navigator, 'plugins', {get: function() {return[1, 2, 3];},});")

위의 코드를 이용하여 navigator 의 plugins 속성을 자바스크립트로 오버라이딩한 뒤 리스트를 리턴함으로서 플러그인 갯수를 가짜로 넘겨주면 plugin 개수로 headless를 판별할 수 없게됩니다.

3. 선호 언어

브라우저는 사용자가 자주 쓰는 언어를 선호언어로 등록해둡니다. 하지만 headless는 선호언어가 비어있어 식별기준이 될 수 있습니다. 이는 옵션으로 선호언어를 설정해줌으로서 해결할 수 있습니다.

options.add_argument("lang=ko_KR") 

참고 : https://beomi.github.io/2017/09/28/HowToMakeWebCrawler-Headless-Chrome/


Written by@이주형
平常心

GitHubFacebook