728x90

https://link2me.tistory.com/2003 에서 작성한 코드를 수정하여 엑셀로 저장하기 위한 부분을 보완하고 엑셀 저장을 시도했다.

텍스트 저장은 잘 되는데 엑셀에 이미지 저장하는 것은 실패가 된다.

이미지를 저장하는 속도 문제인지 여부는 테스트를 좀 더 해봐야 할 거 같다.

그래서 이미지 URL 을 텍스트로 저장하는 로직으로 코드를 구현했다.

 

# pip install selenium
# pip install chromedriver-autoinstaller 
# pip install bs4
# pip install xlsxwriter
 
from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
# 엑셀 처리 임포트
import xlsxwriter
# 이미지 바이트 처리
from io import BytesIO
import requests
 
# 다나와 사이트 검색
 
options = Options()
options.add_argument('headless'); # headless는 화면이나 페이지 이동을 표시하지 않고 동작하는 모드
 
# Excel 처리 선언
savePath = "c:/Users/zx/Documents/Python/"
workbook = xlsxwriter.Workbook(savePath + 'crawling_result.xlsx')
 
# 워크 시트
worksheet = workbook.add_worksheet()
 
# webdirver 설정(Chrome, Firefox 등)
chromedriver_autoinstaller.install()
driver = webdriver.Chrome(options=options) # 브라우저 창 안보이기
# driver = webdriver.Chrome() # 브라우저 창 보이기
 
# 크롬 브라우저 내부 대기 (암묵적 대기)
driver.implicitly_wait(5)
 
# 브라우저 사이즈
driver.set_window_size(1920,1280)
 
# 페이지 이동(열고 싶은 URL)
driver.get('http://prod.danawa.com/list/?cate=112758&15main_11_02')
 
# 페이지 내용
# print('Page Contents : {}'.format(driver.page_source))
 
# 제조사별 검색 (XPATH 경로 찾는 방법은 이미지 참조)
mft_xpath = '//*[@id="dlMaker_simple"]/dd/div[2]/button[1]'
WebDriverWait(driver,3).until(EC.presence_of_element_located((By.XPATH,mft_xpath))).click()
 
# 원하는 모델 카테고리 클릭 (XPATH 경로 찾는 방법은 이미지 참조)
model_xpath = '//*[@id="selectMaker_simple_priceCompare_A"]/li[16]/label'
WebDriverWait(driver,3).until(EC.presence_of_element_located((By.XPATH,model_xpath))).click()
 
# 2차 페이지 내용
# print('After Page Contents : {}'.format(driver.page_source))
 
# 검색 결과가 렌더링 될 때까지 잠시 대기
time.sleep(3)
 
# 현재 페이지
curPage = 1
 
# 크롤링할 전체 페이지수
totalPage = 6
 
# 엑셀 행 수
excel_row = 1
 
worksheet.set_column('A:A'40# A 열의 너비를 40으로 설정
worksheet.set_row(0,18# A열의 높이를 18로 설정
worksheet.set_column('B:B'12# B 열의 너비를 12로 설정
worksheet.set_column('C:C'60# C 열의 너비를 60으로 설정
 
worksheet.write(00'제품 모델명')
worksheet.write(01'가격')
worksheet.write(02'이미지')
 
while curPage <= totalPage:
    #bs4 초기화
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    # 상품 리스트 선택
    goods_list = soup.select('li.prod_item.prod_layer')
 
    # 페이지 번호 출력
    print('----- Current Page : {}'.format(curPage), '------')
 
    for v in goods_list:
        # 상품모델명, 가격, 이미지
        name = v.select_one('p.prod_name > a').text.strip()
        if not 'APPLE' in name:
            continue
        price = v.select_one('p.price_sect > a').text.strip()
        img_link = v.select_one('div.thumb_image > a > img').get('data-original')
        if img_link == None:
            img_link = v.select_one('div.thumb_image > a > img').get('src')
 
        imgLink = img_link.split("?")[0].split("//")[1]
        img_url = 'https://{}'.format(imgLink)
        
        # 이미지 요청 후 바이트 반환
        res = requests.get(img_url) # 이미지 가져옴
        img_data = BytesIO(res.content) # 이미지 파일 처리
        image_size = len(img_data.getvalue()) # 이미지 사이즈 
 
        # 엑셀 저장(텍스트)
        worksheet.write(excel_row, 0, name)
        worksheet.write(excel_row, 1, price)
 
        # 엑셀 저장(이미지)
        if image_size > 0# 이미지가 있으면
            # worksheet.insert_image(excel_row, 2, img_url, {'image_data' : img_data})
            worksheet.write(excel_row,2,img_url) # image url 텍스트 저장
 
        # 엑셀 행 증가
        excel_row += 1
 
        # print(name,', ', price,', ', img_url)
    print()
 
    # 페이지 수 증가
    curPage += 1
 
    if curPage > totalPage:
        print('Crawling succeed!')
        break
 
    # 페이지 이동 클릭
    cur_css = 'div.number_wrap > a:nth-child({})'.format(curPage)
    WebDriverWait(driver,3).until(EC.presence_of_element_located((By.CSS_SELECTOR,cur_css))).click()
 
    # BeautifulSoup 인스턴스 삭제
    del soup
 
    # 3초간 대기
    time.sleep(3)
 
# 브라우저 종료
driver.close()    
 
# 엑셀 파일 닫기
workbook.close() # 저장
 

 

728x90
블로그 이미지

Link2Me

,