Byeonguk Kim

안녕하세요. 29살의 조금은 늦은 나이로 새롭게 개발자로 시작하는 신입 개발자입니다. 포트폴리오 [https://deaguowl.github.io]

프로젝트 05. 조회급등 증권 크롤링하기(동적크롤링)

28 Apr 2019 » 프로젝트

2019.04.28 TIL

(TIL은 스스로 이해한 것을 바탕으로 정리한 것으로 오류가 있을 수 있습니다)

# 질문에 답하기

  1. 동적크롤링하기

크롤링 할 대상

  • 조회급등 대상

스크린샷 2019-04-28 오후 9 03 15

#목표

  • 자바스크립트로 지속적으로 변하는 조회급등 상품에 대해 1위부터 10위까지 크롤링한다.
  • Ajax 및 json에 대해 이해한다.
  • 몇위인지, 코드가 몇번인지, 이름 및 가격까지 출력한다.

흐름

  • 동적크롤링은 일단 그 원본이 되는 url 주소를 알아야 한다. 그러기 위해 일단 크롤링 할려고 하는 부분이 자바스크립트으로 구현되어 동적으로 작동하는지 아니면 정적인지 정확히 확인할 수 있어야 한다. 그리고 동적으로 작동하는 것을 확인하면 그것의 원본 url을 알아내서 그 url로 접근하여야 한다. 이 경우 대부분 막아놓는 경우가 많으므로 custom_header를 써야한다. 그리고 동적크롤링은 정적크롤링과 다르게 Ajax request로 요청되며 이러한 요청에 대해 서버는 교체되어야 하는 값만을 반환해주기 때문에 html 문서가 오는 것이 아니다. 따라서 beautifulsoup를 사용하지 않고 Json 으로 서버가 보내준 것을 해석해야 한다.

구현


import requests
import json

custom_header = {
	'referer' : "http://finance.daum.net/api/search/ranks?limit=10",
	'user-agent' : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
}

url = "http://finance.daum.net/api/search/ranks?limit=10"

req = requests.get(url, headers = custom_header)

if req.status_code == requests.codes.ok:
	print("접속 성공")
	stock_data = json.loads(req.text) #json에 반환된 데이터가 들어가 있다.
	for rank in stock_data['data']:   #stock data는 'data' key값에 모든 정보가 들어가있다.
		print(rank['rank'], rank['symbolCode'], rank['name'], rank['tradePrice'])

else:
	print("Error code")