이제 데이터 공부 안하는 블로그

[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 24회차 미션 본문

파이썬

[패스트캠퍼스 수강 후기] 파이썬 인강 100% 환급 챌린지 24회차 미션

공사노비 2020. 11. 25. 22:23




24회차

다음에서 이미지 파일을 가져오는 스크래핑을 연습해 보았습니다.

역대 영화 순위 5위 안에 드는 영화들의 이미지 파일을 저장하는 것인데 사람이 작업을 하면 3번이상의 클릭을 거쳐야만 이미지 파일을 저장할수 있는 있습니다. 하지만 우린 파이썬이 있으니까요. 한번의 코딩으로 가능!!
오늘도 beautifulsoup으로 진행합니다.

먼저 다음에서 영화를 검색해보면 메인 화면에서 연도별 영화 순위를 볼수 있습니다. 2019년, 2018년 이렇게 클릭하면서 url이 어떻게 바뀌는지 확인할수 있습니다. 이부분을 앞으로 이용하도록 합니다.

먼저 영화의 포스터 이미지들이 제대로 가져와지는지 코딩으로 알아 보겠습니다. 시작은 항상 똑같이 합니다. requests 와 beautifulsoup을 import해 줍니다.
크롬의 개발자 도구를 통해 보면 이미지 파일은 img태그에 class가 thumb_img에 있습니다.
이미지 변수를 선언해줍니다.
images = soup.find_all("img", attrs={"class":"thumb_img"})

for 반복문으로 image들을 돌면서 파일로 저장해 줍니다.

for idx, image in enumerate(images):
# enumerate 함수 : enumerate는 “열거하다”라는 뜻이다. 이 함수는 순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.(feat.구글느님)

가져온 img태그안에 src태그에 있는 이미지의 url만 따로 뺍니다.
image_url = image["src"]
if image_url.startswith("//"): # //로 시작하는 주소만 불러옴
image_url = "https:" + image_url

print(image_url)
image_res = requests.get(image_url)
image_res.raise_for_status()

파일로 저장해주는 부분입니다. enumerate함수로 붙여준 인덱스 값을 사용해 파일의 순서를 만들어 저장합니다.
with open("movie{}.jpg".format(idx+1), "wb") as f: # 파일 확장자를 jpg로 설정
f.write(image_res.content)

여기까지 하고 실행하면 2015~2019년까지의 모든 영화 순위내의 포스터 이미지와 페이지내의 다른 모든 이미지까지 다 저장합니다. 하지만 우리가 원하는 것은 2015~2019년 영화의 5위안의 포스터만 가져오는 것이니까요. 코드를 추가 해 보겠습니다.

위에쓴 for 반복문위에 반복문을 하나더 추가합니다.
for year in range(2015,2020): # 2015년부터 2019년까지의 영화만 가져옴

url 변수를 따로 선언해주고 연도만 바꿔줍니다.
url = "https://search.daum.net/search?w=tot&q={}%EB%85%84%EC%98%81%ED%99%94%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR".format(year)
# url 주소에서 2019라고 되어있던 부분을 {}로 만들어주고 뒤에 .format(year) 을 넣어줌. 2015~2019년 영화 정보를 돌아가며 스크래핑.

res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")

images = soup.find_all("img", attrs={"class":"thumb_img"})

그리고 파일이 덮어써지는것을 방지 하기 위해 파일만드는 함수를 변경해줍니다.
with open("movie_{}_{}.jpg".format(year, idx+1), "wb") as f:
year 를 붙여 파일 이름을 바꿔줍니다.

마지막으로 5위안에 있는 영화의 포스터만을 가져오기 위해 조건문을 추가합니다.
if idx >=4: #상위 5개 이미지까지만 다운로드 받음
break

이렇게 하면 2015~2019년까지의 영화 순위내에서 5위까지의 영화만 골라 포스터를 jpg파일로 저장해 줍니다.
짝짝짝! 수고하셨습니다!!



강의소개 https://bit.ly/33a7nvc