프로그래밍/Crawling

[Python] 페이지 요청 보낼 때 가상의 유저 만들기 - fake_useragent

seojeon9 2024. 3. 27. 08:49

 

크롤러를 개발하다 보면 가장 중요한 부분은 불법 요청자로 판별되어 차단을 당하지 않는 것이다.

해당 웹 서버에 부담이 되는 많은 요청은 지양을 하는 것이 좋지만, 비즈니스를 위해 필요할 경우가 많다.

 

그럴 경우에 사용할 수 있는 방법 하나를 공유하고자 한다.

User-Agent란

유저 에이전트는 웹 크롤러와 같은 웹 클라이언트가 서버에 HTTP 요청을 보낼 때 함께 보내는 정보이다.
해당 요청이 어떤 종류의 소프트웨어나 애플리케이션에서 온 것인지를 식별하기 위해 사용하고, 적합한 응답을 제공한다.

  • 브라우저의 종류와 버전 : 예) Chrome/94.0.4606.81 등
  • 운영체제 정보 : 예) windows10, macOS, Linux 등
  • 디자이스 종류 : 모바일 장치인지 데스크톱 컴퓨터인지 식별

유저 에이전트를 변경하여 서버에 요청을 보낸 클라이언트가 사람이 아닌 프로그램임을 감출 수 있다.

 

fake-useragent

Python에서는 웹 크롤링이나 웹 스크래핑 등을 할 때 유저 에어전트를 손쉽게 생성하기 위한 라이브러리를 제공한다.

 

fake-useragent

Up-to-date simple useragent faker with real world database

pypi.org

  • 다양한 유저 에어전트 문자열을 생성할 수 있다
  • 다양한 브라우저 및 디바이스를 지원한다
  • 랜덤 하거나 특정한 유저 에이전트를 생성한다.

1. 설치하기

위에 안내한 라이브러리를 설치한다.

pip install fake-useragent

 

2. 사용하기

from fake_useragent import UserAgent

# 유저 에어전트 객체 생성
ua = UserAgent()

# 랜덤한 유저 에이전트 생성
random_ua = ua.random
print(random_ua)

만약 특정한 플랫폼이나 브라우저에 대한 유저 에이전트를 얻고자 한다면 다음과 같이 메서드를 호출할 수도 있다.

firefox_ua = ua.firefox
chrome_ua = ua.chrome
safari_ua = ua.safari
ie_ua = ua.ie
opera_ua = ua.opera

 

웹 서버에 요청을 보낼 때 헤더에서 유저 에이전트를 가져올 수도 있다.

headers = {
    'User-Agent': ua.random
}

이렇게 fake_useragent를 사용하여 사람처럼 보이는 요청을 보낼 수 있다.

 

3. 응용하기

fake_useragent는 다양한 브라우저를 지원하는데 개중에 인터넷익스플로어도 있다.

나의 경우에 특정 서비스를 스크래핑을 시도했는데, 일부 요청에서 이상한 응답이 반환되었다.

확인해 보니 웹 사이트를 개편하면서 인터넷익스플로어 지원을 멈춘 것이었다!

이때 브라우저를 특정해서 유저 에이전트를 생성하면 올바른 응답을 받을 수 있다.

from fake_useragent import UserAgent

def create_fake_useragnet() -> str:
    ua = UserAgent(browsers=['edge', 'chrome','safari'])
    user_agent = ua.random
    return user_agent
    
@dataclass
class ProductsParam:
    # url
    url: str = field(default="요청 URL")
    # headers
    headers: dict = field(default_factory=lambda: (
        {
            "user-agent": ""
        }
    ))
    # parameter
    prod_cd: str = field(default="")
    page: int = field(default=1) 

    def __post_init__(self):
        self.headers["user-agent"] = create_fake_useragnet()

이런 식으로 UserAgent의 브라우저를 edge, chrome, safari로만 지정을 해주고 생성을 해서
Param의 headers에 넣어주면 된다!

728x90