티스토리 뷰

안녕하세요




지난 포스팅에서 분석을 마쳤으니


이번엔 코드를 작성하여 실제로 구현해 봅시다.





먼저 시작 전에 파이썬이 설치되어 있어야합니다!


https://www.python.org/



공식 홈페이지에서 다운받으시면 됩니다.


저는 3.6 버전 이상으로 진행할 예정입니다!

(2.x 버전과 호환이 안되는 부분이 있을 수 있음)



파이썬이 설치되어있다면 이제 본격적으로 시작해봅시다!







먼저 소스코드와 이미지를 저장할 폴더를 생성합니다.



저는 10000img 라는 폴더 안에 소스코드를 저장할 예정이고

10000img 폴더 안에 img 라는 폴더를 생성하여 해당 폴더에 이미지를 저장할 예정입니다.




먼저 필요한 모듈을 설치해봅시다.



CMD창을 열고 아래와 같이 입력합니다.


pip install beautifulsoup4



HTML 크롤링할 때 많은 사람들이 사용하는 라이브러리입니다!





설치 후 main.py 파이썬 파일을 하나 생성합니다.





디렉토리 구조는 위와 같습니다



main.py 파일을 열어서 코딩해봅시다!

(메모장, 파이참, 기타 에디터 중 아무거나 사용하셔도 됩니다)



저는 파이참을 사용하여 작성하도록 하겠습니다.

(메모장 코딩은 너무 불편,,)







위와 같이 코드를 작성해줍니다



맨 위 2줄은 필요한 라이브러리를 가져오는 부분입니다.


def get(max_count=1):

로 get이라는 함수를 하나 선언하였습니다.


max_count=1 의 의미는 만약 함수 호출시 인자가 없을경우에 기본값으로 1을 사용하겠다는 뜻입니다.



while 문으로 최소 1~n 개의 이미지를 다운로드 받습니다.


맨 아래에 get(1) 부분에서 숫자값을 변경한 만큼 해당하는 갯수의 이미지를 크롤링하여 img 폴더에 저장합니다.


base_url = "http://10000img.com/" # 이미지 src와 조합하여 다운받을 주소
url = "http://10000img.com/ran.php" # 접속할 URL

base_url 변수는 이미지 src와 조합 할 주소입니다.


만약 이미지 src(경로)가 img/a.png 라고 하면


http://10000img.com/img/a.png 로 접속하면 해당 이미지가 있습니다.


다운로드 받기위해 추가하였습니다.



그 아래에 url 변수는 크롤러가 접속할 경로입니다.


url 경로로 접속하여 이미지영역을 추출하고 src 속성을 추출하여


base_url와 조합한 후 이미지를 다운받는 구조입니다




그 아래의 count 변수는 현재 몇개의 이미지를 다운받았는지 카운트하기 위한 변수입니다.






html = urllib.request.urlopen(url)
source = html.read()

위에 코드는 접속할 url에 접속하여 html 소스코드를 source 변수에 저장하는 부분입니다.




soup = BeautifulSoup(source, "html.parser")

img = soup.find("img") # 이미지 태그
img_src = img.get("src") # 이미지 경로
img_url = base_url + img_src # 다운로드를 위해 base_url과 합침
img_name = img_src.replace("/", "") # 이미지 src에서 / 없애기

HTML 코드를 뽑아왔으니 이제 필요한 부분만 추출해야하죠


이런 작업을 파싱이라고 합니다.


필요없는 부분은 빼고 필요한 부분만 추출하는 작업을 BeautifulSoup 라이브러리에서 처리할 수 있습니다.


- 불러온 HTML 소스를 기반으로 하여 BeautifulSoup 객체를 생성합니다.


- 그리고 soup.find() 메소드를 통해 원하는 영역을 추출할 수 있죠


- find("img") 라고 하면  HTML의 img 태그를 하나 가져옵니다.


- 그리고 가져온 img 태그에서 get("src") 를 통해 src 속성을 추출합니다.


- 다운로드 받을 경로는 base_url  + 방금 추출한 src 데이터와 조합해줍니다.


 - 마지막으로 파일이름을 위해 src의 / 문자를 모두 지워서 사용할 파일이름으로 저장합니다.





find() 메소드는 태그를 추출할 때 사용하고

get() 메소드는 속성(src, href 등)을 추출할 때 사용합니다.






urllib.request.urlretrieve(img_url, "./img/" + img_name)

print("이미지 src:", img_src)
print("이미지 url:", img_url)
print("이미지 명:", img_name)
print("\n")
count += 1 # 갯수 1 증가

urllib의 urlretrieve를 통해 해당 URL의 데이터를 다운받을 수 있습니다.


위에서 base_url + src 를 조합한 링크로 접속하여 파일을 다운받습니다.


그리고 경로와 파일이름을 지정할 수 있는데 저는 img 폴더에 저장할것이기 때문에 "./img/" + 파일이름 으로


작성하였습니다.


아래 print 함수는 데이터를 그냥 출력하기 위해 작성하였습니다.



이미지를 다운받았으니 카운트를 1 증가시켜야겠죠?



1~n 까지 카운트를 증가시키면서 계속 다운받도록 하는 구조입니다.




한번 이미지 25개를 크롤링하여 저장해보도록 하겠습니다.






25개를 다운받을것이기 때문에 get 함수에 25를 전달해줍니다.







아래와 같이 이미지들이 저장됩니다.







아래는 파일은 소스코드입니다.


10000img.zip





더 자세한 설명이 필요하면 댓글로 남겨주세요!







다음 포스팅은 추가기능에 대해 올리도록 하겠습니다. 




감사합니다.

댓글
  • 프로필사진 ww File "D:\anaconda\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
    File "D:\anaconda\lib\urllib\request.py", line 511, in open
    req = Request(fullurl, data)
    File "D:\anaconda\lib\urllib\request.py", line 329, in __init__
    self.full_url = url
    File "D:\anaconda\lib\urllib\request.py", line 355, in full_url
    self._parse()
    File "D:\anaconda\lib\urllib\request.py", line 384, in _parse
    raise ValueError("unknown url type: %r" % self.full_url)
    ValueError: unknown url type: 'http//10000img.com/ran.php'

    이런 오류가 나는데 왜 그런가요..
    2018.11.06 10:38
  • 프로필사진 ww File "D:\anaconda\lib\urllib\request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
    File "D:\anaconda\lib\urllib\request.py", line 511, in open
    req = Request(fullurl, data)
    File "D:\anaconda\lib\urllib\request.py", line 329, in __init__
    self.full_url = url
    File "D:\anaconda\lib\urllib\request.py", line 355, in full_url
    self._parse()
    File "D:\anaconda\lib\urllib\request.py", line 384, in _parse
    raise ValueError("unknown url type: %r" % self.full_url)
    ValueError: unknown url type: 'http//10000img.com/ran.php'

    이런 오류가 나는데 왜 그런가요..
    2018.11.06 10:38
  • 프로필사진 BlogIcon 이근둥 URL 확인해주세요.

    http//10000img.com/ran.php (X)
    http://10000img.com/ran.php (O)
    2018.11.14 23:07 신고
  • 프로필사진 bj base_url and url 주소사용 방법이 헷갈리는데요 자세한 설명좀 들울수 있을까요?
    예를들면 https://www.newegg.com/global/de-en 해당사이트에 있는 카테코리별로 전부 다운 받고 싶은데 사용 방법이 헷갈립니다.
    그리고 혹시 이미지랑 가격 정보 품명들을 같이 받을수 있나요..예로들면 이미지는 이미지데로 저장되고 나머지 정보들은 엑셀로 저장되는 방식으로 가능한가요. 고수님 한수 부탁 드립니다.
    2018.11.15 20:38
  • 프로필사진 BlogIcon 이근둥 base_url과 url 부분은 해당 사이트를 분석해서 작성한 방식입니다. 뉴에그 사이트의 경우에는 어떻게 URL이 구성되어있는지 새로 분석하신 후 진행하셔야 할 것 같습니다.

    이미지 다운로드도 가능하고 엑셀 저장도 가능합니다. 이 부분에 대해서는 예제가 많으니 확인 바랍니다
    2018.11.26 12:00 신고
  • 프로필사진 help 받은 이미지들에서 원하지 않는 이미지들이 섞여있는건 어떻게 데이터를 정제할 수 있을까요?? 2020.03.25 21:24
  • 프로필사진 BlogIcon 이근둥 파일명이 존재하거나 관련 태그정보가 웹 페이지에 존재하는 경우에는 어느정도 필터링 할 수 있지만, 본 포스트에서 크롤링하는 웹 페이지의 경우 필터링할만한 데이터가 없습니다..

    다소 복잡해지지만 딥러닝이나 이미지 분석 로직을 구현하여 필터링하는 방법이 있을 수 있습니다.
    2020.03.25 21:42 신고
  • 프로필사진 비밀댓글입니다 2020.05.31 11:01
  • 프로필사진 BlogIcon 이근둥 코드나 참고할만한 자료를 올려주셔야 확인 가능합니다 2020.06.25 14:36 신고
  • 프로필사진 psg 페이지 부분에서 계속 오류가 나는건 왜 그럴까요?? 2021.04.25 12:31
댓글쓰기 폼