새소식

크롤링

파이썬 크롤링(crawling) :: 탭 전환하며 동적 크롤링 하기(selenium) - 2

  • -

이번에는 좀 더 동적으로 크롤링 하기 위한 방법을 알아보려 합니다

seleium을 이용해서 크롤링을 진행하려 합니다

https://hoho325.tistory.com/265

 

파이썬 크롤링(crawling) :: selenium 이용하여 카카오맵 동적 크롤링 하기 - 1

크롤링을 하려다 보면 페이지 url로 하는게 아니라 동적으로 처리되는 경우가 있습니다 예를들어 다음 지도의 경우 주소는 다 그대로인데 아래의 내용들만 바뀝니다!! 예를들어 강남 스타벅스라

hoho325.tistory.com

 

selenium의 기초가 궁금하신 분들은 위의 글을 참고해주세요!!

이번에는 탭 전환을 하면서 검색하는 것을 해보려고 합니다

저번에는 검색해서 검색목록의 장소명을 가져오는 것 까지 했었는데요

이번에는 장소의 상세정보까지 확인하는 것을 해보겠습니다

 

우선 로직을 설명드리겠습니다

1. 검색어 입력

2. 검색 버튼 클릭

3. 검색 목록 뽑아내기

4. 상세보기 버튼 누르기 및 탭 전환하기

5. 탭 끄고 검색 탭으로 전환하기

 

search_area = driver.find_element_by_xpath('//*[@id="search.keyword.query"]') # 검색 창
search_area.send_keys(place)  # 검색어 입력
driver.find_element_by_xpath('//*[@id="search.keyword.submit"]').send_keys(Keys.ENTER)  # Enter로 검색
    
html = driver.page_source

soup = BeautifulSoup(html, 'html.parser')
cafe_lists = soup.select('.placelist > .PlaceItem')

for i, cafe in enumerate(cafe_lists):
    place_name = cafe.select('.head_item > .tit_name > .link_name')[0].text  # name
    detail_page_xpath = '//*[@id="info.search.place.list"]/li[' + str(i + 1) + ']/div[5]/div[4]/a[1]'
    driver.find_element_by_xpath(detail_page_xpath).send_keys(Keys.ENTER)
    driver.switch_to.window(driver.window_handles[-1])  # 상세정보 탭으로 변환
    
    
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    # 첫 페이지 리뷰 목록 찾기
    review_lists = soup.select('.list_evaluation > li')
    
    # 리뷰 뽑아내기
    if len(review_lists) != 0:
		for j, review in enumerate(review_lists):
        	comment = review.select('.txt_comment > span')
            
	driver.close()
    driver.switch_to.window(driver.window_handles[0])  # 검색 탭으로 전환

이전 글과 같은 방법으로 원하는 element의 xpath를 뽑아냅니다

그리고 목록은 beautifulsoup로 뽑습니다

그리고 목록들의 이름도 HTML을 분석해서 뽑아냅니다!

그리고 상세정보 버튼의 element의 xpath를 또 뽑아서 ENTER 키를 넣습니다

글고 이제!! 상세정보 탭으로 전환하는 방법입니다

 

selenium 탭 전환

driver.switch_to.window(driver.window_handles[-1])  # 상세정보 탭으로 변환

switch_to_window 함수를 이용하여 tab을 전환할 수 있습니다

이 함수에는 window name을 인자로 넣어야 합니다.

이 인자는 driver.window_handles라는 변수가 들고 있습니다.

가장 왼쪽 탭은 window_handles[0], 두 번째 탭은 window_handles[1], 그 다음은 window_handles[2]... 이렇게 됩니다

저는 가장 맨 오른쪽의 탭으로 전환하기 위해서 driver.window_handles[-1]을 인자로 넣었습니다

 

selenium 탭 닫기

driver.close() # 현재 탭 닫기
driver.switch_to.window(driver.window_handles[0])  # 검색 탭으로 전환

상세정보 탭으로 이동한 후에 정보를 다 빼냈다면

다시 다른 장소들을 검색하기 위해서 이전 탭으로 전환하려 합니다

그러기 위해서 탭을 닫고 다시 이전 탭으로 전환할 필요가 있습니다

다시 switch_to를 이용해서 탭을 전환합니다.

 

이렇게 하면 탭 전환했다가 탭 닫았다가 다시 탭으로 돌아면서 동적으로 크롤링할 수 있습니다

예제들을 잘 활용해보세요!!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.