가수면

난관에 부딪친 크롤링 본문

일지

난관에 부딪친 크롤링

니비앙 2022. 10. 28. 23:15

문제

 

크롤링을 하다가 문제에 부딪혔다.

배운 대로 크롤링을 하기 위해 2022.10.29(토)에 있는 영화의 제목들을 'selector 복사' 해왔다.

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li:nth-child(1) > div.box-contents > a > strong
#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li:nth-child(2) > div.box-contents > a > strong

 

아래와 같이 중복되는 부분을 잡고 그 제목 부분을 추출해냈다.

movies = soup.select('#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li')

for movie in movies:
    title = movie.select_one('div.box-contents > a > strong').text

    print(title)

 

결과는...

Coldplay Music of the Spheres Live Broadcast from Buenos Aires
REVOLUTION HEART 1st SHOWCASE : TRIGGER [혁명의 시작]

 

그렇다. 페이지 전체의 영화가 아닌 두 개의 영화만이 프린트되었다.

나는 해당 홈페이지 구조를 보고 그 이유를 알 수 있었다.

 

 

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li:nth-child(1) > div.box-contents > a > strong

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li:nth-child(2) > div.box-contents > a > strong

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(6) > li > div.box-contents > a > strong
#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(8) > li:nth-child(1) > div.box-contents > a > strong
#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(8) > li:nth-child(2) > div.box-contents > a > strong

 

홈페이지 구조를 보니 아무래도 날짜 별로 구역이 나뉘며 파란색 부분의 값도 바뀌는 것 같다.

계획대로라면 초록색 부분의 숫자만 바뀌어 영화 전체가 프린트됐어야 했거늘, ol:nth-child(4)까지 입력해버렸으니 ol:nth-child(4)에 할당된 초록색 1, 2 영화(29일 자 영화)가 프린트된 것이다.

그래서 나는 아래처럼 soup.select 부분에 숫자가 바뀌기 전, 그러니까 더 앞쪽에서 끊어 입력해보았다.

 

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(8) > li:nth-child(2) > div.box-contents > a > strong

 

그 결과, 모든 영화가 아닌 각 날짜별 가장 앞에 있는 영화만이 출력되는 것을 확인했다.

그래서 이번엔 조금 더 앞쪽을 입력해 보았다.

 

#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(8) > li:nth-child(2) > div.box-contents > a > strong

 

그 결과, 제일 상단 좌측에 위치한(제일 처음 값) Coldplay Music of the Spheres Live Broadcast from Buenos Aires 영화 하나만 출력되는 것을 확인했다.

 

이 과정으로 나는  soup.select이 불러오는 구조를 이해할 수 있었다.

 

 

해결 방법

 

우선 첫째. 

movies = soup.select('#contents > div.wrap-movie-chart > div.sect-movie-chart > ol:nth-child(4) > li')

빨간색의 4부분을 2씩 증가시킨다.

그렇게 되면 for가 돌아가면서 4에 해당된 영화들, 6에 해당된 영화들 8, 10, 12... 전부 찍어낼 것이다.

 

그러기 위해 두 가지 조건식을 짜 봤다.

for i in range(2, 53, 2):

a = 2
sum = 2
while sum <= 50:
    sum += a

 

그러나 정작 활용 방법을 모르겠다.

숫자 4 부분에 대괄호나 중괄호 친 뒤 i나 sum을 넣어봤지만 에러로 실패.

'리스트 추가' 등의 키워드로 구글링 해보았지만 역시나 해결책을 찾지 못했다.

 

두 번째 방법.

필요한 정보인 제목, 포스터, 예매율, 날짜를 세팅하고 나서 4를 2씩 올려가며 52까지 손수 수정해가며 db에 저장하는 것이다.

 

결론

 

어떻게든 혼자 해결해보려고 낑낑대다 보니 이거 하나에 진전 없이 6시간이 훌쩍 넘어버렸다.

우선 질문을 올려놓고 방법을 찾지 못한다면 두 번째 방법을 써서 해결하는 수밖에 없을 것 같다.

'일지' 카테고리의 다른 글

줄 정리  (0) 2022.11.02
반응형 웹으로 바꾸기 (허접함 주의)  (0) 2022.11.01
D-day 구현하기  (0) 2022.10.31
문자열 치환, ...처리  (0) 2022.10.29
토이 프로젝트 시작  (0) 2022.10.27
Comments