ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 활용 07 - 3 - 웹 스크래핑 (BeautifulSoup4 - 다음)
    파이썬/파이썬 활용 2021. 11. 5. 10:18

    유투버 '나도코딩'님 강의 참조

     

     

     

    01 이미지 크롤링

     

    • 다음에서 영화를 검색하여 나오는 결과를 바탕으로 이미지 추출

    역대 관객순위에서 5년도별 5개의 이미지 추출 해보기

    • 이미지를 스크래핑 하기전에 이 이미지를 어떻게 일반적으로 받을 수 있나 라고 할 때 보통 '우클릭 → 이미지 저장' 순으로 하는데 다음에서 제공하는 페이지에서는 이게 불가능 하다. 그래서 이미지를 3번이나 타고들어가야 우클릭으로 저장이 가능하다. 다시 말해 수동으로 하나씩 이미지를 5년도치 꺼내온다면 25번을 한 년도당 15번씩 해야하는 번거로움이 생긴다. 이를 스크래핑으로 해결해 보자. 

     

     

    1. URL 복사
    2. 스크래핑 기본 세팅
      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")​
    3. 이미지 분석
      이미지 태그안에 src를 가져와야 결국 타고 들어 갈 수 있을 것이다. 
    4. 첫번째 화면에서의 이미지 링크 들고 와보기
      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)​


    5.  이제 각 링크에 들어가서 정보를 파일로 저장해서 훑어보기
      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번까지가 영화이미지)

    6. 순위와 관계있는 이미지만 추출 해보자 
      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위까지만 딱 들고오는걸 볼 수 있다.
    7. 이제 최근 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을 추가해서 저장하면 끝

     

     

Designed by Tistory.