비동기 데이터 처리하기

YU NA Joe·2022년 7월 19일
0
import requests
from bs4 import BeautifulSoup as bs

url = 'https://finance.daum.net'
res = requests.get(url)
soup = bs(res.text, "html.parser")
data = soup.findAll("rankingB", {"id" : "boxBestSearchs"})
data  # []

왜 빈 리스트를 반환할까?!

  Ajax를 통해 비동기적으로 데이터를 불러왔기 때문이다. 
- JavaScript의 라이브러리중 하나이며 Asynchronous Javascript And Xml(비동기식 자바스크립트와 xml)의 약자
- AJAX라는 기술은 여러가지 기술이 혼합적으로 사용
(HTML, DOM, JavaScript, XMLHttpRequest) 
-  자바스크립트를 통해서 서버에 데이터를 요청하는 것

비동리 처리 데이터는 어떻게 가져올까?!

1.Selenium을 이용해 headless browser로 접근하여 동적 데이터를 로드시켜 가져오는 것
2.직접 필요 데이터에 접근하여 정적인 데이터를 가져오는 것

2번 방법을 써보자(데이터 직접 접근)

# 개발자도구에서 Network 탭을 누르고 Name중에 'rank10'를 눌러보쟈 
# preview를 보면은 해당하는 데이터가 보이고, 
url = "https://finance.daum.net/api/search/ranks?limit=10"
res = requests.get(url)
res  # <Response [403]>

# 오류 403을 고쳐보쟈 
# header추가하기 

url = "https://finance.daum.net/api/search/ranks?limit=10"
res = requests.get(url)
print('header없는 url요청 :',res)


headers = {
            'Referer': 'http://finance.daum.net',
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 OPR/58.0.3135.127'
}
res = requests.get(url, headers=headers)
print("header가 있는 url요청", res)

header없는 url요청 : <Response [403]>
header가 있는 url요청 <Response [200]>
# XHR 데이터에 직접 접근하는 경우에는 JSON 형태로 데이터를 받아와야 한다.
import requests
from bs4 import BeautifulSoup as bs

url = 'https://finance.daum.net/api/search/ranks?limit=10'
headers = {
            'Referer': 'http://finance.daum.net',
            'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 OPR/58.0.3135.127'
}
response = requests.get(url, headers=headers)
jsonObj = response.json()
print(jsonObj)
{'data': [{'rank': 1, 'rankChange': 0, 'symbolCode': 'A005930', 'code': 'KR7005930003', 'name': '삼성전자', 'tradePrice': 60700, 'change': 'FALL', 'changePrice': 1....

정리

- Ajax로 처리되는 데이터는 단순히 get 요청으로 불러올 수 없어서, Selenium을 이용하거나
XHR 데이터 url에 직접 접근하는 방법으로 크롤링

- XHR 데이터에 직접 접근하는 것을 막아놓는 경우가 있는데, 보통 헤더 정보가 없어서 그런 경우가 많다.
그런 경우에 헤더를 추가해주면 대부분 해결됨

-XHR에 직접 접근할 경우 JSON 데이터로 반환되기 때문에 json parsing을 해주어야 한다.

출처

0개의 댓글