엘리스 AI 트랙 04주차 - 파이썬 크롤링 (1/15) 🔥
✔ 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/)입니다.