• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

select()할때 조금 복잡한 selctor일 경우

20.09.01 22:52 작성 조회수 223

0

안녕하세요. 저는 왓챠피디아에서 영화 순위를 크롤링하려고 했는데요.

왓챠피디아는 박스오피스, 왓챠플레이, 넷플릭스에 관해 각각 순위가 메겨져 있어서

저는 왓챠플레이만의 순위를 가져오려고 해당 selctor 를 복사했는데,

아래와 같아요.

#root > div > div.css-1sh3zvx-NavContainer.ebsyszu0 > section > div > section > div:nth-child(2) > div.css-gc1vu8-StyledHorizontalScrollOuterContainer.ebeya3l4 > div > div.css-chidac-ScrollBar.e1f5xhlb1 > div > div > ul > li:nth-child(2) > a > div.css-dmreg0-ContentInfo.e3fgkal2 > div.css-1teivyt-ContentTitle.e3fgkal3

위 코드가 복잡하긴 한데,  굵게 칠한 div:nth-child(2) 가 없으면 왓챠플레이 뿐만 아니라 넷플릭스랑 박스오피스도 불러와져서 그냥 저 코드를 다 사용해서 아래와 같이 만들었습니다. 

import requests

from bs4 import BeautifulSoup

movie_lists= []

res = requests.get('https://pedia.watcha.com/ko-KR/')

soup = BeautifulSoup(res.content, 'html.parser')

data = soup.select('#root > div > div.css-1sh3zvx-NavContainer.ebsyszu0 > section > div > section > div:nth-child(2) > div.css-gc1vu8-StyledHorizontalScrollOuterContainer.ebeya3l4 > div > div.css-chidac-ScrollBar.e1f5xhlb1 > div > div > ul > li > a > div.css-dmreg0-ContentInfo.e3fgkal2 > div.css-1teivyt-ContentTitle.e3fgkal3')

for movie in data:

    movie_name= movie.select_one('div.css-1teivyt-ContentTitle.e3fgkal3')

    movie_date = movie.select_one('div.css-6t186m-StyledContentYearAndNation.ebeya3l12')

    movie_info = [movie_name.get_text().strip(), movie_date.get_text().strip()]

    movie_lists.append(movie_info)

근데 여기서 movie_lists에 아무것도 append가 되어있지 않아요ㅠㅠ.

그래서 그냥 왓챠, 넷플릭스, 박스오피스 순위가 다 나올 수 있는 밑에 코드로 바꿨는데요.

ul > li > a > div.css-dmreg0-ContentInfo.e3fgkal2

->

import requests

from bs4 import BeautifulSoup

movie_lists= []

res = requests.get('https://pedia.watcha.com/ko-KR/')

soup = BeautifulSoup(res.content, 'html.parser')

data = soup.select('ul > li > a > div.css-dmreg0-ContentInfo.e3fgkal2 ')

for movie in data:

    movie_name= movie.select_one('div.css-1teivyt-ContentTitle.e3fgkal3')

    movie_date = movie.select_one('div.css-6t186m-StyledContentYearAndNation.ebeya3l12')

    movie_info = [movie_name.get_text().strip(), movie_date.get_text().strip()]

    movie_lists.append(movie_info)

이러면 list에 다 append가 다 되어있어요.

select('')할때 너무 길게 코드를 쓰면 안되는 건가요???

강의 정말 잘 보고 있습니다! 답변 남겨주시면 감사하겠습니다.~

답변 1

답변을 작성해보세요.

0

안녕하세요.

select를 할 때, 길게 코드를 써도 되지만, 그럴 경우, 조건이 매우 많이 들어가는 것과 동일하기 때문에, 추출이 안되는 경우가 있습니다. 그래서 가급적 짧게 딱 해당 데이터만 가져올 수 있는 태그와 아이디/클래스명을 가지고 추출하는 것이 일반적입니다.

더 실제 코드에서 어느 부분을 변경해야되는지 등은 양해를 꼭 부탁드립니다. 새소식으로 공지드렸듯이, 이 부분은 이해를 부탁드립니다.

-----------------

안녕하세요. 잔재미코딩 Dave Lee 입니다.

오늘은 한가지 공지를 드려요~~

그동안 정말 다양하고 많은 분들께서 수강을 해주고 계시는데요. 그러다보니, 질문/답변 란에 동일한 이야기를 드릴 때가 많아서 공유를 드려요.

질문/답변 란에, 각자 원하시는 크롤링 코드 관련 문의를 해주시는 경우가 꽤 있었는데요. 그 때마다, 가급적 배려를 드리는 차원으로, 가볍게 볼 수 있는 부분에 대해서만 답변을 드리기는 했습니다. 하지만, 해당 질문/답변 란은 본 강의 영상과 관련한 질문이 있을 때를 답변해드리는 것이 기본 취지인 것 같아요. 

온라인 수학 강의를 수강하면서, 강의에 나온 수학공식을 사용하는 강의 외에 각자 풀고 있는 수학 문제를 질문하고, 이를 풀어드리는 강의는 본 적이 없는데요. 마찬가지로 본 강의를 수강하시면서, 각자의 코드나, 각자 원하시는 크롤링 코드를 작성해드리거나, 함께 풀어나가는 것은 현실적으로 큰 무리가 있습니다.

더군다나 본 강의가 평생 수강이 가능하기 때문에, 이를 지원해드릴 경우, 본 강의를 들으면 내가 원하는 크롤링 코드는 모두 해결해드려야 하는 오해 아닌 오해도 생길 수 있고요. 심지어, 저도 실제 코드를 작성해봐야 해서, 코드를 작성하느라 답변이 늦어지면, 다른 답변이 늦어질 수도 있어서, 다른 수강생분들께도 문제가 될 수 있을 것 같습니다.

그래서, 질문/답변란에 문의를 주실 때에는 각자의 원하시는 크롤링 코드 관련 문의는 안해주시면 감사하겠습니다. 이 부분 꼭 양해를 부탁드립니다.

또한 가능하다면,

1) 어느 챕터의 몇분(:몇초)정도에서 이 부분이 이해가 안간다 와 같은 식으로 질문을 해주시면,

2) 강의에서 나온 코드는 이미지 캡쳐보다, 코드 자체를 텍스트로 질문에 붙여주시면,

훨씬 저도 이해가 빨라서, 빠르게 지금과 같이 상세하게 답변드릴 수 있을 것 같습니다.

감사합니다.~~~ 잔재미코딩 드림