Day to_day

[하루한끼_데이터] 이미지 url 크롤링 본문

Project

[하루한끼_데이터] 이미지 url 크롤링

m_inglet 2022. 11. 9. 21:45
728x90
반응형

보통 현업에선 이미지 데이터의 경우 클라우드를 많이 이용한다고 한다. 또는 DB에 저장을 해두고 해당 이미지의 경로를 프런트로 넘겨주는 방법을 사용한다고 하는데 우린 데이터가 800개가 넘었기 때문에 그 모든 이미지를 DB에 저장해 둘 수 없었다. (무료로 쓰고 있었기 때문에 용량이 크진 않았다..)

 

클라우드를 쓰자니 무료 클라우드 서비스를 찾지 못해 이미지 url로 불러오기로 결정했다. 

웹페이지에 띄울때 최대 6개 정도의 레시피를 보여줄 거기 때문에 url을 가져오는 사이트로부터 block을 당하지 않을 거라고 판단했기 때문이다. 

 

그러면 이제 이미지 url을 DB에 저장해야하는데 우리가 갖고 있는 정보라곤 해당 레시피의 사이트 주소만 있었다.

결국 크롤링 작업이 필요한 것..!

 

이전에 object detection 프로젝트를 하면서 인터넷 찾아보며  크롤링을 해본 적이 있는데, 그땐 검색어 기반 이미지를 모두 긁어오는 식이었고 이미지 퀄리티 자체가 너무 좋지 않아서 나에겐 그리 좋지 않은 기억이었다..ㅎ

 

그래서 이번엔 이미지 자체가 아니라 이미지의 url만 받아오는 걸로 서칭하면서 시도해봤다.

 

 


크롤링


여기선 크롤링의 개념보다는 어떻게 활용하여 코드작성을 하는지에 대해 이야기하고자 한다.

 

 

크롤링 주소

 

캐글 데이터에서 레시피의 주소 칼럼만 뽑아와서 리스트로 만들었다.

모두 veganuary.com의 레시피였고, 다른 사이트의 레시피도 있었지만 레시피의 양이 너무 많아지는 것 같아서 800개로도 충분한 양이겠다 싶어서 veganuary.com에서만 크롤링을 진행했다.

 

 

모듈 import

크롤링을 조금 서칭해보신 분이라면, 영상이나 설명에 Beautifulsoup 혹은 Selenium을 이용한다는 것을 알 것이다.

우선 둘다 크롤링을 할 때 사용되는 것인데, Beautifulsoup은 파이썬 패키지, Selenium은 프레임워크이다.

기본적으로 Beautifulsoup을 이용하면 무난하게 크롤링이 가능하지만 한계점이 존재한다.

Beautifulsoup은 request 요청을 통해서 데이터를 가져오는 것인데 이 방법에 한계가 있다.

 

1) 웹 페이지가 동적 페이지 이거나

2) 로그인이 필요한 사이트의 경우

 

위의 경우 크롤링하기 어려워지고, Selenium을 이용해서 Request 방법으로 데이터를 가져오는 것의 단점을 보완할 수 있다. 

하지만 내가 크롤링하려는 페이지는 정적페이지이고, 간단하게 이미지 url 태그에만 접근해서 url만 가져오는 것이기 때문에 Beautifulsoup을 사용하였다.

 

 

파일 load / 리스트 생성

주소 url이 들어있는 img_url을 load 시켜주고, 크롤링을 완료한 데이터를 넣을 url_list라는 리스트를 생성해주었다.

csv파일로 저장 후 다른 csv파일과 병합 할 예정이었기 때문에 urls라는 칼럼을 만든다고 생각하면서 저런 식으로 코드를 짜주었다.

 

 

Beautifulsoup을 이용하여 크롤링

이 코드에서 가장 중요한 부분은 soup.find로 클래스의 이름이 들어가야한다.

 

이 클래스 이름을 찾는 과정은 아래와 같다.

 

1. 크롤링할 사이트 주소에 들어간다.

2. 개발자 도구를 열어 ctrl + shift + c 혹은 해당 아이콘을 클릭해준다.

3. 원하는 이미지에 마우스를 갖다 대면 해당 코드에 불이 들어온다.

4. 이미지가 있는 코드를 찾아 클래스 이름이 무엇인지 알아낸다.

 

 

나의 경우 레시피의 배경 이미지를 얻고 싶었고, 코드를 보니

<img class="hero__img" src="https://...........jpg" alt="Vegan rainbox rice">

 

내가 접근할 이미지 url이 여기 있었다!

class name은 "hero__img"를 기억해서 class_ = "hero__img"를 넣어줬다.

 

또한 내가 원하는 속성은 결국 src안에 들어있는 url이기 때문에 attrs ['src']로 작성했다.

 

temp를 빈 리스트로 정의해주고, 그 안에 크롤링 결과 데이터를 넣고 또다시 url_list에 넣는 이유는

url_list = [
['urls'],
["https://..."],
["https://..."],
["https://..."],
...
["https://..."],
["https://..."],
["https://..."],
]

이런 식으로 저장하고 싶었기 때문이다.

 

 


여기서 잠깐!

 

<내가 겪었던 에러>

urllib.error.HTTPError: HTTP Error 403: Forbidden

이러한 에러가 떠서 서칭 해보니 urlopen 하는 과정에서 에러가 발생하였고, Request에 header 정보를 추가해주니 해결되었다!

 

 


리스트를 csv 파일로 만들기

크롤링이 모두 끝나면 url_list를 파일을 열고 (이름은 crawling.csv) write 형식으로 for 문을 돌리고 f.close()를 해주었다.

 

 


크롤링할 때 중요한 점은 원하는 태그의 정확한 클래스를 입력하는 것과 필요한 속성을 잘 적는 것이 중요하겠다.

이제 어느 정도 프로젝트에 넣을 데이터셋은 완성이 된 것 같고!

 

추가로 레시피 별로 유사도 검사를 진행할 거라서 유사도 검사를 위한 전처리를 또 한 번 진행하고, 추천 시스템을 만들어보려고 한다.

 

 

 

Ref


https://stackoverflow.com/questions/16627227/problem-http-error-403-in-python-3-web-scraping

파이썬으로 네이버 쇼핑 크롤링하기

 

 

728x90
반응형