인스타그램 크롤링, 게시물 내 모든 이미지 다운로드 (2)
인스타그램, 게시물 내 모든 이미지 다운로드
인스타그램 게시물은 단일 이미지가 아닌, 2개 이상의 이미지를 포함하는 게시물이 대부분이다.
지난 포스팅에 이어 게시물 내의 포함된 이미지를 모두 다운로드하는 크롤링 코드에 대해 다루겠다.
지난번 글과 같은 환경에서의 진행이니, 환경을 처음 구성하고자 하면 이전글을 참고하면 된다.
[플랫폼&기술 리뷰/소프트웨어] - 인스타그램 크롤링, 이미지 다운로드 (1)
인스타그램 크롤링, 이미지 다운로드 (1)
인스타그램 게시물 이미지 다운로드 크롤링을 통해 인스타그램 내 게시물의 이미지를 다운로드하는 과정에 대해 다뤄보고자 한다. 크롤링을 수행하기 위해 파이썬, 셀레니움, 크롬 브라우저가
proefforter.tistory.com
크롤링 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import requests
# url 입력
url = input("url : ")
# 크롬드라이버 기본 세팅
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)
# 이미지 객체 저장 변수 및 url저장 변수 선언
img_url = []
images = []
# 이미지 객체 찾기
images.append(driver.find_elements(By.CLASS_NAME, "x5yr21d.xu96u03.x10l6tqk.x13vifvy.x87ps6o.xh8yej3"))
try:
while(1):
# 다음 버튼 클릭 0.5초 지연시간 설정
sleep(0.5)
# 다음 버튼이 화면에 존재할 경우, 다음 버튼 클릭후 다음차례의 이미지 저장
driver.find_element(By.CLASS_NAME,"_afxw._al46._al47").click()
images.append(driver.find_elements(By.CLASS_NAME, "x5yr21d.xu96u03.x10l6tqk.x13vifvy.x87ps6o.xh8yej3"))
# 수집한 이미지 객체 중, 3번째 객체까지 이미지 소스주소를 수집한다.
for i in range(images.__len__()):
for j in range(images[i].__len__()):
if(j>=3):
break
img_url.append(images[i][j].get_attribute('src'))
# 수집한 이미지 객체 자료들 비우기
images.clear()
except:
# 다음버튼이 존재하지 않을 경우
# 리스트 - 셋 - 리스트 형변환으로 중복 데이터 삭제
img_url = list(set(img_url))
print(f"{img_url.__len__()}장의 이미지를 확인했습니다.")
# 수집한 이미지 다운로드
for i in range(img_url.__len__()):
response = requests.get(img_url[i])
filename = 'image{}.jpg'.format(i)
with open(filename, 'wb+') as f:
f.write(response.content)
print("사진 수집이 완료되었습니다.")
다수의 이미지를 포함하는 인스타그램 게시물의 이미지를 다운로드하는 코드이다.
29라인에서 3번째 객체까지만 이미지 주소를 추출하는 이유는 4번째부터는 타 게시물의 썸네일 이미지이기 때문이다.
41라인에서는 리스트(list) → 셋(set) → 리스트(list)의 형변환 과정으로 셋의 특성을 이용해 중복데이터를 제거했다.
사용예제
픽사베이 공식 인스타그램 계정의 게시물을 대상으로 진행하였다.
총 9개의 이미지를 포함하는 게시물이며, 해당 주소를 복사하여 url로 입력하였다.
코드를 컴파일한 후, 픽사베이의 게시물의 주소를 입력했다.
정확하게 9개의 이미지를 확인한 것을 알 수 있으며, 사진 수집이 완료되었다는 문구가 나타난다.
0부터 8까지의 순서로 총 9개의 이미지를 정상적으로 폴더에 저장했다.
궁금한 사항이나 질문, 피드백 등 의견을 댓글로 남겨주시면 답변드리겠습니다.
감사합니다.