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

  • 해당 url을 제시하셔야 테스트를 해보겠네요. 정영훈 2018.9.13 00:32
  • @정영훈 url 수정했습니다. 참고로 파이썬 인터프리터로 한줄한줄 실행하니 정상적으로 가져옵니다. 그래서 코드에 implicitly_wait를 떡칠해봤는데 고쳐지지 않네요.. 정보를 가져오기 위해선 아이디와 패스워드가 있어야되는점.. ㅠㅠ 왜 안되는지 이유만 말씀해주셔도 정말 감사하겠습니다. 이예진 2018.9.13 11:15

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)