Are you a Robot?
구글을 웹 크롤링 및 웹 스크래핑을 하다보면 Are you a Robot과 마주치는 일이 잦아 진다. 이를 프로그램 적으로 우회하기 위하여 분석하던 도중 Cookie에 대하여 알아 보았다. 쿠키가 발급된 곳이 어디냐를 중요하게 구글 서버에서 확인하고 있었다.
분석 결과 쿠키는 다음의 2가지 로직을 통하여 만료가 되었다.
비정상 트래픽 발생
1. 정상 접근 시 유효시간 2시간 쿠키 발급
2. 다량의 비정상 트래픽 발생 시 쿠키 만료
3. Are you a Robot 테스트 통과
4. 유효시간 2시간 쿠키 발급
쿠키 발급 후 2시간 경과
1. 정상 접근 시 유효시간 2시간 쿠키 발급
2. 2시간 후 쿠키 만료
3. Are you a Robot 테스트 통과
4. 유효시간 2시간 쿠키 발급
아쉽게도 임의로 쿠키를 만들거나 수정하여 사용하게 되면 Are you a Robot과 마주치게 된다. 정상통신하여 발급된 쿠키 값을 구하여 Request Cookie 헤더에 넣어주어야 한다. 물론 구글 Cookie는 브라우저 정보를 혼합하여 작성되기 때문에 Request 헤더 작성 시 정상발급된 브라우저의 정보를 입력해주어야 한다.
구글은 다행히도 크롤링에 대하여 IP 차단을 직접적으로 하지않고 비정상 트래픽을 식별하여 정상 정보를 획득하지 못하도록 제어하는 것으로 확인된다.
내가 사용한 헤더 정보
# Python
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36',
'Cookie': 'GSP=A=kkBOvw:CPTS=1655786455:LM=1655786455:S=BXjRLCmgZenj_ytR; NID=511=Id4TpY2WOU0MzTIh6kRTX-EoX-kNgkL5MUqVbRY6yzrA8IdyPsi1cmAIIzBHUvPFGZSavg-Ar1bFOXecjRzGKLt1SfY2mCclnh8kR368fa0dcEeQPv7Bg7NMeeZoFdbpk9TOyYx4UgGT6OaT3-vK5njr0pDxEqqLBRSaLQ-at2M',
'Referer': 'https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=' + ''.join(
random.choice(string.ascii_letters) for i in range(5)),
'Sec-Ch-Ua': '"-Not.A/Brand";v="8", "Chromium";v="102"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"'
}
구글은 HTTP/2.X를 사용하기 때문에 Request에서 User-Agent 헤더를 사용하지 않는다 대신 Sec-Ch-Ua를 사용한다고 한다. 최대한 사람처럼 위장하기 위하여 이전 페이지 접속 정보인 Referer을 기존 URL에 랜덤값으로 붙여 주었다. 이렇게 하면 WEB UI 상에서 reCapther 시 난이도가 대폭 감소하는 것 같다.
또한 Are you a Robot을 회피하고자 페이지 8000건 이상을 수집하는데 6간이 소요 되었다. 만약 별도의 데이터 수집에 제약이 없는 서버라면 multiprocessing을 통하여 20분이면 수집 완료 했을 양이다.
구글의 Are you a Robot을 격파 하려면 정상쿠기가 발급 가능한 Request 헤더 세트를 브라우저 별로 마련을 해 놓고 본문페이지 단어가 Are you a Robot 이 뜨는 순간 Request 헤더 세트를 다른 것으로 변경하여 소모하는 방식으로 가야할 것 같다. 지금 생각나는 회피 방법은 이 정도 이다.
참고 - 브라우저 탐지 기법
https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent