from selenium import webdriver as wb
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bs
import time
import os # 파일 시스템을 위한 라이브러리 ex)파일, 폴더를 생성, 존재여부 파악
from urllib.request import urlretrieve as urlre # 이미지경로를 파일로 저장
이미지 태그는 <img> 단일태그 닫는 태그가 없다.
이미지를 가져올때 src 속성을 가져와야 한다.
url = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query=%EB%A9%9C%EB%A1%A0'
driver = wb.Chrome()
driver.get(url)
soup = bs(driver.page_source, 'lxml')
img = soup.select('._image._listImage')
img[0]['src']
'https://search.pstatic.net/common/?src=http%3A%2F%2Fshop1.phinf.naver
.net%2F20210831_234%2F1630381142794WGozq_JPEG%2F31516922480114398_951454598.jpg&type=a340'
img에서 src만 img_list에 저장
img_list=[]
for i in img:
img_list.append(i['src'])
img_list
['https://search.pstatic.net/common/?src=http%3A%2F%2Fshop1.phinf.naver.net%2F20210831_234%2F1630381142794WGozq_JPEG%2F31516922480114398_951454598.jpg&type=a340',
'https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAyMTA5MDFfMjcw%2FMDAxNjMwNDI2NTA1NjUx.aOTj3WO6oBdP5irspjEujqvV1QHKWUHH6B3UFWYscL4g.21ygh9DecaY0CG0tm7lwcoJouID15ZbuAMgBRr6GjZog.JPEG.dalepowersa%2Fdb4daa5644fe011934804dacef5003b7579ccd22de7d3e9478dcd6f5b6a6.jpg&type=a340',
'https://search.pstatic.net/common/?src=http%3A%2F%2Fpost.phinf.naver.net%2FMjAyMTA3MDVfMTQ4%2FMDAxNjI1NDUwMzAwNTA4.TBhC6lZ6lGf5b2YIXOYeuhyApqvX6BuLUA0hYd-TLegg.suzVVclCfDC9NCztKcNhbQ55t9TE5VaNsD8Luarg-d0g.JPEG%2FIegGvCnJkHnH7OMmS8A_5bc3TNAQ.jpg&type=a340', 'https://search.pstatic.net/common/?src=http%3A%2F%2Fshop1.phinf.naver.net%2F20211005_288%2F1633436412583Bxqly_JPEG%2F34572301263674480_869668248.jpg&type=a340',
'https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAyMjA1MDdfMTcx%2FMDAxNjUxODU0NjM5MDQw.pm0CzsJXl_j6LgsQQSGhLmFQhSDb8b4d2Vjd4X0Q6rQg._7m6hUR17G84ZO0SZXawCJ16kXCvAlvBtCvLsweL02og.JPEG.fruit_inthe_garden%2F7FB2F29A-72E3-42EC-B13F-9F12B29D812D-424-00000042D2C9E2CC.jpg&type=a340',
'https://search.pstatic.net/common/?src=http%3A%2F%2Fblogfiles.naver.net%2FMjAyMjA0MjNfMjQg%2FMDAxNjUwNzIwMDE0MzY5.k7nrQGS9w0qKfd6hR6VwAuxnDRvxi4yum_4_UyHf6Mgg.Bcz8FZa1kHOSe7FS3UsSMnAfUy11N_MTuvAVHKBBW6Yg.JPEG.bravo1904%2F20220423_192343.jpg&type=a340',
.........................................
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7']
os.path.isdir('./이미지') -> ./ :현재 폴더 에 이미지라는 폴더가 있나?
os.mkdir('./이미지') -> mkdir -> make directory / 현재 폴더에 이미지 라는 폴더를 만든다.
폴더를 만들고 한번 더 실행하면 오류가 나는데
다음과 같이 현재 폴더에 이미지 폴더가 없을때 이미지 폴더를 생성하게 조건문으로 만들어준다
if not os.path.isdir('./이미지'):
os.mkdir('./이미지')
print('폴더생성')
# urlretrieve(src값, 저장 할 경로/저장할 파일명.확장자)
urlre(img_list[0], './이미지/1.jpg')
↓
('./이미지/1.jpg', <http.client.HTTPMessage at 0x25d56397c40>)
# 이미지 폴더에 해당 이미지 저장
# 반복문으로 이미지 폴더에 이미지들 저장
for i in range(len(img_list)):
urlre(img_list[i], f'./이미지/'+str(i)+'.jpg')
# './이미지/'{}.jpg'.format(i) -> 반복해서 파일명을 지정해주는것
img_list[14] -> 비어있는 이미지가 있다
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
위와 같이 나오는데 이미지도 스크롤을 내려야 나오기 때문에 위와 같이 나온다.
스크롤 내려주기
scroll = driver.find_element_by_css_selector('body')
for i in range(50):
scroll.send_keys(Keys.PAGE_DOWN)
time.sleep(0.3)
스크롤 내린 후에 다시 데이터 가져오기
soup = bs(driver.page_source, 'lxml')
img = soup.select('._image._listImage')
img_list=[]
for i in img:
img_list.append(i['src'])
len(img_list
545
이미지 저장
for i in range(len(img_list)):
urlre(img_list[i], f'./이미지/'+str(i)+'.jpg')
아직 잘 저장되지 않는 이미지가 있긴한데 전보다 잘 저장된다.
이미지가 나오지 않는것은 img에서 확인해봐도 src = data:image로 시작하고
data-lazy-src가 https://로 시작한다.
이미지가 잘 저장되는것은 data-lazy값이 없고 src가 https://로 시작한다.
for i in img:
try:
img_list.append(i['data-lazy-src'])
except:
img_list.append(i['src'])
위와 같이 data-lazy-scr값이 있을땐 그 값으로 append해주고
data-lazy-scr값이 없을땐 오류가 나니까 except문으로 빼서 src값을 넣을 수 있게 해준다
soup = bs(driver.page_source, 'lxml')
img = soup.select('._image._listImage')
img_list=[]
for i in img:
try:
img_list.append(i['data-lazy-src'])
except:
img_list.append(i['src'])
for i in range(len(img_list)):
urlre(img_list[i], f'./이미지/'+str(i)+'.jpg')
모든 사진이 다 잘 저장된다.
다른 사진 검색 후 가져와보기
웹페이지 접근제어
url = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query=%EC%9E%A5%EB%AF%B8%EC%B6%95%EC%A0%9C'
driver = wb.Chrome()
driver.get(url)
폴더생성
if not os.path.isdir('./이미지2'):
os.mkdir('./이미지2')
print('폴더생성')
스크롤 내려주기
body = driver.find_element_by_css_selector('body')
for i in range(50):
body.send_keys(Keys.PAGE_DOWN)
time.sleep(0.3)
파싱 / 이미지태그 수집 후 저장
soup = bs(driver.page_source,'lxml')
img = soup.select('._image._listImage')
img_list=[]
for i in img:
try:
img_list.append(i['data-lazy-src'])
except:
img_list.append(i['src'])
for i in range(len(img_list)):
urlre(img_list[i],'./이미지2/'+str(i)+'.jpg')
티쳐블 머신
분류모델
이미지(멜론), 이미지2(장미) 폴더의 이미지들을 각 200정도씩 넣고 학습하기진행 후
학습하지 않은 멜론 or 장미 사진을 넣어서 멜론 / 장미인지 분류 할 수 있다.
탭전환
url = 'https://www.naver.com'
driver = wb.Chrome()
driver.get(url)
ctrl+클릭으로 새탭에 페이지를 띄우는데
# 현재 활성화된 탭 확인
print(driver.window_handles) 로 보면 띄워진 페이지 수 만큼 나온다
['CDwindow-6BFB3164C6E0B090FAA230E10597A15B', 'CDwindow-39F80D256762917D0DEAC0276B970767']
# 탭전환
driver.switch_to.window('CDwindow-39F80D256762917D0DEAC0276B970767')
첫 페이지에서 두번째 페이지로 이동
driver.switch_to.window(driver.window_handles[0])
다시 첫페이지로 이동
탭전환 후 파싱을 해야 정보를 가져올 수 있다.
# 브라우저 종료
driver.quit()
'빅데이터 서비스 교육 > 크롤링' 카테고리의 다른 글
크롤링 (0) | 2022.05.18 |
---|---|
크롤링 웹페이지 데이터 수집 (0) | 2022.05.16 |
크롤링 데이터 수집 및 웹페이지 제어 (0) | 2022.05.13 |
크롤링 기초 (0) | 2022.05.12 |