3주차 웹스크래핑은 쉽지 않았다.
이해가 되지 않아서 여러번 코드를 뜯어보고 많은 고민도 했던 주차였다.
그 중에서 재밌었던 일에 대해 이야기해보자 한다.
3-14 퀴즈를 풀 때 몽고DB에 있는 것을 바탕으로 풀었어야 했는데 나는 그것도 모르고 웹스크래핑으로 문제를 풀어버렸다. 이것을 깨달았을 때는 벌써 2번째 문제를 풀고 3번째 문제를 풀려고 했을 때였다.
나는 나 혼자 이렇게 했다는 사실이 억울해 스파르타코딩클럽 슬랙에 이렇게 올렸다.
다 함께 풀면 덜 억울하지 않을까? 그리고 다른 사람들은 어떻게 풀까 싶어 올렸던 글이었다.
오늘, 그러니까 7월 17일 토요일에 올렸기 때문에 이걸 볼 사람이 몇 없겠지만 혹시나 싶어 기다렸다.
그리고 다음과 같이 코드가 올라왔다.
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
all_tr = soup.select('#old_content > table > tbody > tr')
walle_point = soup.select_one('#old_content > table > tbody > tr:nth-child(16) > td.point').text
for tr in all_tr:
points = tr.find("td", class_="point")
if points is not None and points.text == walle_point:
print(tr.select_one('a').text)
이건 내가 생각치 못한 코드였다.
내가 작성한 코드는 다음과 같다.
(원래는 이것보다 쓸 데 없는 코드가 더 있었지만 상대의 코드를 보고 고치면서 2~3줄 줄일 수 있었다)
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
total = soup.select('#old_content > table > tbody > tr')
matrix_score = soup.select_one('#old_content > table > tbody > tr:nth-child(19) > td.point').text
for total_all in total:
name_tag = total_all.select_one('td.title > div > a')
if name_tag is not None:
name = name_tag.text
score = total_all.select_one('td.point').text
if score == matrix_score:
print(name)
코드 길이만 봐도 상대의 코드가 더 좋은 것이 눈에 보였다. 그래서 나는 하나씩 뜯어보았다.
나는 for로 반복문을 돌리면서 none을 없애고 점수가 같은 영화제목을 도출했다.
반면에 저 분은 find로 점수를 찾은 다음 if의 조건으로 None을 없애고 점수가 같은 것을 찾아 영화제목을 출력하는 방식이었다.
이것을 보면서 하나 확실히 깨달은 것은 기존에 나는 for문을 돌릴 때 tag달린 코드 하나를 만든 다음 tag를 제거한 코드를 만들어 작업했었다. 그 이유는 여러개를 가져오는 select로 tag달린 코드를 만들었기 때문에 select_one로 하나씩 가져와 .text를 붙여 텍스트를 가져왔었다.
그러나 상대 분이 만든 코드를 보며 느꼈던 것은 for문에서는 하나씩 적용되기 때문에 select를 거치지 않고 곧바로 select_one을 써서 접근할 수 있다는 점이다.
그래서 나 역시 이를 이용해 더 수정하여 지금 같은 코드가 나오게 되었다.
기존에 배운 방식을 활용했었던 나와 새로운 방법으로 문제를 푼 상대의 코드 비교는 재밌었고 내게 큰 충격을 주었다.
이렇게도 생각할 수 있구나!
혼자 엉뚱하게 문제를 풀어서 억울한 마음에 올린 글이었지만 내게 놀라운 경험을 선사해주어서 재밌었고 큰 도움이 되었다. 이것이 바로 같이 공부하는 재미일 것이다. 😁
'Study > 스파르타코딩(왕초보 시작반)' 카테고리의 다른 글
내일배움단 11일메이킹챌린지 2일차 (0) | 2021.07.20 |
---|---|
내일배움단 11일메이킹챌린지 1일차 (0) | 2021.07.19 |
3주차 과제 (0) | 2021.07.17 |
3주차 (0) | 2021.07.13 |
2주차 과제 (0) | 2021.07.09 |