파이썬 크롤링 질문

조회수 1410회

아프리카 비제이들이 받은 별풍선 데이터가 있는 사이트(http://poong.today/chart/day) 를

크롤링하고싶은데요 해당 사이트에서 f12를 눌러 개발자도구에서 아래사진처럼

day를 보면 순위별로 데이터가 있어서

이미지

이걸 가져오고싶어서 아래처럼 코드를 post에 폼데이터를 넣어줬는데요

import requests

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'} 
url = 'http://poong.today/chart/day'

param = {
    "year" : '2020',
    "month" : '05',
    "day" : '20',
    "ks" : 'false'
}

req = requests.post(url,data=param,headers=header)

print(req.text)

프린트를 해보면 제가원하는 데이터가 없고 아래처럼 출력이 됩니다

<!doctype html>
<html lang="en">
    <head>
        <title>Page Expired</title>

        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet" type="text/css">

 (뒷부분 길어서생략)

어디가 잘못되었는지, 제가 원하는 데이터를 request로가져오려면 어떻게 해야하는지 조언을 구합니다

아래는 폼데이터 사진입니다

이미지

  • 로그인 해서 가져와야 할 데이터라면 requests 모듈로는 어렵지 않을까요? 아프리카티비에서 크롤링을 못하게 막아놓아 놓았을 가능성이 높음.. 로그인이 필요한 경우 저는selenium 모듈을 사용합니다. 필요하면 BeautifulSoup 모듈도 함께 사용하고요.... 알 수 없는 사용자 2020.5.22 13:53
  • 로그인이 필요없는 아프리카에서 운영중인게아닌 별개의 사이트 입니다 느려도 셀레늄을 쓰는방법밖에 없을까요 ㅠ nyw123 2020.5.23 03:09
  • 데이터 몇 개 가져오는데 빨리 해야 할 이유가? 알 수 없는 사용자 2020.5.23 08:55
  • 첫사진이 편집되어서 리스트가 100개만 있는데 몇개가아니라 최소 몇천개에서 몇만개까지 됩니다 셀레늄으로는 한번에 50개씩밖에안보여서 데이터뜨기를 기다렸다가 더보기누르고 또 기다렸다가 더보기.. 이걸 수백번 해야해서요 nyw123 2020.5.23 10:56
  • 더보기를 반복적으로 클릭해야 한다면, pyautogui모듈 사용하세요. 이 모듈로 '더보기' 좌표를 구해서 일정시간 단위로 반복해서 클릭하게 하면 될듯... 아시겠지만 pyautogui는 키보드와 마우스를 제어할 수 있게 도와줘요.. 알 수 없는 사용자 2020.5.23 12:45
  • 네 그런데 그렇게하면 한번 데이터를 가져오는데 10분 이상 걸려서 request로 가져올수없는지 질문을 올렸어요 nyw123 2020.5.23 12:55

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    import requests
    
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
              'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
              'X-CSRF-TOKEN': '#일부러 가렸습니다. DEV TOOLS로 뜯어낸 값을 사용하세요',
              'X-Requested-With': 'XMLHttpRequest',
              'Cookie': '#일부러 가렸습니다. DEV TOOLS로 뜯어낸 값을 사용하세요'
    }
    url = 'http://poong.today/chart/day'
    
    param = {
        "year" : '2020',
        "month" : '05',
        "day" : '24',
        "ks" : 'false'
    }
    
    req = requests.post(url,data=param,headers=header)
    
    print(req.text) 
    

    무단 크롤링을 방지하기 위해 사이트에서 이런저런 장치들을 추가한 것 같습니다.

    header에 정보들을 더 추가해줘야 합니다. 구체적으로

    1. Content-Type 명시 (이 사이트가 아니더라도 앞으로 항상 Content-Type은 명시해주세요)
    2. X-CSRF-TOKEN 값 추가
    3. X-Requested-With 값 추가
    4. 쿠키 값 추가

    이렇게 4개를 추가해주니 아래와 같은 Response를 얻었습니다

    [{"i":"skaosdk7","n":"BJ\ud558\ub298\uc774\u2665","b":23357,"r":1,"h":[3268,3097,9989,2950,4053,"","","","","","","","","","","","","","","","","","",""],"c":208,"v":131},{"i":"gksk4998","n":"\uc140\ub9ac+\u2665","b":22718,"r":2,"h":[1374,1534,1758,5558,408,4858,7228]] ... 중략
    

    다만 여기서 X-CSRF-TOKEN값이나 Cookie값은 브라우저로 접속시 생성되는 값으로 추측되기 때문에, 주기적으로 돌아야 하는 크롤러라면 Selenium과 HeadlessChrome을 조합해서, 실제 사용자가 브라우저를 통해 접속한 것처럼 꾸미는 식으로 크롤링 해야 할 것 같습니다.

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 주의 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 사이트 개발자가 이렇게 까지 막아 놨다면, 크롤링 등 비정상 행위로 사이트 운영에 지장을 주지 말아달라는 의미입니다. 트래픽도 결국 전부 다 사이트 관리자가 부담해야할 비용이니까요. 이런 사이트를 계속 크롤링하는게 문제가 되지 않을지는 스스로 판단하셔야 합니다.

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 리퀘스트로는 포기하고있었는데 답변 정말 감사합니다 사이트에 무리안가게 해보겠습니다! nyw123 2020.5.25 00:11

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

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

(ಠ_ಠ)
(ಠ‿ಠ)