본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 7-1주차: API의 활용

<7-1주차 수강 클립>

02. 데이터 수집을 위한 Python (Crawling)

04. API의 활용 - 01. requests 모듈 사용하기 (HTTP 통신)

05. API의 활용 - 02. Open API를 활용하여 json 데이터 추출하기 (공공데이터 api)

06. beautifulsoup 모듈 - 01. beautifulsoup 모듈 사용하여 HTML 파싱하기(parsing)

 


이번 주차부터는 이론을 바탕으로 본격적으로 웹페이지를 크롤링 해보는 시간이었습니다.

공공데이터 api를 이용해 json데이터를 추출해보고

request와 beautifulsoup 모듈의 사용법에 대해 익히고

http통신을 자동화 하는 법을 배우는 주차였네요!

 

>>수강 인증샷<<

 


 

04. API의 활용 - 01. requests 모듈 사용하기 (HTTP 통신)

 

- requests 모듈

http request(요청)/response(응답)을 위한 모듈 (즉, http 통신)

HTTP method를 메소드 명으로 사용하여 request 요청 ex) get, post (메소드 이름이 동일하여 편리함)

 

*) 우리가 자동화 할 것: 웹 페이지 내의 데이터를 얻기 위해 서버에 요청(request)을 보내서 받은 응답(response)을 출력해보는 것!! (화면에 렌더링해서 보이는 것에는 신경 쓸 필요 x)

 

- get 요청하기

query parameter을 이용하여 데이터 전달하기

#이 주소에 해당하는 서버에 데이터 요청을 보내서 응답을 가져오기
    #응답에는 [코드]가 있다! (2로 시작하면 성공, 200이 가장 general)
url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)

resp

: 응답 코드 Response [200]

 

resp.text

: 페이지 소스보기 (html 문서)

 

- post 요청하기

post data 이용하여 데이터 전달하기

  • 민감한 데이터를 전달하는 용도로 사용함 (주로 로그인-id, pwd)
  • 데이터를 url을 통해 줄 수가 없음 ('개발자 도구'를 통해 봤을 때 url 내에 데이터가 포함돼있지 않음)
  • form data 칸에 따로 입력한 (예를 들어)id, pwd가 표시됨
#로그인 페이지
    #post(url, data = form data)
    #form data는 기본적으로 dict로 구성함
url = 'https://www.kangcom.com/member/member_check.asp'
data = {
    'id': 'macmath22',
    'pwd': 'Test1357!'
}
resp = requests.post(url, data = data)

#로그인 후의 컨텐츠를 받을 수 있음
resp.text
data = {
    'id': 'macmath22',
    'pwd': 'wrong password'
}
resp = requests.post(url, data = data)

#로그인 실패 시의 페이지
resp.text

 

- HTTP header 데이터 이용하기

1. header 데이터 구성하기

2. header 데이터 전달하기

  • 단순히 url과 데이터만으로 원하는 정보가 크롤링되지 않는 경우, request header&response header에 명시된 값을 구성&전달해서 크롤링할 수 있음 (대표적으로 user agent)
  • 기본적인 값만 세팅해서 크롤링을 시도해서 안될 경우, 헤더를 적절히 사용해서 크롤링할 수 있음
  • 헤더 값을 dict로 key: value로 구성, 'headers'라는 named parameter에 전달해서 사용
url = 'https://news.v.daum.net/v/20190728165812603'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
resp = requests.get(url, headers = headers)
resp.text

 

- HTTP response 처리하기

1. response 객체의 이해

2. status_code 확인하기

3. text 속성 확인하기

url = 'https://news.v.daum.net/v/20190728165812603'
resp = requests.get(url)

#응답 코드 확인
resp.status_code

# if resp.status_code == 200:
#     resp.text
#     #기타등등 처리,,
# else:
#     print('error')

 


05. API의 활용 - 02. Open API를 활용하여 json 데이터 추출하기 (공공데이터 api)

 

- open api

누구나 API를 사용할 수 있도록 제공되는 기능

서비스를 신청하거나 기본적으로 존재하는 API에 요청해서 응답을 받은 데이터를 활용해 처리할 수 있음

 

- 공공데이터 포털 OPEN API 사용하기

  1. 공공데이터 포털 회원가입/로그인(https://www.data.go.kr/)
  2. API 사용 요청 / 키 발급 _ 거의 모든 API는 호출 파라미터로 '키'를 요구하기 때문에 키가 반드시 필요함
  3. API 문서(specification) 확인 _ 신청한 API 내의 참고문서 확인
    • 3-1. 문서 내에서 API 활용 메뉴얼 확인
    • ex) 일 1000건의 트래픽 제공: 한 키로 하루 최대 1000번까지 호출 가능
  4. API 테스트 및 개발 (파이썬으로 자동화)

- key 값 확인하기

서비스 호출을 트래킹 할 목적이나 악의적인 사용을 금지할 목적으로 주로 사용됨

새로 발급받은 키는 1시간 이후 사용 가능

#open API 인증키
serviceKey = 'tjB66CWwclYuyLkLKT1yyZ6KP%2BPpxp0883YDTF%2FB%2BKaPcjojJeWuIiFB5UHEw2G0yHizVlNx2Xa2h6tIwwxujw%3D%3D'

 

- endpoint 확인하기

endpoint: API가 서비스되는 서버의 IP 혹은 domain 주소

 

- parameter 확인하기

API 호출에 필요한 parameter 값 확인 및 구성

(사용 메뉴얼 문서에서 이미 필요한 parameter을 예제로 확인함)

#문서_요청&응답 예제 복붙
#실행 결과 url: XML형식으로 데이터를 받아옴
    #serviceKey 파라미터에 내가 할당받은 인증키(serviceKey 변수) 전달하기
endpoint = 'http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey={}&numOfRows=10&pageSize=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest'.format(serviceKey)
print(endpoint)

: XML 형식_웹 상의 데이터 교환 포맷 중 하나 

#json형식으로 받아올 경우 [&_type=json] 추가 (문서에서 확인)
endpoint = 'http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey={}&numOfRows=10&pageSize=10&pageNo=1&MobileOS=ETC&MobileApp=AppTest&_type=json'.format(serviceKey)
print(endpoint)

: 요즘은 json이 많이 쓰임! (파이썬에서는 json을 다루기 더 용이)

 

- 요청 및 응답 확인

requests 모듈을 활용하여 API 호출

response를 확인하여 원하는 정보 추출

json 데이터의 경우 파이썬 딕셔너리로 변경하여 사용가능!!

endpoint = 'http://api.visitkorea.or.kr/openapi/service/rest/EngService/areaCode?serviceKey={}&numOfRows=10&pageSize=10&pageNo={}&MobileOS=ETC&MobileApp=AppTest&_type=json'.format(serviceKey, 1)
resp = requests.get(endpoint) #url에 데이터가 포함돼있기 때문에 get방식

print(resp.status_code) #[200]
print(resp.text)

print('\n')

#전달받은 response(응답 데이터)가 json 형식인 경우 text로 확인하기보다 json()함수 호출하기!
#json의 경우 파이썬의 dict와 호환되기 때문

data = resp.json() #type: dict
print(data['response']['body']['items']['item'][0]) #딕셔너리 value 가져오기

 


 

06. beautifulsoup 모듈 - 01. beautifulsoup 모듈 사용하여 HTML 파싱하기(parsing)

 

- beautifulsoup 모듈 사용하기

#최신버전이 4, 모듈에서 객체 import하기
from bs4 import BeautifulSoup

 

- html 문자열 파싱(parsing)

문자열로 정의된 html 데이터를 파싱하기

 

- find 함수

  • 특정 html tag를 검색
  • 검색 조건을 명시하여 찾고자하는 tag를 검색
  • tag를 전달해서 찾기
  • tag 내의 속성을 이용해서도 찾을 수 있음 (named parameter에 전달)
  • 여러 개의 속성으로 찾기도 가능
  • 가장 먼저 찾은 결과를 반환함

ex) soup = BeautifulSoup( [html 문서_string] )

soup.find( [태그명_string] )

soup.find( [태그명], [속성1='속성값1'] )

*) 속성명이 키워드와 겹친다면 끝에 '_' 붙이기 (ex) class_ )

multiful한 속성(조건) 명시 → dict로 구성

attrs = { '속성1': '속성값1', '속성2': '속성값2' }

soup.find( [태그명], attrs=attrs ) 

 

- find_all 함수

find가 조건에 만족하는 하나의 tag만 검색(가장 먼저 검색되는) 한다면, find_all은 조건에 맞는 모든 tag를 리스트로 반환

해당되는 모든 태그를 리스트 형태로 반환

 

- get_text 함수

tag안의 value를 추출

부모tag의 경우, 모든 자식 tag의 value를 추출

 

- attribute 값 추출하기

경우에 따라 추출하고자 하는 값이 attribute(태그 <> 내의 속성)에도 존재함

  • attribute: 태그 내의 속성, key: value pair

이 경우에는 검색한 tag에 attribute 이름을 [] 연산을 통해 추출 가능

es) div.find('h3')['title']

tag = soup.find('h3')
print(tag)
	#결과: <h3 title="Good Content Title">Contents Title</h3>
tag['title']
	#결과: 'Good Content Title'

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형