1. 사전작업
크롬브라우저 버전 체크하기
크롬 브라우저 > 설정 > 좌측하단의 크롬 정보 클릭해서 확인
이제 버전에 맞는 크롬 드라이버를 하단의 사이트에서 다운로드받자.
해당되는 버전을 클릭하면 하단과 같이 뜬다.
컴퓨터 OS에 따라 다운한다.
다운 -> 압축풀기 -> 크롬드라이버는 실행파일이 있는 경로로 이동한다.
img폴더는 다운받은 이미지들이 저장될 파일의 위치이다.
2. 초기세팅 시작
IDE : Jupyter notebook
!pip install selenium
!pip install beautifulsoup4
from urllib.request import urlopen
from urllib.parse import quote_plus as qp # 아스키코드로 변환
from bs4 import BeautifulSoup
from selenium import webdriver
import time
3. 이미지를 추출할 링크 찾기
"인스타그램"만 입력해서 검색해서 접속하면 인스타그램 로그인을 해야만한다.
하지만 "인스타그램 #인공지능"처럼 "인스타그램" + "#" 을 입력한 뒤 접속하면 로그인을 하지 않아도 이미지를 볼 수 있다.
링크를 복붙하면 '인공지능'이 하단과 같은 아스키코드로 변환된다.
www.instagram.com/explore/tags/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/
이 아스키코드부분은 검색어에 따라 변경된다.
위 url을 base부분과 아닌 부분으로 분리하자.
baseurl = 'https://www.instagram.com/explore/tags/'
plusurl = input('검색할 태그를 입력하세요 : ')
url = baseurl + qp(plusurl) # 입력한 언어를 아스키코드로 변환
한 번 테스트해보자
+. 왜 BeatifulSoup가 아닌 webdriver를 써야하지?
인스타그램은 다음 페이지를 클릭해서 추가로 이미지를 보는 방식이 아니라,
스크롤을 내림으로써 이미지가 추가되는 방식이다.
즉, 자바스크립트로 구동되는 사이트이기에 BS가 아닌 webdriver를 써야한다.
4. webdriver를 사용해보자
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html)
5. 어떤 태그를 가져와야할까?
첫번째, 두번째, ... 이미지 태그는 공통적으로 다음 클래스명을 지녔다.
클래스명(총 3개) : v1Nh3 kIKUG _bz0w
이를 참고해서 1번째 이미지만 가져와보기 위한 코드는 다음과 같다.
baseurl = 'https://www.instagram.com/explore/tags/'
plusurl = input('검색할 태그를 입력하세요 : ')
url = baseurl + qp(plusurl)
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3) # 딜레이 방지용
html = driver.page_source
soup = BeautifulSoup(html)
insta = soup.select('.v1Nh3.kIKUG._bz0w')
print(insta[0])
driver.close()
※ 실행 결과
우린 여기보이는 src를 가져와야 한다는 것을 잊어선 안된다.
6. 이미지와 이미지 링크(주소) 가져오기
가져올 이미지의 링크 a태그의 속성 href를 참고하면 된다.
<a href = "/p/CMUL03YFI93/">
진행해보자.
실행결과
위와 같이 링크를 받았다.
하지만 링크앞에 공통적인 url이 들어가야만 링크접속이 가능하므로
다음 코드를 추가하자.
7. 이미지를 다운받아 img폴더에 저장하자.
a. 이미지가 속해있는 태그(클래스명 : KL4Bh)를 가져오고
b. 이 태그에서 src에 대한 정보만 가져오자.
for i in insta :
print('https://www.instagram.com'+i.a['href']) # a태그의 속성 href만 가져오기
imgUrl = i.select_one('.KL4Bh').img['src'] # 이미지가 속한 태그 > src태그만 가져오기
이제 수집한 정보를 바탕으로 이미지를 저장해보자
# 이미지 저장하기
with urlopen(imgUrl) as f :
# 저장위치 : img폴더
# 파일명 : 검색어 + 순서, 확장자 : jpg, 이미지파일쓰기 : wb
with open('./img/' + plusUrl + str(n) + '.jpg', 'wb') as h :
img = f.read()
h.write(img)
n += 1 # 순번. 먼저 변수 n = 1을 선언해야한다.
전체코드는 다음과 같다.
baseUrl = 'https://www.instagram.com/explore/tags/'
plusUrl = input('검색할 태그를 입력하세요 : ')
url = baseUrl + qp(plusUrl)
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)
html = driver.page_source
soup = BeautifulSoup(html)
insta = soup.select('.v1Nh3.kIKUG._bz0w') # 이미지 클래스명
# 이미지 수집, 저장하기
# 참고로, 이미지추가하는 스크롤 기능 미사용
n = 1 # 이미지 순번
for i in insta :
print('https://www.instagram.com'+i.a['href']) # a태그의 속성 href만 가져오기
imgUrl = i.select_one('.KL4Bh').img['src'] # 이미지가 속한 태그 > src태그만 가져오기
# 이미지 저장하기
with urlopen(imgUrl) as f :
# 저장위치 : img폴더
# 파일명 : 검색어 + 순서, 확장자 : jpg, 이미지파일쓰기 : wb
with open('./img/' + plusUrl + str(n) + '.jpg', 'wb') as h :
img = f.read()
h.write(img)
n += 1
driver.close() # 작업완료후 웹드라이버 종료
결과물
도움되셨다면, 하단의 하트 ❤️ 클릭!
'● 크롤링, 자동화 > Selenium' 카테고리의 다른 글
Selenium 에서 헤더 User-Agent 값 수정하기 (0) | 2021.05.19 |
---|---|
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".p"} (Session info: chrome=90.0.4430.212) (0) | 2021.05.19 |
[잔재미] 셀레니움 이미지 크롤링 (1) | 2021.02.08 |
구글 로그인, 메일 보내기 자동화 (selenium, webdriver, actionchains) (0) | 2020.11.08 |
selenium 자동화 수집하기 (0) | 2020.11.08 |