빅데이터 서비스 교육/크롤링

크롤링 이미지 가져오기

Manly 2022. 5. 17. 09:44
반응형

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