ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #9: KT_AIVLE_SCHOOL : DX_4th : 5주차 : 데이터 수집
    KT_AIVLE_SCHOOL_DX_4th 2023. 9. 4. 22:04

    지난 #8에서는 데이터분석방법론과 데이터변수에 따른 시각화 및 수치화 방법을 배웠다

    http://https://datawithu.tistory.com/13


    이번 2일동안은 박두진 강사님과 함께  데이터를 어떻게 수집하는지에 대해 배운다.

    이번 #9번은 아래로 구성되어있다. 

    • 1.JSON   web crawing
    • 2.HTML  web crawing
    • 3. API 활용  web crawing

    # Intro ) 교육 후 짧은 생각 

    # 2일동안 에이블스쿨에서 교육을 들으면서  가장 많이 했던 고민이 이걸 내가 할 수 있을까 였다.

    왜냐하면, 크롤링이라는 방법은 어떻게 보면, 간단하게 느껴질 수도 있는데, 

    세부적으로는 특히 Json의 구조,  HTML에서 사용되는 태그들,  작동 방식에 대한 이해,

    무엇보다 WEB이 어떻게 만들어지고 구성되는지를 알아야 차후에도 아! 이랬었지   할 수 있기 때문이다.

    그래서 

    • 아쉬웠던 점은 교육및 실습 시간이 적었던 부분이고,
    • 좋았던 점은 강사님께서 자료들을 많이 많이 공유해주셨다. 
    •  공유해주셨던 부분은  'Selenium', 'scrapy'등 또 유명한 크롤링 방법들이었다. 

    읽어봐야 하는데.. 언제 할 수 있을지..ㅜㅜ

    비록 이전에 WEB을 개발(?) 했던 적이 있었지만, 그 당시에도 이해되지 못한 채 남겨져 있는 부분들이 많았고,

    그중 하나가 바로 크롤링 부분이었는데, 이렇게 시간이 흐른 후라도 해결 될 수 있어서 좋았다. 


    개략적으로 web_crawling은 3가지로 파트로 나누어 볼 수 있다.

    #1. URL :

    #2. Request

    #3. Response

    아래의 표는 위의 3단계 web_crawling에 대해 정리한 표이다.

    웹크롤링 정리표

    T-story주인은 컴맹이고, 그 컴맹이 무려 1.5시간이 걸려 만든 정리표이다.(우리반 사람들에게는 이미 나누어 줬다.)

    정리를 하게 된 이유는 

    이전 기자단을 하게 된 계기(https://datawithu.tistory.com/12) + 강사님의 설명으로는 한눈에 보기 어려워서이다.

    강의력과는 무관하게 내 방식대로 한 눈에 정리된 표가 더 기억에 남을 것 같아 정리를 했다.


    1. URL :을 찾아야 한다 

    강사님의 말로는 사실상 처음 보는 싸이트에서 원하는 부분의 URL을 찾는 것이 의외로 시간이 제일 걸린다고 했다.

    방법은 간단하다 

    F12번을 누르고  개발자 도구를 연다.  

    그러나 어떤 이벤트에 따라 가져와야하는지  웹페이지를 하나씩 뒤져봐야하기때문에...

    개발자도구 -> network -> Fetch/XHR에서 이벤트를 정리후 새로 발생하는 이벤트를 보면서 찾는 것을 권장한다.

     

    2. Request  : 서버에 데이터를 요청한다. 

    클라이언트에서 request(url) 요청해준다. 

    request(url )  = =====> response의 형식은 json(str)

    -error없이 받아오는 경우에는  Satus Code 가 2XX로 뜬다.(초록)

    네이버웹사이트에서  개발자도구 F12 눌렀을때

     

    3. Response : 받은 데이터를 Parsing을 해준다.

    Parsing: Data(json(str) => list, dict => DataFrame 으로 변환한는것 

    DAY1에서는 json => pd.DataFrame()변환해주었다.


    사실상 1~3 스탭을 코드로 정리하면 비교적 더 간단해진다. 

    import warnings 
    warnings.filterwarnings('ignore')
    import pandas as pd
    import requests
    
    url = 'https://......&pagesize=&page='
    response = requests.get(url)
    data = response.json()
    pd.DataFrame(data)

     

    이것을 좀 더 재사용성에서 유용하게 만들기 위해서는 함수로 만들어 호출하는 방법이 있다.

    ## 함수로 만들기 
    def st_crawling(code='KOSPI',page=1,pagesize=60):
        # 1. url
        url = f'https://싸이트주소/{code}/price?pageSize={pagesize}&page={page}'
    
        # 2. request
        response = requests.get(url)
        data = response.json()
    
        # 3. 파씽 DATA => DataFrame
        return pd.DataFrame(data)[['localTradedAt','closePrice']]

     


    그런데 이때 4XX으로 데이터를 받아오지 못하는 웹사이트들의 경우는 따로 headers부분을 작성해주어야 Server에 response를 해준다.

    Headers 와 Referer부분을 복붙으로 데려오자!

    코드로 작성해보면, 

    headers = {
        'User-Agent':'사이트 header에서 user-Agent부분',
        'Referer':'사이트 header에서 Referer부분',
    } # ,는 꼭 뒤에 다 붙여줄 것!
    
    response = requests.get(url, headers=headers)
    response

     

    JSON ▲


    HTML  ▼

    Day2 에서는 HTML으로 데이터 수집을 하는데. 

    Parsing 부분이 달라진다.

    이때는 from bs4 import BeautifulSoup을 활용해서 데이터를 변환해준다. 

    코드로 작성해보면 , Parsing 부분이 조금 늘어난다...ㅎㅎ

    import pandas as pd 
    import requests
    from bs4 import BeautifulSoup
    
    #1. url
    query = '연관검색'
    url = f'https://사이트?query={query}'
    
    #2. request ->response
    response = requests.get(url)
    
    ###3. html  -> bs  -> selector ->  text 
    dom = BeautifulSoup(response.text, 'html.parser')
    
    #아래의 ' '안에는  html보면서 찾아줘야함.
    selector = '#nx_ > div > div.related_srch > ul > li'
    elements = dom.select(selector)
    
    #element.select_one('.tit') #class가 tit인 엘리먼트
    # elements => text : 리스트 컴프리핸션으로 
    ks = [ element.select_one('.tit').text  for element in elements]
    
    # 4. 데이터프레임으로
    pd.DataFrame({'키워드': ks})

    4.으로 데이터 프레임로 만들어주면 깔끔...


    API 활용

    만약 API를 사용해서 클롤링을 한다면, 단계가 하나 더 추가된다 

    0.번은  크롤링전에  크롤링 할 사이트에 허가를 받는 행위기도 하다.

    일반적으로  open API는 제 3자가 브라우저를 사용해서 데이터를 가져가는 것이 아니라, 프로그램으로 데이터를 가져갈 수 있도록 하는 서비스이기 떄문에, 어플리케이션 등록을 하여 key값을 받아온다.

    즉  내가 사용하겠다는것을 사이트에 알려주는 것이다.  

    코드로 보면,

    # 0. 사이트에서 application 등록후  id(application_key값)를 받아온다
    client_id = '일반키값'
    client_secret = '키값'
    
    ## 1. url를 받아올때는 해당 사이트의 document를 확인해서 받아오자 !!
    url = "https://openapi.........."
    
    #header로 내가 쓰겠다고 알려주기# 해당header내용은 사이트마다 상이할수있음 
    headers ={
        'Content-Type':'application/json',
        '......-Client-Id': client_id,
        '.......Client-Secret':client_secret,
    }
    
    # 2. Request(url, headers, data)  -> Response
    ko_text = '웹크롤링은 재미있고 돈이 됩니다. '
    # 데이터 : 해당 사이트의 document를 확인해서 작성
    params = {'source':'ko', 'target':'en', 'text':ko_text}
    
    #한글인코딩의 경우 json.jumps()을 해주면 된다.
    response = requests.post(url, json.dumps(params), headers=headers) 
    
    # 3. json(str)을 -> list,dict -> text 로 파싱하기
    response.json()[][]    # []안에는 수집하고 싶은 부분들의 데이터를 찾아서 넣기

     

     

     

     

     

     

     

Designed by Tistory.