3주차 - 파이썬 패키지 사용 & 크롤링

     

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

     

    앱을 설치할 때 앱스토어/플레이스토어를 가듯이, 새로운 프로젝트의 라이브러리를 가상환경(공구함)에 설치하려면 pip(python install package) 를 이용하게 된다.

     

    파이썬 패키지 설치 방법

    1. 파일 - 설정에서 해당 프로젝트의 Python Interpreter 클릭 -> +클릭 -> ok 클릭

     

     

    2. 패키지명 입력 후 Install Package 클릭, 패키지 성공 메세지가 뜬다

     

     

     

    3. 설치 완료 후 설치된 패키지와 설치된 버전, 해당 패키지의 최근 버전을 볼 수 있다.

     

     

     

    Requests 패키지 사용해보기

     

    서울시 대기 OpenAPI에서 IDEX_MVL 값이 60 미만인 구만 찍어주자!

     

    import requests # requests 라이브러리 설치 필요
    
    r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
    rjson = r.json()
    
    gus = rjson['RealtimeCityAir']['row']
    
    for gu in gus:
    	if gu['IDEX_MVL'] < 60:
    		print (gu['MSRSTE_NM'], gu['IDEX_MVL'])

     

    파이썬은 중괄호{}를 없이 들여쓰기로 구분하기 때문에 들여쓰기가 매우 중요!!!

     

     

    크롤링 기본 세팅

    import requests
    from bs4 import BeautifulSoup  # bs4 라이브러리 설치 필요
    
    # 타겟 URL을 읽어서 HTML를 받아오고,
    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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    # soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
    # 이제 코딩을 통해 필요한 부분을 추출하면 된다.
    soup = BeautifulSoup(data.text, 'html.parser')

     

    • select / select_one의 사용법
    import requests
    from bs4 import BeautifulSoup
    
    # URL을 읽어서 HTML를 받아오고,
    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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)
    
    # HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
    soup = BeautifulSoup(data.text, 'html.parser')
    
    # select를 이용해서, tr들을 불러오기
    movies = soup.select('#old_content > table > tbody > tr')
    
    # movies (tr들) 의 반복문을 돌리기
    for movie in movies:
        # movie 안에 a 가 있으면,
        a_tag = movie.select_one('td.title > div > a')
        if a_tag is not None:
            # a의 text를 찍어본다.
            print (a_tag.text)

     

     

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

     

    • 항상 정확하지는 않으나, 크롬 개발자도구를 참고할 수도 있다
      1. 원하는 부분에서 마우스 오른쪽 클릭 → 검사
      2. 원하는 태그에서 마우스 오른쪽 클릭
      3. Copy → Copy selector로 선택자를 복사할 수 있음

    네이버 영화 랭킹 페이지 크롤링 (순위, 제목, 별점)

    import requests
    from bs4 import BeautifulSoup
    
    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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20220901',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    movies = soup.select('#old_content > table > tbody > tr')
    
    for movie in movies:
        a = movie.select_one('td.title > div > a')
        print(a)

     

     

    영화 제목을 추출하는 위 코드를 실행한 결과 중간중간 'None' 값이 보인다. 영화 10개 단위로 구분선이 그어져있기 때문이다. 따라서 제목만 보여주고 싶으면 if문으로 'None' 값이 나오면 print 하지 않게 해야한다.

     

     

    import requests
    from bs4 import BeautifulSoup
    
    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('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20220901',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    #old_content > table > tbody > tr:nth-child(4) > td.title > div > a
    #old_content > table > tbody > tr:nth-child(3) > td.title > div > a
    
    #old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
    #old_content > table > tbody > tr:nth-child(5) > td:nth-child(1) > img
    
    
    movies = soup.select('#old_content > table > tbody > tr')
    
    dict_movie = []
    
    for movie in movies:
        a = movie.select_one('td.title > div > a')
        if a != None:
            title = a.text
            rank = movie.select_one('td:nth-child(1) > img')['alt']
            star = movie.select_one('td.point').text
            dict_movie.append({"rank":rank, "title":title, "star":star})
    
    print("네이버 영화 TOP11")
    for i in range(10):
        print(i+1,"위: ",dict_movie[i]['title'], ", 평점: ",dict_movie[i]['star'])

     

     

     

     

    숙제: 지니뮤직 크롤링

    import requests
    from bs4 import BeautifulSoup
    
    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('https://www.genie.co.kr/chart/top200?ditc=M&rtm=N&ymd=20220901',headers=headers)
    
    soup = BeautifulSoup(data.text, 'html.parser')
    
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(2) > td.number
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(3) > td.number
    
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.title.ellipsis
    
    #body-content > div.newest-list > div > table > tbody > tr:nth-child(1) > td.info > a.artist.ellipsis
    
    music = soup.select('#body-content > div.newest-list > div > table > tbody > tr')
    
    for m in music:
        rank = m.select_one('td.number')
        title = m.select_one('td.info > a.title.ellipsis')
        artist = m.select_one('td.info > a.artist.ellipsis')
        print(rank.text[0:2].strip(), title.text.strip(), artist.text.strip())

     

    728x90

    댓글