ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 21.09.14. 3-4~9강 (파이썬, 패키지(requests, bt4) 크롤링)
    일기 2021. 9. 15. 00:41

    [파이썬을 설치한다?]

     

    - 컴퓨터는 10100011 같은 언어만 알아 들음

    - 그래서 파이썬 문법으로 된 걸 10100011로 변환해줄 수 있도록

      번역 패키지를 설치하는 것

     

     

     

     

    [파이참에서 파이썬 만들기]

     

    - venv(virtual environment ;가상환경) 폴더 절대 건드리지 말기!

    - File -> New -> Python File

     

    print('hello sparta')

     

    - 마우스 우클릭, "run"

    - 다른 초록색 화살표 누르지 말고 무조건 마우스 우클릭 후 런하기!

     

    'print' => 개발자가 보고싶을 때 쓰는 명령어

     

     

     

    - ' : ' => 파이썬은 중괄호를 쓰지 않음! 콜론 아래 적힌 것들이 내용물이 되는 것. 그래서 탭이 중요. (굉장히 직관적)

    ex)

    age = 25

    if age > 20:
       print('성인입니다')
    else:
       print('청소년입니다')

     

    =>성인입니다

     

     

     

     

    *반복문

     

    - 리스트의 원소를 하나씩 빼서 쓰는 방식

     

     

    fruits = ['사과','','','','수박','','딸기','사과','','수박']

    count = 0
    for ff in fruits:
       if ff == '수박':
           count += 1    =>'count = count + 1' 과 같은 내용

    print(count)

     

    =>2

     

     

     

     

     

     

    [파이썬 패키지]

     

    *venv(virtual environment ;가상환경)

    - 공구함

     

    *설치(pip ;python install package)

    File -> Settings -> Project pythonprac -> Python Interpreter -> (+) -> 검색해서 설치

    - (+)를 누를 수 없다면 세팅 눌러서 Python을 데려오면 됨

     

     

     

     

    [Requests]

     

    https://www.daleseo.com/python-requests/

     

    [파이썬] requests 라이브러리 사용법

    Engineering Blog by Dale Seo

    www.daleseo.com

     

    import requests # requests 라이브러리 설치 필요

    r = requests.get('url주소를 입력하세요')
    rjson = r.json()

    print(rjson)

     

     

     

     

    [크롤링]

     

    - 구글의 검색 엔진이나 내 사이트를 퍼가는 행위

    - 스크래핑과 크롤링을 혼용해서 왕왕 사용함 (같은 개념이라 생각하면 됨)

    - 내가 이미 받아온 데이터를 가지고 내가 솎아내는 것

    - 기술적으로 중요한 두가지    1. 코드 단에서 브라우저를 켜지 않고 요청을 하는 것 (requests 사용)

                                           2. 요청해서 가지고 온 html들 중 내가 원하는 정보를 잘 솎아내는 것 (bt4 사용)

     

     

     

     

    *크롤링 기본 세팅

     

    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('url을 입력해주세요',headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    # 코딩 시작

     

     

     

     

     

    *네이버 영화 페이지

     - 패키지 추가 설치하기(beautifulsoup4 ;bs4)

     - 사용 방법은 크게 두가지   1. select_one : 하나 나옴

                                         2. select : 리스트처럼 나옴

     

     

     

    *soup.select_one : 해당 정보를 하나 불러옴

        : 브라우저에서 정보를 원하는 부분 마우스 우클릭 -> 검사 -> elements에서 해당 태그 마우스 우클릭

          -> 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.nhn?sel=pnt&date=20200303',headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
    print(title)

     

     

    =>

    C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
    <a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

    Process finished with exit code 0

     

     

     

     

     

    *태그 안에 있는 특정 텍스트를 가져오고 싶다!

    ex) 그린 북

    => print(title.text)

     

    =>

    C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
    그린 북

    Process finished with exit code 0

     

     

     

     

    *태그의 속성을 가져오고 싶다!

    ex) /movie/bi/mi/basic.naver?code=171539

    => print(title['href'])

     

    =>

    C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
    /movie/bi/mi/basic.naver?code=171539

    Process finished with exit code 0

     

     

     

     

    *soup.select : 해당 정보를 리스트 형태로 여러개 가져옴

    - 해당 부분 마우스 우클릭 -> Copy -> Copy selector

    #old_content > table > tbody > tr:nth-child(3)
    #old_content > table > tbody > tr:nth-child(4)

     

    내가 원하는 정보는?

    #old_content > table > tbody > tr

    <tr>태그들이 다 나옴

     

     

     

    trs = soup.select('#old_content > table > tbody > tr')

    for tr in trs:
    print(tr)

     

     

     

    이제 tr 안에서 타이틀을 찾든, 하면 됨 타이틀 부분은?

    타이틀 항목 copy selector

    #old_content > table > tbody > tr:nth-child(2) > td.title > div > a

    여기서 

    #old_content > table > tbody > tr:nth-child(2) > 

    여기까진 위에서 찾았으니

    타이틀 부분은

    td.title > div > a

    이 부분인 것

     

     

    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.nhn?sel=pnt&date=20200303',headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    trs = soup.select('#old_content > table > tbody > tr')

    for tr in trs:
      a_tag = tr.select_one('td.title > div > a')  =>     : tr중에서 하나를 찾아요
      print(a_tag)

     

     

     

    *None

    - 중간중간 있는 None은 단락을 나누는 실선의 데이터

    - 이건 사이트마다 다름. 특정 언어는 아님

     

    for tr in trs:
      a_tag = tr.select_one('td.title > div > a')
      print(a_tag.text)

     

     

    =>

    C:\Users\user\Desktop\sparta\pythonprac\venv\Scripts\python.exe C:/Users/user/Desktop/sparta/pythonprac/hello.py
    Traceback (most recent call last):
      File "C:/Users/user/Desktop/sparta/pythonprac/hello.py", line 13, in <module>
        print(a_tag.text)
    AttributeError: 'NoneType' object has no attribute 'text'

    Process finished with exit code 1

     

    => ?None타입의 text는 데려올 수 없다!

     

    =>if문을 사용해서 None이 아닌 항목만 데려오기

     

    for tr in trs:
      a_tag = tr.select_one('td.title > div > a')
      if a_tag is not None:
        title = a_tag.text
        print(title)

      

     

     

     

    *연습

     

    순위, 제목, 평점 순으로 도출되게 하기

     

    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.nhn?sel=pnt&date=20200303',headers=headers)

    soup = BeautifulSoup(data.text, 'html.parser')

    trs = soup.select('#old_content > table > tbody > tr')

    for tr in trs:
       a_tag = tr.select_one('td.title > div > a')
       if a_tag is not None:
          rank = tr.select_one('td:nth-child(1) > img')['alt'] =>랭크 copy selector 런 해보면 alt 항목이 필요한 걸 알 수 있음
          title = a_tag.text
          star = tr.select_one('td.point').text =>point의 텍스트가 필요함
          print(rank,title,star)

     

    =>print(rank['alt'])로 찍어보고 잘 나오면 ['alt']는 프린트 안에 있을 필요 없으니 해당 열로 옮겨준다

    '일기' 카테고리의 다른 글

    21.09.17. 4-1~5강 (Flask 서버 만들기)  (0) 2021.09.17
    21.09.15. 3-10~15강 (MongoDB, pymongo 코드)  (0) 2021.09.16
    21.09.14. 3-1~3강 (복습)  (0) 2021.09.14
    21.09.11~14. 2-7~12강 (JSON, Ajax)  (0) 2021.09.12
    21.09.09. 2-2~6강 (jQuery)  (0) 2021.09.09
Designed by Tistory.