Data Analysis/Web Crawling

[Crawling] Web API를 이용해 원하는 데이터를 요청/응답 받아보자

seoraroong 2024. 8. 21. 14:43

Web API

API (Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)

 

웹 API : 웹 애플리케이션 개발에서 다른 서비스에 요청을 보내고 응답을 받기 위해 정의된 명세이다.

📌HTML 소스를 분석하는 과정 없이 웹 서버에 원하는 데이터를 요청하고 받을 수 있다!

 

데이터 형식 : XML, JSON

 

 

국제 우주 정거장 정보를 가져와서 세계 지도 위에 mapping 하기

국제 우주 정거장의 위도와 경도를 5초 간격으로 1분 동안 수집해서 mapping

 

 

- 필요한 라이브러리 호출하기

import requests
import json
import time

 

- 웹 페이지에 데이터를 HTTP로 요청하고 응답 받아서 필요한 정보 출력하기

  • requests 함수로 웹 페이지를 불러와서 변수 r에 저장
  • dictionary 형태인 JSON 데이터 형식으로 변환 후 저장
  • 추출할 데이터 결정 후 정의하기
url = 'http://api.open-notify.org/iss-now.json'
position = []
for i in range(12):
    r = requests.get(url) # requests 함수로 url을 읽어오기
    iss_dict = json.loads(r.text)  # string to json(dictionary)
    lo = iss_dict['iss_position']['longitude']
    la = iss_dict['iss_position']['latitude']
    print(f"위도:{lo} 경도:{la}")
    position.append((lo,la))
    time.sleep(5)

 

→ 5초 간격으로 위도, 경도 정보를 12번 출력

→ 지도 위에 mapping 할 수 있도록 출력한 데이터를 position이라는 리스트에 저장하기

 

- 맵 객체를 생성하고 position 리스트에 저장한 좌표를 맵에 마커로 표시하기

# position 리스트가 비어있지 않다고 가정
lo_mean, la_mean = position[0]

# 맵 객체 생성
map = folium.Map(location=[float(lo_mean), float(la_mean)], zoom_start=8)

# 리스트에 저장된 좌표를 마커로 표시
for idx, (lo, la) in enumerate(position):
    lo = float(lo)
    la = float(la)
    folium.Marker(
        [lo, la],
        popup='iss' + str(idx)
    ).add_to(map)

# HTML 파일로 저장하여 지도를 확인
map.save("iss_track.html")

 

- 저장한 HTML 파일 열기

# HTML 파일 열기
with open("iss_track.html", "r") as file:
    html_content = file.read()

# 파일 내용 출력 또는 다른 작업 수행
print(html_content)

 

- 맵에 마킹한 위성의 위치 정보를 시각적으로 확인하기

from IPython.display import IFrame
IFrame("iss_track.html", width=700, height=500)

 

 

 

RESTCOUNTRIES 에서 국가 정보를 가져와 대한민국의 region과 같은 국가 출력하기

 

- 필요한 라이브러리 호출하기

import requests
import json

 

- 웹 페이지에 데이터를 HTTP로 요청하고 응답 받아서 필요한 정보 출력하기

url = "https://restcountries.com/v3.1/all"
r = requests.get(url)
countries = json.loads(r.text)

 

- 대한민국과 같은 region의 국가들을 모두 출력하기

for country in countries:
    if country['region']=='Asia':
        print(country['translations']['kor']['official'])
    else:
        pass