Data handling/Web crawling
[selenium] js 동적 페이지 크롤링 하기 (주로 댓글) iframe, #document 해결
study&grow
2021. 2. 12. 13:38
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