이미지를 스크래핑 하기전에 이 이미지를 어떻게 일반적으로 받을 수 있나 라고 할 때 보통 '우클릭 → 이미지 저장' 순으로 하는데 다음에서 제공하는 페이지에서는 이게 불가능 하다. 그래서 이미지를 3번이나 타고들어가야 우클릭으로 저장이 가능하다. 다시 말해 수동으로 하나씩 이미지를 5년도치 꺼내온다면 25번을 한 년도당 15번씩 해야하는 번거로움이 생긴다. 이를 스크래핑으로 해결해 보자.
URL 복사
스크래핑 기본 세팅
import requests
from bs4 import BeautifulSoup
res = requests.get("https://search.daum.net/search?w=tot&q=2019%EB%85%84%EC%98%81%ED%99%94%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR")
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
이미지 분석 이미지 태그안에 src를 가져와야 결국 타고 들어 갈 수 있을 것이다.
첫번째 화면에서의 이미지 링크 들고 와보기
images = soup.find_all("img", attrs={"class":"thumb_img"})
for image in images:
print(image["src"])
image_url = image["src"]
if image_url.startswith("//"):
image_url = "https:" + image_url
print(image_url)
이제 각 링크에 들어가서 정보를 파일로 저장해서 훑어보기
res = requests.get("https://search.daum.net/search?w=tot&q=2019%EB%85%84%EC%98%81%ED%99%94%EC%88%9C%EC%9C%84&DA=MOR&rtmaxcoll=MOR")
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
images = soup.find_all("img", attrs={"class":"thumb_img"})
for idx, image in enumerate(images):
print(image["src"])
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()
with open("movie{}.jpg".format(idx+1), "wb") as f:
f.write(image_res.content)
1) 여러 이미지를 하나씩 들고오기위한 for문 2) 각각의 이미지들의 "src"를 들고와서 'imgae_url' 변수에 담기 3) src 정보들중 https가 붙지 않는것들에게 붙여주기 4) 정확한 이미지 링크 url이 만들어지면 똑같이 'res'화 시킴 5) 그 정보들을 하나씩 들고와서 파일화 하는데 '{}.jpg' 로 담기위해서는 인덱스 + 내용이 필요하다 6) 그래서 enumerate() 함수를 써서 인덱스/내용을 뽑고 .format()에 담아서 파일로 저장 7) 50여개의 사진을 들고오는데 영화순위와 관계없는 사진도 들고 온다. (30번까지가 영화이미지)
순위와 관계있는 이미지만 추출 해보자
for idx, image in enumerate(images):
print(image["src"])
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()
with open("movie{}.jpg".format(idx+1), "wb") as f:
f.write(image_res.content)
if idx >= 4:
break
여기서 if문을 통해 인덱스를 걸러주면 된다.
2019년도의 1~5위까지만 딱 들고오는걸 볼 수 있다.
이제 최근 5년간 상위 5위까지 들고 와 보자
for year in range(2015, 2020):
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)
res = requests.get(url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "lxml")
images = soup.find_all("img", attrs={"class":"thumb_img"})
for idx, image in enumerate(images):
print(image["src"])
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()
with open("movie_{}_{}.jpg".format(year, idx+1), "wb") as f:
f.write(image_res.content)
if idx >= 4:
break
1) 년도별로 포문을 돌려야 하기 때문에 year in range(2015, 2020)으로 2중 포문 세팅 2) url의 year부분에 {} + .format(year)를 넣게되면 2015, 16, 17... 순으로 돌아 감 3) 년도 별 포문 타고 이미지 포문타면서 한년도를 돌때마다 이미지를 들고 오는데 중복이 되지 않게 해야함 4) 그러므로 파일의 저장방식에 year을 추가해서 저장하면 끝