개발/엘리스 AI 트랙

엘리스 AI 트랙 04주차 - 파이썬 크롤링 (1/15) 🔥

Max 2021. 1. 18. 11:39
반응형

✔ 04주차. 파이썬 프로그래밍

<수강목표>

  • 프로그래밍에서 가장 많이 사용하는 함수를 효율적으로 작성하는 방법을 알아봅니다.

  • 객체지향 프로그래밍의 개념과 파이썬을 활용해 웹 사이트에서 정보를 가져오는 방법을 익힙니다.

  • 두개 이상의 모듈로 이루어진 패키지 단위의 프로그램을 작성할 수 있습니다.


[01 크롤링의 기초]

1. 크롤링이란?

  - 크롤링 : crawling. 웹페이지에서 필요한 데이터를 추출해내는 작업. 크롤링을 하는 프로그램은 크롤러.

  - 크롤링을 위해 필요한 것 : 웹페이지의 HTML을 얻기 위해 requests 라이브러리를, 가져온 HTML을 분석하기 위해 BeautifulSoup 라이브러리 사용

 

2. BeautifulSoup

  - BeautifulSoup : HTML, XML, JSON 등 파일의 구문을 분석하는 모듈. 웹 페이지를 표현하는 HTML을 분석하기 위해 사용

  - html 문서 불러오기

# 변수 이름은 관습적으로 soup
# 'html.parser' : BeautifulSoup 객체에게 'HTML을 분석해라' 라고 알려주는 의미
soup = BeautifulSoup(open("index.html"), "html.parser")

  - 태그 내용 출력하기

soup.find("p") # 처음 등장하는 태그 찾기 (태그 하나)
soup.find_all("p") # 모든 태그 찾기 (태그 여러개를 담고 있는 리스트)

# 클래스명으로 찾기
soup.find("div", class_="elice")  # class_ : 특정 클래스를 가진 태그를 추출

# id명으로 찾기
soup.find("div", id="elice")

# 태그가 갖고 있는 텍스트 뽑기
soup.find("div", class_="elice").find("p").get_text()

3. Requests

  - Requests : 파이썬에서 HTTP 요청을 보낼 수 있는 모듈

  - POST 요청 : 정보를 생성, 변경하기 위한 요청

  - GET 요청 : 정보를 조회하기 위한 요청 

# requests로 웹 페이지 HTML 문서 불러오기
url = "https://www.google.com"
result = requests.get(url)

  - 요청 결과 확인과 내용 확인하기

print(result.status_code)
print(result.text)

4. 실전 크롤링

  - 개발자 도구 사용하기

    ① 확인할 페이지에서 오른쪽 버튼 → 검사를 누르거나, F12 버튼을 누른다

  - 네이버 헤드 뉴스 찾기

    ① 헤드 뉴스 부분이 어디인지 찾기

    ② 해당 클래스의 이름으로 div 변수 만들기

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    result = []
    
    div = soup.find("div", class_ = 'list_issue')
    print(div)  # list_issue 클래스의 모든 태그와 내용이 print 됨
    
    return result

    ③ 해당 div에서 a 태그 안에 있는 텍스트만 추출

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    result = []
    
    div = soup.find("div", class_ = 'list_issue')
    
    for a in div.find_all("a") :
        print(a.get_text())
    
    return result

    ④ 추출된 텍스트를 result 에 추가

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    result = []
    
    div = soup.find("div", class_ = 'list_issue')
    
    for a in div.find_all("a") :
        result.append(a.get_text())
    
    return result

[02 여러 페이지 크롤링하기]

1. Query

  - Query : 웹 서버에 GET 요청을 보낼 때 조건에 맞는 정보를 표현하기 위한 변수

# requests의 get 메소드로 GET 요청을 보낼 때 params 매개변수에 딕셔너리를 전달
url = "https://www.google.com/search"
result = requests.get(url, params = {'q':'elice'})

2. Tag Attribute

  - 태그와 속성 : 예를 들어 <div class=“elice” id=“title”>제목</div> 라면, div 는 태그,  classs 와 id는 속성이다. (속성 확인시에는 attrs 사용)

<a href="https://www.naver.com/">네이버</a>

a = soup.find("a")
print(a['href])  # https://www.naver.com/

3. Children, Name

  - Children : beautifulsoup의 children 속성으로 어떤 태그가 포함하고 있는 태그들도 조회할 수 있음

  - Name : 태그의 이름을 의미하는 속성

[03 API를 이용한 크롤링]

1. API

  - Application Programming Interface : 어떤 프로그램과 또 다른 프로그램을 연결해주는 매개체입

  - 보통 API를 이용하여 데이터를 불러오는 경우는 데이터가 ‘동적’으로 변화하는 일이 많아 실시간으로 값을 불러와야 하는 경우가 많음

# API의 URL에 GET 요청을 보내면 JSON 데이터를 얻을 수 있음
url = "http://finance.daum.net/api/search/ranks?limit=10"
req = requests.get(url) # JSON 데이터

  - 일부사이트는 크롤러 이용X, 우회하기 위해 requests.get 메소드에 'headers' 매개변수 지정해야함

  - header : HTTP 상에서 클라이언트와 서버가 요청 또는 응답을 보낼 때 전송하는 부가적인 정보를 의미 (옵션 : referer - 이전 웹 페이지의 주소를 의미 / user-agent - 이용자의 여러 가지 사양)

  - Daum 증권 페이지에서 인기 검색 상위 10개 기업 주가 크롤링

     ① 페이지가 API로부터 실시간으로 변하는 주식의 정보를 주기적으로 요청하여 표시하고 있기 때문에 이전처럼 HTML 문서를 분석하여 크롤링하는 방식을 사용할 수 없음. 이때는 웹에서 요청하는 서버에 직접 요청하여 json 데이터를 얻은 후 출력해야함

    ② 개발자 도구의 Network 탭에서 API의 URL 확인

    ③ 데이터를 불러오는 코드 작성

def get_data() :
    result = []
    # 개발자 도구를 통해 구한 상위 10개 기업의 정보를 얻는 API url을 입력
    url = "http://finance.daum.net/api/search/ranks?limit=10" 
    req = requests.get(url, headers = custom_header)
    
    # 해당 url 접속이 되는지 확인
    if req.status_code == requests.codes.ok:    
        print("접속 성공")
        # 파이썬의 json 모듈을 사용해 데이터를 저장
        stock_data = json.loads(req.text)
        print(stock_data)
    else:
        print("접속 실패")
        
    return result

    ④ result 변수에 필요한 데이터만 저장

def get_data() :
    result = []
    # 개발자 도구를 통해 구한 상위 10개 기업의 정보를 얻는 API url을 입력
    url = "http://finance.daum.net/api/search/ranks?limit=10" 
    req = requests.get(url, headers = custom_header)
    
    # 해당 url 접속이 되는지 확인
    if req.status_code == requests.codes.ok:    
        print("접속 성공")
        # 파이썬의 json 모듈을 사용해 데이터를 저장
        stock_data = json.loads(req.text)
        # 해당 데이터의 'data'라는 인덱스 안에 각각의 요소를 저장
        for i in stock_data["data"]:
            # 필요한 데이터만 필터링
            result.append([i['rank'], i['name'], i['tradePrice']])
    else:
        print("접속 실패")
        
    return result


※ 수업 자료의 출처는 K-Digital Training x 엘리스 인공지능 서비스 개발 기획 1기 (elice.io/)입니다.

반응형