문제
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
찾는 데로 추가하겠습니다.
파이썬 엑셀 파일 빠르게 읽는 방법(dask, csv, xlsx) (0) | 2022.11.03 |
---|---|
판다스(Pandas DataFrame) 정렬 방법(오름차순, 내림차순) (0) | 2022.10.24 |
Django에서 jupyter notebook 사용하는 방법(django extensions) (0) | 2022.10.20 |
판다스(Pandas DataFrame) 특정 글자 포함 행 추출 및 삭제하기 (0) | 2022.10.14 |
판다스(Pandas DataFrame) 컬럼(columns) 변경하기(rename) (0) | 2022.10.14 |