인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

아무거나님의 프로필 이미지
아무거나

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

네이버 영화 평점 크롤링하기 질문있습니다.

작성

·

175

1

네이버 영화 페이지가 평가 점수를 보려면 클릭을 통해 다른 페이지로 넘어가야 하도록 변경되었습니다.

평가 점수를 넣어보고 싶어 아래와 같은 코드를 추가해 문제를 해결했으나, 프로그램 동작이 느려지는 현상이 있습니다.

이걸 해결할 방법은 없을까요?

코드는 다른 부분은 강의에서와 같고 아래의 함수와 함수를 콜하는 부분만 더 추가되었습니다.

def point_search(point_href):
    point_url = "https://movie.naver.com/movie/point/af/list.nhn?"

    r = requests.get(point_url + point_href)
    bs = BeautifulSoup(r.text, "lxml")
    point = bs.select("table.info_area > tr > td > strong")[0].text.replace("\n""")

    return point
# point_search 함수 콜
            point = point_search(tds[1].select("a")[0]["href"][1:])

답변 2

1

남박사님의 프로필 이미지
남박사
지식공유자

말씀하신데로 리스트의 링크를 통해 한번 더 페이지를 로딩하게 되는경우 ^2 만큼의 속도 저하가 생기는게 당연한 내용입니다. 그러나 특정한 이유로 속도 저하를 극복하고자 한다면 여러가지 방법이 있을 수 있겠으나 사실 뭐하나 간단한 방법은 없습니다만..... 이론적인 방법을 얘기해보자면

가장 쉬운예로는 해당 서브페이지를 로딩하는 부분을 쓰레드로 분리하여 동작하게 하는 방법이 있습니다. 그러나 이 방법은 서브페이지의 쓰레드를 제어할 수 없기 때문에 페이지 양이 많아지면 프로그램 자체가 뻗을 수 있는 점, 그리고 리소스를 제어할 수 없는 단점이 있습니다. 프로그램에서 웹페이지 호출은 보장할 수 있으나 웹페이지의 로딩이 어느시점에 완료 될지는 전적으로 서버의 역할이기 때문입니다.

두번째로는 메인 프로세스를 쓰레드 풀로 구현하여 동작시키는 방법이 있습니다. 이는 첫번째보다 안정적이며 자원을 컨트롤 할 수 있는 장점이 있지만 구현하기가 좀 더 복잡해지는 단점이 있습니다.(쓰레드풀은 첫번째 방법의 단점을 극복하기 위해 나온 방법이라고 보실 수 있습니다.)

세번째로는 도커를 사용해서 각각의 크롤링 로직을 분리하여 완벽하게 독립적으로 구동하되 도커를 관장하는 프로그램을 새로 작성하는 방법도 있습니다만 이는 굉장히 규모가 커지고 복잡해지는 단점이 있고 도커에 대해서도 지식이 필요합니다.(전문적인 크롤링 엔진에서나 쓰일법한 기법중 하나 입니다.)

일단 이정도가 당장 생각나는 몇가지 방법들이긴 합니다만 위의 방법들이 사실 뭐하나 맘에 들지 않으시겠지만 실제 크롤링이라는 분야가 좀 더 깊게 들어갈 수록 복잡해지고 생각해야할 요소들이 많고 그만큼 전문적인 영역으로 들어가게 되는 장르 입니다. 따라서 프로젝트의 성질에 따라서 어떻게 구조를 설계하고 성능을 예측해야하는지는 어려운 숙제가 됩니다. 안정성을 중시할것인지 성능을 중시할것인지는 항상 어려운 문제 입니다.

차후에 기회가 되면 좀 더 전문적인 크롤링 엔진에 대한 내용을 다루는 강좌를 준비해봐야겠습니다. 

0

아무거나님의 프로필 이미지
아무거나
질문자

답변 감사합니다. 나중에 스레드를 배우면 한번 적용 해봐야겠네요

아무거나님의 프로필 이미지
아무거나

작성한 질문수

질문하기