- 2
- 이니스프리
- 조회 수 777
안녕하세요?
새해의 첫 근무일 잘 보내고 계시는지요? ^^
어제 휴일이어서 예전에 작성한 Selenium을 이용하여 특정 element를 스크린 캡쳐하는 스크립트를 수정해봤는데요.
iframe 내의 element의 경우에 직접 접근할 수 없으므로 iframe_on = 1으로 대입한 경우에 switch_to.frame을 하도록 하도록 하였구요.
iframe_on = 0으로 대입한 경우에는 바로 element에 접근하도록 했는데요.
이렇게 일일이 iframe의 존재 여부 및 XPath값을 대입하지 않고서도
원하는 element의 XPath만 입력받아서 iframe 내부에 존재하는 element에 접근할 수 있는 방법을 생각해보고 있는데 쉽지 않네요 ㅠㅠ
제가 뭔가 웹에 대한 이해가 전반적으로 부족한 것 같기도 하구요~
Selenium에서는 XPath를 이용하여 바로 접근할 수 있지만, BeautifulSoup에서는 이런 방식이 허용되지 않는 문제와 겹쳐서 더욱 어려운 것 같네요.
특정 XPath에서 parent 노드의 iframe을 알아내서 그 XPath값을 얻어낸다면 해결될 수 있는 문제 같은데요.
1. //*[@id="post_688075132"] // parent :: iframe 이런 방식으로는 접근이 안 되는 것 같네요. 다른 접근 방법은 없을까요??
2. BeautifulSoup에서 Xpath를 지원한다면 조금 수월하게 해결될지도 모르겠는데 그렇다면 lxml이나 htmlement를 사용하면 해결 가능할까요??
(설치해서 시도는 해봤는데 아직까지는 잘 안 되네요 ㅠㅠ)
그럼 주말에 다시 날씨가 쌀쌀해진다는데 감기 조심하시구요.
스포어 회원님들께 항상 감사드립니다!
좋은 오후 되세요~ ^^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | from selenium import webdriver from selenium.webdriver.firefox.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 from PIL import Image from io import BytesIO import time options = Options() options.headless = True driver = webdriver.Firefox(options = options) driver.implicitly_wait( 10 ) xpath_e = '//*[@id="post_689072432"]' driver.get(url) time.sleep( 1 ) WebDriverWait(driver, 5 ).until(EC.visibility_of_all_elements_located((By.TAG_NAME, 'body' ))) # 전체 페이지의 사이즈를 구하여 브라우저의 창 크기를 확대하고 스크린캡처를 합니다. #driver.execute_script("document.body.style.zoom='zoom 100%'") page_width = driver.execute_script( 'return document.body.parentNode.scrollWidth' ) time.sleep( 1 ) page_height = driver.execute_script( 'return document.body.parentNode.scrollHeight' ) time.sleep( 1 ) driver.set_window_size(page_width, page_height) time.sleep( 1 ) png = driver.get_screenshot_as_png() time.sleep( 1 ) # 특정 element 및 해당 iframe의 위치를 구합니다. iframe_on = 1 # 만약 iframe이 없으면 0을 대입합니다. if iframe_on = = 1 : #WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="cafe_main"]'))) iframe = driver.find_element_by_xpath( '//*[@id="cafe_main"]' ) iframe_location = iframe.location iframe_size = iframe.size driver.switch_to.frame(iframe) time.sleep( 1 ) element = driver.find_element_by_xpath(xpath_e) image_location = element.location image_size = element.size # 이미지를 element의 위치에 맞춰서 crop 하고 저장합니다. im = Image. open (BytesIO(png)) if iframe_on = = 1 : left = image_location[ 'x' ] + iframe_location[ 'x' ] top = image_location[ 'y' ] + iframe_location[ 'y' ] right = image_location[ 'x' ] + iframe_location[ 'x' ] + image_size[ 'width' ] bottom = image_location[ 'y' ] + iframe_location[ 'y' ] + image_size[ 'height' ] else : left = image_location[ 'x' ] top = image_location[ 'y' ] right = image_location[ 'x' ] + image_size[ 'width' ] bottom = image_location[ 'y' ] + image_size[ 'height' ] im = im.crop((left, top, right, bottom)) rgb_im = im.convert( 'RGB' ) filename = 'screenshot.jpg' rgb_im.save(filename) print ( 'The element "' + xpath_e + '" was captured. : ' + filename) driver.quit() |
추가로 200포인트만큼 포인트 폭탄+를 받았습니다.