ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python 문법, 패키지 라이브러리, 웹 스크래핑(크롤링)
    Python 2024. 6. 27. 12:03

    파이썬 가상환경(virtual environment) 만들기

     

    같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경.. 이라고 한다.

     

    macOS 

    cmd + shift + p > env 검색 > Python : Create Environment 클릭 > Venv 클릭 > 3.8버전 클릭

     

    .venv 폴더가 생성되면 완료

    하단 터미널에서도 (.venv) 확인


    패키지 라이브러리

     

     

    설치

    TERMINAL
    pip install requests

     

     

    링크에서 아래와 같은 여러 데이터 값들을 불러오기 위해 

     

    •  "ARPLT_MAIN": "O3",
    •         "CO": 0.4,
    •         "IDEX_MVL": 31,
    •         "IDEX_NM": "좋음",
    •         "MSRDT": "201912052100",
    •         "MSRRGN_NM": "도심권",
    •         "MSRSTE_NM": "중구",
    •         "NO2": 0.015,
    •         "O3": 0.018,
    •         "PM10": 22,
    •         "PM25": 14,
    •         "SO2": 0.002

     

    requests 및 아래 코드이 데이터 값들을 가져온 후, 반복문 돌려서 여러가지 데이터 값들 중 구 이름 미세먼지 농도값 만 가져와서 출력하기

    import requests
    
    r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
    rjson = r.json()
    
    rows = rjson['RealtimeCityAir']['row']
    
    for row in rows:
         gu_name = row['MSRSTE_NM']
         gu_mise = row['IDEX_MVL']
         
         print(gu_name, gu_mise)

     

     

     

    출력해보면 결과값은 이렇게 나온다.

     

    중구 31
    종로구 39
    용산구 -99
    은평구 42
    서대문구 37
    마포구 36
    광진구 31
    성동구 33
    .

    .

    .

     


     

    웹 스크래핑 '네이버 날씨'

     

     

    설치

    pip install requests bs4

     

     

    웹 스크래핑 기본 세팅

    mport requests
    from bs4 import BeautifulSoup
    
    URL = "
    https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=날씨
    "
    headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get(URL, headers=headers)
    soup = BeautifulSoup(data.text, 'html.parser')

     

     

     

    처음엔 이게 뭔가 했는데 유용하고 신기했다.

    스크래핑한 내용이 soup에 담겨있다.

    # 선택자를 사용하는 방법 (copy selector)
    soup.select('태그명')
    soup.select('.클래스명')
    soup.select('#아이디명')
    
    soup.select('상위태그명 > 하위태그명 > 하위태그명')
    soup.select('상위태그명.클래스명 > 하위태그명.클래스명')
    
    # 태그와 속성값으로 찾는 방법
    soup.select('태그명[속성="값"]')
    
    # 한 개만 가져오고 싶은 경우
    soup.select_one('위와 동일')

     

     

     

     

    (온도가 아까랑 달라졌네..ㅎ)

     

    이 중 특정 값만 가져오고 싶을 때 , 예를 들어 현재 온도인 숫자 26.7 만 출력하기 위해서는

    html 태그(마우스 우클릭 > Inspect) 를 살펴봐야 한다.

     

     

    temperature_text 를 찾을 수 있다. 

     

    soup으로 가져오면

    temp = soup.select_one('.temperature_text')
    print(temp.text)

     

    출력된 값은 > 현재온도 25.5°

     

     

    숫자만 가져와야 하니까, 다시 html 태그 들어가서 살펴보면 temperature_text 안에 strong 태그가 있다.

    .contents로 쪼갠 후에 리스트 인덱스 값으로 숫자 값만 뽑아서 출력하면 된다.

    temp = soup.select_one('.temperature_text > strong').contents
    print(temp)

     

    이때 출력값은 > [<span class="blind">현재 온도</span>, '26.6', <span class="celsius">°</span>]

     

     

    .contents로 인해서 tempList 형식이 되었으므로 숫자값인 26.6만 가져오려면 

     

    print(temp[1]) 을 출력해주면 된다.


    멜론차트 크롤링

     

     

    크롤링할 멜론 차트 

    https://www.melon.com/chart/index.htm

     

    Melon

    음악이 필요한 순간, 멜론

    www.melon.com

     

    멜론 차트 TOP 100 데이터를 스크래핑 하기

    출력할 데이터는 순위, 노래제목, 아티스트, 앨범썸네일(img,src)

     

    이번에도 개발자도구 열어서 태그를 봐야함

     

    스크래핑 기본 코드

    # 멜론뮤직 스크래핑
    from bs4 import BeautifulSoup
    import requests
    
    # bs4 시작코드
    '''
    스크래핑 하고 싶은 주소를 url에 넣어주세요
    '''
    url = "https://www.melon.com/chart/"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    data = requests.get(url, headers=headers)
    soup = BeautifulSoup(data.text, 'html.parser')

     

     

    확인해보면, lst50이라는 tr태그 안에 클래스 이름, 아이디 이름이 포함되어 있음

     

    vs code 로 와서, soup으로 가져온 다음

    tr = soup.select_one('.lst50')

     

     

    순위, 노래제목, 아티스트, 앨범썸네일(img,src)에 맞춰 하위 태그들을 가져온 후,

    순위, 노래제목, 아티스트.text 로 출력

    앨범썸네일(img,src)('img')['src'] 로 이미지 소스 가져와주고 출력

    tr = soup.select_one('.lst50')
    rank = tr.select_one('.rank').text
    title = tr.select_one('.rank01 > span > a').text
    artist = tr.select_one('.rank02 > a').text
    image = tr.select_one('img')['src']
    
    print(rank, artist, "-", title, image)

     

    1위부터 100위까지 순위를 모두 출력해야하므로

    for 반복문 돌리기

     

    tr태그가 여러개니까 

    tr trs 바꾸고, select_one()select()로 바꾸고 출력

    trs = soup.select('.lst50')
    
    for tr in trs:
    
        rank = tr.select_one('.rank').text
        title = tr.select_one('.rank01 > span > a').text
        artist = tr.select_one('.rank02 > a').text
        image = tr.select_one('img')['src']
        
        print(rank, artist, "-", title)

     

    근데 출력하면.. 50위까지 밖에 안나옴...

    개발자도구를 살펴보면 중간부터 클래스 명이 변경되기 때문.. 

     

    그래서 다시 태그를 살펴보고, table 안에 있는 tbody 안에 있는 tr 을 전부 데려오면 됨

     

    trs = soup.select('table > tbody > tr')
    
    for tr in trs:
    
         rank = tr.select_one('.rank').text
         title = tr.select_one('.rank01 > span > a').text
         artist = tr.select_one('.rank02 > span > a').text 
         image = tr.select_one('img')['src']
    
         print(rank, title, artist, image)

     

    그럼 끝!

    'Python' 카테고리의 다른 글

    파이썬으로 업다운 게임 만들기  (0) 2024.07.02
    파이썬 문법 심화  (1) 2024.06.30
    파이썬 문법 기초  (0) 2024.06.28
    Python, SQLite, SQLAlchemy, Database 조작  (0) 2024.06.27
    Flask로 사이트 만들기 (python, html)  (0) 2024.06.27
Designed by Tistory.