Python selenium 크롤링 질문입니다! (URL 수정)
조회수 3719회
제가 어느 사이트에서 조건에 맞는 제품을 크롤링하려고 하는데, 동적으로 제품 리스트를 불러오는 것 같아 selenium을 사용해 코드를 작성했습니다.
이 사이트의 구조가 제품의 리스트를 보여주는 url과 어떤 조건을 입력하고 제품의 리스트를 보여주는 url이 같습니다. ex) Product/data (제품 리스트) Product/data(제품 색상:핑크 조건을 검)
자바스크립트로 제어하는거겠죠?
그래서 selenium을 사용해서 조건을 입력하고, 검색한 후 검색된 제품의 리스트를 가져오려고 하는데..... driver.page_source로 html을 보면 전체 제품 리스트를 가져오는 html을 가져오게됩니다!!!!!
설명하자면 검색 조건에 핑크색 이라는 조건을 걸면 핑크색 제품 리스트만 있는 html 코드를 가져와야하는데 전체 제품 리스트 html코드를 가져오게 됩니다....
이상하게도 selenium을 실행할 때 페이지가 슝슝 이동하잖아요 그때는 핑크색 제품 리스트만 있습니다. 개발자도구로 검사할 때도 해당 제품이 검사가 잘 되는데!!!!
이상하게 크롤링만 하면 전체 리스트 제품을 보여주는 html 코드를 가져옵니다. 조건에 맞는 제품도 없어요. 그냥 처음에 보여지는 제품들만 보여줍니다.
이게 무슨 ....... 어떻게 처리해야할까요? 고수님들.. ㅠㅠ 검색해도 도저히 찾을 수 없어 이렇게 질문을 올립니다.
코드도 올려보겠습니다.
사이트URL,id,password는 임시로 넣은겁니다.
def get_product():
driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(3)
driver.get('http://carmanager.co.kr/')
driver.find_element_by_name('userid').send_keys('id')
driver.find_element_by_name('userpwd').send_keys(''pwd')
driver.find_element_by_xpath('//*[@id="ui_loginarea"]/tbody/tr/td[2]/button').click() # 로그인
driver.implicitly_wait(5)
driver.get('http://carmanager.co.kr/Car/Data')
driver.find_element_by_name('search_num').send_keys('12다4506')
driver.find_element_by_xpath('//*[@id="search"]/div/div[4]/table/tbody/tr/td[2]/button').click() # 제품 검색
driver.implicitly_wait(20)
html = driver.page_source # 제품을 검색 후, 나온 결과 html 코드
return html
1 답변
-
headless 모드로 해보시기 바랍니다.
options = webdriver.ChromeOptions() options.add_argument('headless') driver = webdriver.Chrome('chromedriver', chrome_options=options)
driver.implicitly_wait(5) 코드는 driver.get('http://carmanager.co.kr/') 다음에만 넣어보시고요
driver.get('http://carmanager.co.kr/') driver.implicitly_wait(5)
- 해결했습니다! 감사합니다. 저 코드에서 implicitly_wait를 중간 빼고 time.sleep(5)을 넣으니 되긴 하더라구요. 답변대로 실행하니 sleep 없어도 실행이 되네요! headless모드에서는 왜 되는지 이유를 알 수 있을까요? 이예진 2018.9.13 15:12
- 느린거죠 모...headless로 사용하면 실제 렌더링 하는 작업은 없으니까요. 정영훈 2018.9.13 15:26
- 엥? 근데 지금보니 헤드리스 모드만 쓰면 안되네요 ..?? sleep을 써야 나옵니다 ㅠ_ㅠ 이예진 2018.9.13 15:50
- get 다음정도만 잠깐 딜레이 시켜주면 될 듯 하네요 정영훈 2018.9.13 17:19
댓글 입력