IT/Python

Cloudflare에 막힌 investing.com 크롤링하기(인베스팅닷컴)

조대리 2022. 10. 23. 22:55
반응형

 

문제

 

investing.com(인베스팅닷컴)에는 매우 다양한 시장 데이터들이 존재하며 검색만으로 쉽게 접근할 수 있다. 해외주식부터 국내주식, 원자재, 선물, 경제 이벤트, 심지어는 코인(crypto) 가격도 제공한다.

 

나 또한 사이트의 정보를 이용하기 위해 프로그램을 짜서 데이터를 수집해왔다. 얼마 전까지만 하더라도 Ajax(Asynchronous Javascript And XML)를 이용해 매우 편리하게 데이터를 가져올 수 있었다.

 

""" 현재는 막힌 방법 중 하나이다. """

import requests as rq
from bs4 import BeautifulSoup


url = ('https://kr.investing.com/instruments/HistoricalDataAjax')
data = {
    'curr_id': '29296',
    'smlID': '205717',
    'header': '한국 3년 채권 수익율 내역',
    'st_date': '2022/01/01',
    'end_date': '2022/10/20',
    'interval_sec': 'Daily',
    'sort_col': 'low',
    'sort_ord': 'ASC',
    'action': 'historical_data',
    }
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Whale/2.8.108.15 Safari/537.36',
    'Referer': 'https://kr.investing.com/',
    'X-Requested-With' : 'XMLHttpRequest',
    }

html = rq.post(url, headers=headers, data=data).text
soup = BeautifulSoup(html, 'html.parser')
table = soup.select("[id='curr_table']")

 

 

이번에 글을 작성하게 만든 이유 중 하나는, 'requests' 라이브러리를 사용하는 것조차도 Cloudflare로 막았다는 것이다. 인베스팅닷컴이 Cloudflare을 도입하면서 하나둘씩 수집할 수 있는 방법들이 사라지고 있다.

 

그럼에도 데이터는 필요하니 수집할 수 있는 방법을 찾아야 되지 않겠는가? (유료 서비스가 있는 것도 아니고 광고 없애주는 것만 있으니...)

 

그렇게 창과 방패의 싸움이 시작됐다.

 

 

해결 방법 1

 

현재까지 찾은 방법은 'cloudscraper' 라이브러리를 이용하는 것이다. 파라미터에 대해서는 아래 사이트에 설명되어 있으니 확인하면 된다.

 

https://pypi.org/project/cloudscraper/

 

""" 이대로 사용해도 잘 작동합니다. (22.10.20 기준) """

import cloudscraper


url_base = ('https://kr.investing.com/currencies/usd-krw-historical-data')

scraper = cloudscraper.create_scraper()
html = scraper.get(url_base).content

soup = BeautifulSoup(html, 'html.parser')
table = soup.select("[class='border border-main'] > div > table")

 

대신 위 코드로는 페이지에 표시되는 한달 가량의 데이터만 수집할 수 있다.

 

보다 더 과거의 데이터를 수집하기 위해서는 날짜를 조작하는 코드를 추가로 붙여야할 것이다.

 

 

 

해결 방법 2

 

찾는 데로 추가하겠습니다.

 

반응형