카테고리 없음

크롤링_5

bb1714 2024. 10. 17. 08:35

오늘이 크롤링 마지막입니다.. 

 

오늘은 조금 난이도가 있는 실습을 통해 기능을 알아보도록 할게요~!

 

<실습1. 네이버지도를 활용해서 맛집 정보 수집 >

 

 0. 필요한 도구 가져오기

from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

 

 1. 브라우저 진행

driver = wb.Chrome()
driver.get("https://map.naver.com/p/")

 

 2. 검색창에 "동명동 맛집" 검색

     ※ 문제 :여기서 바로 선택자(검색할 부분)를 복사해서 가져오고 창을 끈 후 재실행하려하면 실행이 되지 않는다.

         원인 : 복사해오면 뒷부분이 난수인데 이건 아이디가 매번 바뀐다는 소리이다. 그러면 아이디 사용 X

         해결 : 다른 선택자를 사용하기 → class 또는 계층 활용

→  이러면 재실행이 안되므로 아래 코드 양식에 따라 적어주시면 됩니다~

search = driver.find_element(By.CSS_SELECTOR, "input.input_search")
search.send_keys("동명동 맛집")
search.send_keys(Keys.ENTER)

 

 3. 가게를 클릭해서 상세 정보 조회

    → 오류가 뜰 것이다. 

    - 오류 이름 : list index out of range  인덱스 0번이 없다. 즉 데이터가 수집이 안된다

    - 원인 : iframe 태그의 정보가 존재해서 

    - 해결책 : iframe태그의 데이터로 전환

   * 가끔 가게 이름이 짧으면 수집이 안된다. (2글자이상)

title = driver.find_elements(By.CSS_SELECTOR, "#_pcmap_list_scroll_container > ul > li > div.CHC5F > a > div > div > span.place_bluelink.TYaxT")
title[1].click()

 

 4. 원하는 iframe으로 화면을 전환

driver.switch_to.frame("searchIframe")

 

 5. 디테일 정보에서 가게 이름 수집

    - 또 오류가 뜰 것이다.

    - 원인 : 디테일 정보는 새로운 iframe에 데이터가 존재해서

    - 해결책 : iframe → 원본 iframe

detail = driver.find_element(By.CSS_SELECTOR, "#_title > div > span.GHAhO")
detail.text

 

 6. 새로운 iframe으로 전환

driver.switch_to.frame("entryIframe")

 

  7. iframe에서 원본으로 이동하는 방

driver.switch_to.default_content()

 

 

 위 내용을 한 번 더 정리해보겠습니다!

   1) 선택자가 변하는 경우가 존재 - 다른 선택자를 활용하면 된다.
   2) 데이터를 수집할 때, 선택자가 문제가 없는데 올바르게 수집이 안되면 무저건 iframe을 의심해라
   3) selenium에서 ifame을 조작하기 위해서는 화면 전환이 필요하다.
      - 원본에서 ifame으로 이동 -> switch_to.frame ("프레임 아이디")
      - iframe에서 다른 iframe으로 이동 -> switch_to.default.content() -> 원본을 이용해야한다.

 

 코드의 순서는 아래와 같이 됩니다!!

driver = wb.Chrome()
driver.get("https://map.naver.com/p/")
search = driver.find_element(By.CSS_SELECTOR, "input.input_search")
search.send_keys("동명동 맛집")
search.send_keys(Keys.ENTER)
driver.switch_to.frame("searchIframe")
title = driver.find_elements(By.CSS_SELECTOR, "#_pcmap_list_scroll_container > ul > li > div.CHC5F > a > div > div > span.place_bluelink.TYaxT")
title[1].click()
driver.switch_to.default_content()
driver.switch_to.frame("entryIframe")
detail = driver.find_element(By.CSS_SELECTOR, "#_title > div > span.GHAhO")
detail.text
driver.switch_to.default_content()

 

<실습2. 이미지 수집 >

 0. 필요한 도구 가져오기

from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 파일시스템을 위한 라이브러리 (폴더, 파일을 생성, 삭제, 수정)
import os
# 이미지의 경로를 실제 파일로 저장하는 라이브러리 
from urllib.request import urlretrieve

 

 1. 바탕화면에 폴더 생성

   -  코드 해석 : 바탕화면에 이미지라는 폴더가 없다면, 바탕화면에 이미지라는 폴더를 만들어줘 

if not os.path.isdir("C:/Users/smhrd/OneDrive/바탕 화면/이미지") :
    os.mkdir("C:/Users/smhrd/OneDrive/바탕 화면/이미지")

 

 2. 브러우저 접근

driver = wb.Chrome()\
driver.get("https://search.naver.com/search.naver?ssc=tab.image.all&where=image&sm=tab_jum&query=%EC%9D%B4%EC%8A%B9%EC%9A%B0#imgId=kvs_aqs%3Aweb_5ffe4904df0e983fe797de4bebc69f3f")

 

 3. 데이터 로딩을 위한 스크롤 작업 → while문으로 끝까지 수집 

body = driver.find_element(By.CSS_SELECTOR, "body")
while True :
    # 컴퓨터가 가지고 있는 정보를 변수에 저장
    first = driver.page_source
    body.send_keys(Keys.END)
    time.sleep(0.5)
    # 스크롤 후 변한 데이터를 변수에 저장
    next = driver.page_source
    if first == next :
        break;
    else :
        pass

 

 4. 이미지 태그 수집

img = driver.find_elements(By.CSS_SELECTOR,"#main_pack > section > div.api_subject_bx._fe_image_tab_grid_root.ani_fadein > div > div > div.image_tile._fe_image_tab_grid > div > div > div > div > img")
img

 

 5. src 조회

    → img태그는 컨텐츠가 없고 src "속성"을 조회해야한다.

        - get_attrivute("속성이름") img태그 or a태그에서 활용

img[0].get_attribute("src")

 

 6. 비어있는 리스트에 src값만 저장

src = []
for i in range(len(img)) :
    src.append(img[i].get_attribute("src"))

src

 

 7. 이미지 url을 실제 파일로 변환

for i in range(len(src)) :
    urlretrieve(src[i],"C:/Users/smhrd/Desktop/이미지/"+str(i)+".jpg")
    
driver.save_screenshot("스크린샷.jpg")

 

 

 위 내용은 스마트인재개발원 수업 내용을 정리한 내용입니다!