오늘이 크롤링 마지막입니다..
오늘은 조금 난이도가 있는 실습을 통해 기능을 알아보도록 할게요~!
<실습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")
위 내용은 스마트인재개발원 수업 내용을 정리한 내용입니다!