python requests로 데이터 가져올 때 403 forbidden이 나타나는 문제 질문드립니다

조회수 3853회

우선 스크랩/파싱하고자 하는 페이지는 다음과 같습니다.

https://www.influenster.com/reviews/farmacy-honeymoon-glow-aha-resurfacing-night-serum-with-echinacea-greenenvytm

일반적으로 requests를 사용하듯 페이지에 접근했는데, 계속 403 forbidden 에러를 내려줍니다. 관련되어 사용하고 있는 모든 헤더를 다 수정하여 추가했는데도 마찬가지로 나타납니다.

혹시 쿠키값이 필요한가 하여 쿠키값을 제거한 상태에서 requests.get()을 보냈는데, 브라우저로 네트워크를 살펴보니 쿠키값이 없는 상태로 보내진 최초 HTTP 통신에 값이 내려오는 것을 보니 쿠키값으로 유효성을 검증하는 것은 아닌 것 같았습니다.

이런 경우는 처음이라 혹시 고수분들의 고견을 들어볼 수 있을까 하여 질문드립니다.

네트워크로 살펴보았을 때 서버 측에서 받는 requests header는 아래와 같았습니다. 이미지

해당 HTTP 미리보기를 보면 아래와 같이 브라우저에서 정상적으로 데이터를 받아온 것을 확인할 수 있었구요. (waterfall로 보면 이게 최초의 HTTP 통신입니다) 이미지

POSTMAN을 통해 위의 requests header와 주소를 넣었을 때의 입력값입니다. 보시는 것처럼 403 Forbidden으로 튕겨내어지고 있습니다.

이미지

쿠키값이 복잡하게 설정되어있다든가, csrf나 JWT가 필요하다거나 하면 어떻게든 뚫어볼텐데, 딱히 요구하는 커스텀 헤더도 없고, 서버에서 받는 요청 헤더를 다 맞추어 주었는데도 이렇게 튕겨내지는 경우는 처음이라 당황스럽습니다.

세션이 필요한가 하여 requests로 세션을 열고 보냈는데도 마찬가지입니다.

혹시 이 문제 해결 가능한 고수님이 계신지 기다려봅니다 ㅠㅠ

---- 사용된 헤더 ---

my_headers = {
    'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15',
    'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' : '[{"key":"Accept-Language","value":"ko-kr","description":"","type":"text","enabled":true}]',
    'Connection' : 'keep-alive',
    'Host' : 'www.influenster.com',
    'Accept-Encoding' : 'gzip, deflate, br'
}
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 헤더 정보를 스크린샷이 아니라 텍스트로 올리셨으면 다른 사람이 직접 해볼 수 있을텐데 말이죠. 아쉽꾼녕 편집요청빌런 2020.2.4 18:40
  • 이런 곳에 질문 남겨본 적이 많이 없어서... 추가했습니다. 알 수 없는 사용자 2020.2.4 18:47
  • 추가하신 헤더가 포스트맨 말고 파이썬에서도 설정한 헤더인가요? 편집요청빌런 2020.2.4 18:51
  • 403 응답의 텍스트를 보면 해당 사이트의 보안 설정에 의한 접근 권한 부족 문제로 추정되네요. 방법은 아랫분이... 편집요청빌런 2020.2.4 18:54
  • 넵 저도 그런 것 같은데 겉으로 보기엔 접근 권한을 별도로 요구하지도 않았는데 forbidden이 떠서 당황스럽습니다 ㅠ 답변 감사합니다 알 수 없는 사용자 2020.2.4 19:03
  • 넵 저도 그런 것 같은데 겉으로 보기엔 접근 권한을 별도로 요구하지도 않았는데 forbidden이 떠서 당황스럽습니다 ㅠ 답변 감사합니다 알 수 없는 사용자 2020.2.4 19:03
  • cloudflare의 reCAPTCHA 관련 문제로 보이는데 혹시 이쪽으로 찾아보셨나요? 편집요청빌런 2020.2.4 19:06
  • 파이썬은 아니지만 nodejs로 만든 스크래퍼를 보면 cloudflare의 안티 디도스를 우회하기 위한 설정을 제공합니다. https://github.com/codemanki/cloudscraper 검색 결과로 추정해보면 일반적인 request로는 안될것 같습니다. 편집요청빌런 2020.2.4 19:09
  • cloudflare(cdn 업체) 의 bot 차단으로 막혀있네요. 간단하게 javascript 가 가능한지 여부로 브라우져인지 판단합니다. requests 하나만으론 우회하기 어렵습니다. 정영훈 2020.2.4 19:13
  • 아하..감사합니다. javascript 구동 여부를 보고 막는거였군요. 리디렉션이나 헤더 쪽으로만 생각해서 javascript 부분을 생각을 못했었네요. 보내주신 내용 참고해보겠습니다. 감사합니다! 알 수 없는 사용자 2020.2.4 19:40

1 답변

  • 이미 솔루션이 있네요.

    pip install cfscrape

    https://github.com/Anorov/cloudflare-scrape

    import cfscrape
    
    scraper = cfscrape.create_scraper()
    r = scraper.get("https://www.influenster.com/reviews/farmacy-honeymoon-glow-aha-resurfacing-night-serum-with-echinacea-greenenvytm")
    r.status_code  # 200
    
    print(r.content.decode('utf-8'))
    
    • 감사합니다. 시도해보겠습니다! 알 수 없는 사용자 2020.2.4 19:41
    • 시도해보았으나 cfscraper로는 작동이 안되고(똑같은 403 forbidden), 대신 찾아보니 cloudscraper라는 다른 모듈이 있는데 이건 작동하는 것 같습니다. 이 글을 보는 다른 분들을 위해 쓰자면, 사용법은 영훈님이 쓰신 것과 동일하게 import scraper하신 다음 scraper = cloudscraper.create_scraper()로 객체 만들어 사용하시면 됩니다. 감사합니다! 알 수 없는 사용자 2020.2.5 14:31
    • 저는 잘 되었구요. 아마도 프로젝트에도 설명이 있는데 cloudflare 의 방법이 수시로 변경된다(당연하겠죠 뚫리면 막아야하니까요)고 되어 있구요 reCAPTCHA 가 나타나면 운이 없는거라고 나와 있어요. 이말은...항상 된다는 보장은 못하고 또 지금은 되어도 나중에 안될수 있다는 의미입니다. 막으려는 솔루션인데 뚫리면 존재이유가 없겠죠. 정영훈 2020.2.5 17:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)