본문 바로가기

Data handling/Web crawling

[selenium] js 동적 페이지 크롤링 하기 (주로 댓글) iframe, #document 해결

728x90

문제점

특정 사이트의 댓글을 크롤링할때 문제가 발생한다.

selenium을 써도 해결이 안 된다. 

iframe, #document로 구성된 부분에 댓글이 들어가 있다. 문제는 이 안쪽 부분은 접근이 불가능하다는 것이다.

그러면 어떻게 해야할까?

 

해결책을 알게됐다.

iframe 내부에 있는 src 링크로 다시 들어간다. 거기서 selenium 크롤링을 다시 진행하면 된다.

새롭게 html, body 등이 구성되고 element에 접근이 가능한 걸 볼 수 있다.

핵심은 driver.get으로 iframe 내부 링크에 접속하는 것이다.

3 시간 삽질 결과 공유 끝

 

번외로 마약베개 리뷰 크롤링 예제를 공유한다.

from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_argument('window-size=1920x1080')
options.add_argument('disable-gpu')
options.add_argument('User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36')
options.add_argument('window-size=1920x1080')
options.add_argument('ignore-certificate-errors')

driver = webdriver.Chrome('/Users/dhkim/PycharmProjects/chromedriver',
                         chrome_options=options)
i = 1
review_text = []
while i < 3000:
    driver.get(f'https://review4.cre.ma/bodyluv.kr/products/reviews?product_code=44&iframe_id=crema-product-reviews-1&widget_style=&app=0&parent_url=https%3A%2F%2Fbodyluv.kr%2Fproduct%2F3%25EC%25B0%25A8-renewal-%25EB%25B0%2594%25EB%2594%2594%25EB%259F%25BD-%25EB%25A7%2588%25EC%2595%25BD%25EB%25B2%25A0%25EA%25B0%259C%2F44%2Fcategory%2F1%2Fdisplay%2F2%2F%3Fcrema-product-reviews-1-page%3D1&nonmember_token=&secure_device_token=V22e79cca7695db24d9472d3f54924cada9a0644ce8bf98a2c075119db5233df50&page={i}&iframe=1')
    time.sleep(1)

    for element in driver.find_element_by_class_name('reviews-product').find_elements_by_class_name('products_reviews_list_review'):
        try:
            more = element.find_element_by_class_name('mall-link-color')
            more.click()
            time.sleep(0.5)
        except:
            pass
        try:
            review_text.append(element.find_element_by_class_name('products_reviews_list_review__message_content').text)
        except:
            print(f'len_reviews : {len(review_text)}')
            continue
    if i>0 and i%10 == 0:
        print(review_text[i-10:i+1])
        with open('results.txt', 'a') as writer:
            for l in review_text[i-10:i+1]:
                writer.write(l)
    i += 1