안녕하세요
지난 포스팅에서 분석을 마쳤으니
이번엔 코드를 작성하여 실제로 구현해 봅시다.
먼저 시작 전에 파이썬이 설치되어 있어야합니다!
공식 홈페이지에서 다운받으시면 됩니다.
저는 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를 전달해줍니다.
아래와 같이 이미지들이 저장됩니다.
아래는 파일은 소스코드입니다.
더 자세한 설명이 필요하면 댓글로 남겨주세요!
다음 포스팅은 추가기능에 대해 올리도록 하겠습니다.
감사합니다.