• 목록
  • 아래로
  • 위로

안녕하세요?


새해의 첫 근무일 잘 보내고 계시는지요? ^^



어제 휴일이어서 예전에 작성한 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를 사용하면 해결 가능할까요??

(설치해서 시도는 해봤는데 아직까지는 잘 안 되네요 ㅠㅠ)



그럼 주말에 다시 날씨가 쌀쌀해진다는데 감기 조심하시구요.


스포어 회원님들께 항상 감사드립니다!


좋은 오후 되세요~ ^^



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)

url = 'https://cafe.naver.com/joonggonara/689072432' # iframe을 사용한 예제 페이지로 중고나라를 선택했습니다.
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()



작성자
이니스프리 119 Lv. (0%) 1901910/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 2

포인트 폭탄+
이니스프리님 축하합니다.
추가로 200포인트만큼 포인트 폭탄+를 받았습니다.
comment menu
2020.01.02. 16:04

신고

"포인트 폭탄+님의 댓글"

이 댓글을 신고 하시겠습니까?

삭제

"포인트 폭탄+님의 댓글"

이 댓글을 삭제하시겠습니까?

이니스프리 작성자 → 포인트 폭탄+
profile image

포인트 폭탄+도 궁금했나 보네요 ^-^

comment menu
2020.01.02. 16:04

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 691
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4370
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4475
665 VPS에서의 Selenium 사용과 관련하여 질문 드립니다. 4 image 이니스프리 20.01.17.14:37 212
664 '링 피트 어드벤처'가 정말 운동이 되는가요?? 4 이니스프리 20.01.11.12:41 289
663 우분투만 사용하다가 페도라 13 / Centos 6.9 시험에 응시하려면 적응하기 어려울까요? ㅠㅠ 8 image 이니스프리 20.01.08.22:56 345
662 파이썬 에디터로 어떤 것이 좋나요? 14 NoYeah 20.01.08.21:08 4534
661 이미지 외부링크가 엑박으로 나온다면 어느 부분을 우선적으로 검토해야 될까요? 이니스프리 20.01.05.23:15 554
660 해상도는 다르지만 동일한 이미지인지 체크하는 방법이 있을까요? 2 이니스프리 20.01.05.20:52 511
659 Beautifulsoup에서 .find(text=True, recursive=False)과 관련하여 질문 드립니다. 2 이니스프리 20.01.03.23:11 1147
[Selenium] 특정 XPath에서 parent 노드의 iframe을 알아낼 수 있을까요? 2 이니스프리 20.01.02.16:04 393
657 [파이썬] 윈도우에서 pip install로 모듈 설치시에 문제가 발생하는 것과 관련하여 질문 드립니다 2 이니스프리 19.12.29.00:51 248
656 여러 개의 반복작업을 켜고 끄는 버튼을 비동기적으로 구현해보려고 하는데요 ㅠㅠ 2 이니스프리 19.12.27.23:10 200
655 유튜브 채널 주소 잘아시는분있나요? 2 슬기 19.12.27.09:55 187
654 Requests나 Selenium에서 어떤 XHR 전송이 있었는지 확인할 수 있는 방법이 있을까요? 3 이니스프리 19.12.26.18:47 226
653 카고야 VPS에서 메일이 왔는데 일본어 관련해서 질문 드립니다. 5 이니스프리 19.12.26.11:45 200
652 [파이썬] 결과를 print 문으로 출력하는 것과 파일로 출력하는 것과 결과가 왜 다른가요? 8 image 이니스프리 19.12.25.13:19 770
651 음성번역기 앱 중에 켜놓으면 계속 번역을 해주는 앱이 있을까요? 이니스프리 19.12.25.11:16 215
650 https://imgnbvip.com/ 라는 이미지 호스팅 사이트가 있나요? image 이니스프리 19.12.24.11:08 267
649 Google Developer Console의 API 라이브러리 무료 이용에 대해 질문 드립니다. 5 image 이니스프리 19.12.23.12:58 198
648 부산 맛집 추천 부탁드려요~! 3 image 이니스프리 19.12.20.19:00 174
647 [Requests] multipart/form-data의 전송에 대해 질문 드립니다 ^^ 4 이니스프리 19.12.18.22:00 2982
646 프로그래머스 코딩테스트 연습에서 효율성 심사를 통과하려면 어떻게 해야할까요? 2 이니스프리 19.12.18.01:55 2867