셀레니움 파이썬 웹 크롤러 프록시 적용 방법 및 트래픽 줄이기

Photo by Jack Blueberry on Unsplash

웹사이트로부터의 차단 피하기

지나치게 많은 요청을 보내거나 오랫동안 크롤링을 하면 서버에서 알아차리고 접근을 막아버리게 됩니다. 이 때 응답으로 429 Too Many Request를 보내거나 웹 페이지 내에서 캡차등을 띄우기도 합니다. 크롤러인것을 숨기려고 User-Agent를 지속적으로 바꾸거나 요청 보내는 빈도를 줄여도 결국 오랜 기간 크롤러를 운영하면 차단을 당합니다. 그래서 대안으로 프록시를 사용합니다.

셀레니움에서 유로 프록시 사용하기

유로 프록시 서비스의 경우 ID와 password 방식의 인증을 해야하는데, 셀레니움에서 크롬을 이용하는 경우에는 ID Password 방식을 사용하기 위해선 extension 기능을 이용해야 합니다. 자세한 방법은 아래 스택오버플로우 질문에 답이 있는데요.

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless=chrome")

셀레니움 트래픽 줄이기

셀레니움을 써야만 하는 경우에는 필연적으로 불필요한 리소스까지 가져오게 되므로, 더 많은 트래픽이 발생하게 됩니다. 특히 프록시 서비스의 경우 요청이나 트래픽 양을 기준으로 요금이 책정되다 보니, 비용을 줄이기 위해서라도 필요합니다.

selenium-wire

셀레니움은 기본적으로 특정 URL로 요청을 막는 등의 기능을 지원해주지 않습니다. selenium-wire를 사용하면 가능합니다.

from seleniumwire import webdriverdef intercept_youtube_request(request):
url = request.url.split("?")[0]
# font.static.com 으로 가는 요청 모두 중단
iㄹ "fonts.gstatic.com" in url:
request.abort()
driver = wd.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
# 트래픽을 줄이기 위해 일부 요청을 가로챈다.
driver.request_interceptor = func

(+내용추가) chrome extension으로 프록시를 사용하면 selenium-wire의 interceptor가 동작하지 않는 문제

이 경우 proxy chrome extension을 추가할 때 onBeforeRequest 리스너를 추가해서 특정 URL을 걸러낼 수 있습니다.

...
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
// 여기 위는 프록시 관련 코드들인데 아래에 추가하기
var blockingPatterns = ['.png', '.jpeg', '.jpg'];
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
const {
pathname
} = new URL(details.url);
for(var i in blockingPatterns) {
if(pathname.includes(blockingPatterns[i]))
return { cancel: true };
}
return { cancel: false };
},
{urls: ["<all_urls>"]},
["blocking"]
);

캐싱

셀레니움은 기본적으로 매 인스턴스마다 새로운 사용자 프로필을 생성하고 그곳에 캐시 데이터를 저장합니다. 매 URL마다 셀레니움 인스턴스를 생성하게 된다면 캐싱 효과를 받지 못하게 됩니다. 한 인스턴스에서 계속 URL을 바꿔가며 크롤링을 하면 좋겠지만 그렇지 않은 경우에는 프로필이 저장되는 디렉토리를 지정해서 이전 인스턴스의 프로필, 캐시를 다시 사용할 수 있습니다.

options.add_argument(“user-data-dir=” + DIR_NAME))

--

--

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
김희규

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.