본문 바로가기

데이터 분석 (DA)

[패스트캠퍼스] 데이터 분석 부트캠프 17기 - 4주차 (DA_Python)

Part 3. 내게 필요한 정보를 자동하기. 웹 크롤링

 

I. 크롤링을 위한 준비

 

  1. 크롬브라우저 설치

    https://www.google.com/chrome/ 

 

  2. 크롬브라우저 버전확인

    chrome://settings/help

 

  3. 크롬드라이버 다운로드

    - Selenium을 사용하려면, 크롬 브라우저와 호환되는 ChromeDriver가 필요

    - Python의 webdriver-manager 라이브러리를 사용해 자동으로 ChromeDriver를 설치

      - 필요한 라이브러리 설치 : 

 

    - ChromeDriver 설치 및 실행 코드:   


  4. Selenium으로 Chrome 브라우저 실행하기

    - 크롬브라우져 실행 및 url 지정

    - 주니퍼로 크롬브라우저 실행함

 

 

  5. Selenium 주요 기능 및 활용 

    - 크롬브라우져 실행 및 url 지정

 

    5-1. 요소 찾기 (By)
      - Selenium은 웹 페이지의 특정 요소를 찾기 위해 `By`를 사용함.


      - 주요 By 메서드
        By.CLASS_NAME     # 클래스명으로 요소 찾기
        By.ID                         # ID로 요소 찾기
        By.TAG_NAME         # 태그 이름으로 요소 찾기

 

    5-2. 단일 요소 가져오기
      - 단일 요소 가져오기 : find_element

      - 특정 조건을 만족하는 첫 번째 요소만 가져온다.

      - 반환 값: 단일 요소 (Element 객체)

      - element = browser.find_element(By.CLASS_NAME, "shortcut_list")     # 첫 번째 요소만 반환

 

    5-3. 여러 요소 가져오기

      - 여러 요소 가져오기 : find_elements
      - 특정 조건을 만족하는 모든 요소를 리스트(List) 형태로 반환한다.
      - 반환 값: 요소의 리스트 (List)
      -  elements = browser.find_elements(By.CLASS_NAME, "shortcut_list")     # 리스트 반환

    5-4. 주의사항
      - find_element는 해당 요소가 존재하지 않을 경우 오류를 발생시킨다.
      - find_elements는 해당 요소가 없을 경우 빈 리스트를 반환한다.

 

  6. 요소 찾기 실습

 

    6-1. 네이버 날씨로 이동

      - url 지정하여 변수 'url'에 담는다.

 

 

 

    6-2. '현재 온도'의 요소 찾기

      - 원하는 위치에서 오른쪽 클릭 한 후 '검사'클릭

 

 

    6-3. 개발자창 드면 '현재 온도'의 요소가 있는 부분에 회식 부분이 선택된 것을 알 수 있다. 

      - 그 중 "current minus"나고 나온 부분중 "current" 부분을 나의 요소로 가져온다. (파이썬에서는 요소의 띄워쓰기는 입력에러임)

 

 

 

     6-4. "현재 온도" 불러오기

 

 

     6-5. "나의 위치", "습도, 체감온도, 풍향, 풍속"도 불러오기

       - 개발자 창에서 상단 좌측의 버튼(점선으로된 사각형에 화살표 표시)을 클릭하면 원하는 요소가 강조된다.

      - 거기서 "습도"를 클릭해 보면 우측창에 클릭한 부분이 표시된다.

 

 

      - 그 상단 class를 선택하면 습도, 체감, 풍향이 모두 표시 되었다.

      -  원하는 요소는 "weather_table"이고, 이 요소를 불러온다.

 

 

      -  원하는 요소를 불러왔다.

 

 

      ▶ 위와 같이 원하는 '단일 요소'를 불러 왔음

 

      ▶ '다중 요소' 불러오기는 "II. 데이터 수집" 참고


 

II. 데이터 수집 

 

 A. 네이버 부동산을 활용한 부동산 매물 수집

 

  1. 크롬브라우저 열

    from selenium import webdriver      # 셀레늄에서 웹드라이버 가져오기
    browser = webdriver.Chrome()        # 크롬브라우저를 열고 그 크롬브라우저를 변수 browser에 담아준다.

 

 

  2. 네이버 부동산 창 열기

    url = 'https://new.land.naver.com/complexes/728?ms=37.525563,127.020506,17&a=APT:ABYG:JGC:PRE&e=RETAIL'
    browser.get(url)                               # 브라우저로 url을 가져옴    # 압구정동 현대 미성아파트의 정보를 가져오고자 함.

 

  

    ▶ 멀티데이터 가져오기 

      - 일단 1개를 가져오게 되면, 반복문을 통해 무한개를 가져올 수 있다.

 

  3. 일단 단일 요소 가져오기

    from selenium.webdriver.common.by import By                                     # 셀레니움을 통해 요소를 가져온다.   # from. 오타주의  

    browser.find_element(By.CLASS_NAME, "item_title").text                   # 동정보    
    browser.find_element(By.CLASS_NAME, "price_line").text                  # 가격정보
    browser.find_element(By.CLASS_NAME, "info_area").text.split(", ")     # 매몰정보   # .text는 요소정보를 텍스트로 반환시킴

    >>> ['아파트112B/105m²', '8/14층', '남향\n체크 34P 리바트 특올수리 첫입주I 장기거주I 신사중', '현대고 초인접']

 

 

    ▶ N개의 정보를 가져오려고 한다.
      - (1) 정보가 모두 담겨있는 컨테이너를 찾는다.
      - (2) 해당클레스를 모두 가져와줘! => find_element (X), find_elements (O)
      -  find_element => WebElement.text
      -  find_elements => List[]
          => ["element1", "element2", "element3"]      # elements와 같이 여러개 요소들이 불러진(리스트로 여러개 반환된) 이후에 
          => "element1".text                                        # element 해서 하나의 요소에서 하나의 텍스트 값을 반환 시켜야 한다.... 

 

    4. 컨테이너 찾기

     ▶ 컨테이너 찾는법 :
      - (1) 브라우저 검사창에서 상단 왼쪽 버튼 눌러서, 매물 각각의 매물 창에서 첫번째 매물창의 전체를 선택하는 부분을 클릭한다.

 


      - (2) 그 부분의 화살표를 눌러 접어보면, 매물단위 클래스가 눈에 보일 것이다. 

             하나씩 하나씩 묶음 매물 단위가 하나의 '컨테이너' 이다.

 


      - (3) 매물창에서 아래로 스크롤을 계속하게 되면, 처음 20개에서, 40개, 60개...씩 계속 늘어나게 된다.  (동적로딩)

              컨테이너의 요소 이름 ' item '을 찾음.

 

 

    5. 컨테이너 요소 불러오기

      browser.find_elements(By.CLASS_NAME, "item")                              # 매물들을 List화된 자료로 불러옴.

 

    6. 컨테이너 변수 선언 및 요소를 리스트에 담

      containers = browser.find_elements(By.CLASS_NAME, "item")         # 리스트를 컨테이너 변수에 담는다.
      print(containers)

 

    7. 매물정보 개수 확인하기

      len(containers)                  # 스크롤을 할수록 매물 개수가 늘어난다. 

     >>>80                                 # 데이터 개수가 늘릴려면 브라우저 창 매물부분에서 계속해서 스크롤을 돌려 아래 로 내린 후,

                                                   ' browser.find_elements(By.CLASS_NAME, "item") ' 부분 부터 다시 (Kernel) running 해와야 한다.

 

    8. 최종 불러온 요소정보를 우리가 원하는 데이터 값으로 저장하기. 

 

      data = [ ]                                                               # 최종 값을 담을 변수 선언함.            

      for elem in containers:
          try:
              동정보 = elem.find_element(By.CLASS_NAME, "item_title").text           # 여러개의 컨테이너 중 값이 없는 것이 있을 수도 있다..
              가격정보 = elem.find_element(By.CLASS_NAME, "price_line").text       
              매물정보 = elem.find_element(By.CLASS_NAME, "info_area").text.split(', ')
      
              평수 = 매물정보[0]                           # Shift + Alt + 화살표 밑으로 ===> 행 카피해서 내리기
              층수 = 매물정보[1]
               향 = 매물정보[2].split('\n')[0]
              기타 = 매물정보[2].split('\n')[1:]

              print(동정보, 가격정보, 평수, 층수, 향, 기타)

               data.append({                                 # 엑셀에서 하나의 행 데이터를 만들것이기 때문에 중괄호{} 사용한다.  # 딕셔너리 타입임.
                   '동정보':동정보,
                   '가격정보':가격정보,
                   '평수':평수,
                   '층수':층수,
                   '향':향,
                   '기타':기타,
              })                                                           
           except:                                               # 그래서 예외조항 만들어서 통과 시킨다.
               pass

    

    9. 최종 데이터를 csv파일 형태로 만들어서 저장하기


       import pandas as pd      

       df = pd.DataFrame(data)           #DataFrame은 2차원데이터임.       # csv파일 형태로 만들기

       df.to_csv("_네이버부동산_미성아파트매물정보.csv", encoding='utf-8-sig')

 

       최종 데이터를 csv파일로 저장완료됨.