python requests로 크롤링 할 때 로딩 대기하는 방법이 있나요?

조회수 3081회
url = 'www.url-test.co.kr'
req = reuqests.get(url)
json_load = json.loads(req.text)
json_res = json_load['rest']
.
.
.

이런식으로 특정 사이트에서 requests를 사용하여 정보를 가져오고있습니다. 정확히 말하면 유료로 사용중인 api에서 정보를 가져오는건데 그쪽 서버가 느려서인지 제 인터넷이 느려서인지 api주소를 입력하고 접속하면 로딩 시간이 좀 걸리더라구요. 그래서 requests.get(url)을 한 후에 'test'라는 키값을 찾으면 로딩이 덜 되서 그런지 키값을 찾을 수 없다고 뜨더라구요. 그래서 requests하는 부분에 time.sleep(delay)를 적용해서 최대한 천천히 해보려는데 로딩 지연문제는 이걸로 해결하기가 힘든 거 같네요 셀레니움처럼 로딩 대기를 해서 데이터가 완전히 뿌려진 후에 리퀘스트 할 수 있는 방법이 있을까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    requests 로 가져오는게 html문서 포멧인건가요?

    아니면 그냥 json/xml 같은 데이터 포멧인가요?

    일단 질문만 봤을때는 일반 페이지 내용 자체(html 문서)를 긁어오는 크롤러를 만드시는 것 같은데...

    만약 그렇다면 아마 해당 페이지는 페이지가 렌더링되거나 혹은 렌더링 된 이후에 자바스크립트에 의해서 수행되는 ajax 데이타를 페이지에 뿌려주고 있을 확률이 큽니다. 이 상황이라면 sleep으로는 영원히 해결 안 될 거에요.

    일반적인 크롤링은 서버에서 응답받은 문서만을 문자열로 리턴하지, 실제 그 문자열을 파싱하여 DOM Element를 만든다거나 자바스크립트를 실행시키지는 않잖아요. 그건 브라우저가 하는 일이니까요.

    html 문서를 파싱하는 것 까지는 beautifulsoup 이 해준다 쳐도, 자바스크립트는 실행되지 않을 것이며 따라서 자바스크립트로 호출하는 추가 데이타도 볼 수 없습니다.

    실제 브라우저 처럼 동작하는 셀레니움을 쓰시던지, 다른 헤드리스 브라우저를 포함하는 라이브러리를 사용하셔야 할 겁니다.

    • 우선 api에서 html 형식이 아닌 json 데이터로 뿌려줍니다 이럴 때도 그냥 셀레니움을 써야하나요? api에 requests하는 게 한 번 파일 실행하는데 400~600번정도씩 하기때문에 셀레니움을 사용하면 부하가 감당이 안 될 거 같은데 다른 방법은 없을까요? 김재민 2019.9.25 11:54
    • 으허? 그래요? 그런 종류의 크롤링이면 셀레니움 필요 없어요. 그 상황에서는 어쩔 수 없습니다. 서버에서 모든 응답이 올 때까지 기다려야죠. 그리고 requsts를 한 순간에 수백번 한다는건 api 서버의 처리 속도와 구성 방식에 따라서 다르겠지만 일반적으로 꽤나 기다려야 하는 상황이 맞습니다. 네트워크로 인한 지연 시간은 무시 못해요. 그리고 염두에 두셔야 할 게, 아무리 유료라고 해도 이 수 많은 요청을 서버에서 네트워크 공격이라고 인지하고 차단될 가능성이 있습니다. 한 번에 묶어서 받는 api가 있다면 그걸 사용하시는게... doodoji 2019.9.25 18:05
    • 흐어,,,,그렇군요 감사합니다ㅜㅜ 김재민 2019.9.26 09:50

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

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

(ಠ_ಠ)
(ಠ‿ಠ)