반응형
selenium을 이용해 크롤링하는 법이 궁금하다면 아래의 링크 참고
2021.09.15 - [Python] - [Python]Python selenium을 이용하여 웹에서 이미지 크롤링 후 다운
크롤링을 하다 보면 같은 요소의 이름이 같이서 크롤링이 잘 되지 않는 경우가있다.
얘를 들어 구글 이미지에서 강아지 사진을 크롤링하고 싶다 하자.
- 구글 이미지에 들어가 강아지를 검색하게 되면 이미지가 뜨고 이를 하나씩 클릭한 다음에 크게 나온 이미지를 다운하려고 한다. 이때 큰 이미지의 클래스 이름은 "n3VNCb"이다
- 하지만 코드를 잘 살펴보면 앞뒤로 작은 이미지 들의 클래스도 "n3VNCb"를 가지고 있는 것을 확인할 수 있다.
- 이럴 때에는 크롤링하고 싶은 요소의 상세주소를 알면 된다. 상세주소는 full xpath라 불린다.
- 원하는 요소의 코드에서 마우스 우클릭 -> Copy -> Copy full XPath
- 이제 이렇게 가지고 온 full XPath를 코드에 적용시켜보자.
- 적용시키는 방법은 기존과 크게 달라진 게 없지만 full XPath를 적용시킨 것이기 때문에 driver.find_element_by_xpath라는 함수를 쓴다. 아래 코드 밑에서 6번째 줄 참고
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=ri&ogbl") #이미지 페이지를 연다
elem = driver.find_element_by_name("q") #검색창을 찾는 문장 name이 q이다. 개발자 화면을 열어서 확인하면 된다.
elem.send_keys("강아지") #검색창에 '강이지' 입력
elem.send_keys(Keys.RETURN) #엔터키 입력 #스크롤을 맨 아래까지 내려줘서 이미지를 나오게 한다. # Get scroll height
last_height = driver.execute_script("return document.body.scrollHeight")
while True: # Scroll down to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page
time.sleep(1) # Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
print(new_height)
if new_height == last_height:
try :
driver.find_element_by_class_name('mye4qd').click()
time.sleep(3)
except :
break
last_height = new_height
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")#검색 후 나온 모든 이미지를 images에 넣는다. #여러가지를 찾을때는 elements
count = 1
for image in images :
try :
image.click() #모든 이미지들중 하나를 클릭
time.sleep(1)#위에 코드에서 이미지를 클릭한 후 이미지의 주소를(src)를 가지고와야 하는데 이미지가 불러와지기 전에 다음 코드가 실행되기때문에 일정 시간을 주는 코드이다.
imgUrl = driver.find_element_by_xpath("/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div/div[2]/a/img").get_attribute("src") #클릭한 이미지의 주소를 가지고온다. 기존에 class이름으로 찾는것을 하였지만 같은 이름이 어려개가 있어서 xpath로 수정하였다.
urllib.request.urlretrieve(imgUrl, 'C:/Users/lth11/Desktop/강아지/'+ '강아지' + str(count)+".jpg") #이미지 저장
count = count + 1
except :
pass
driver.close()
반응형
'Python' 카테고리의 다른 글
[Python 배열 섞기] random.shuffle 함수 (0) | 2022.08.08 |
---|---|
[Python selenium] WEB 스크롤 조정(올리기 내리기) (0) | 2022.07.04 |
[Python] try except 문 활용 에러 고치기urllib.error.HTTPError: HTTP Error 429: Too Many Requests (0) | 2022.05.27 |
[Python][datetime] 날짜, 시간 다양한 출력법 정리 (0) | 2022.05.26 |
[Python]Python selenium을 이용하여 웹에서 이미지 크롤링 후 다운 (0) | 2021.09.15 |