728x90
반응형
728x90
반응형
728x90
반응형

이번 포스팅에서는 웹페이지에 JSON 형태로 반환되는 데이터를 크롤링 해보도록 하겠습니다.

 

예제 페이지로 네이버 금융 해외증시를 살펴보겠습니다.

 

해외증시에서 S&P 500을 클릭합니다.

일별 시세에서 마우스 오른쪽 클릭해서 '검사'를 누르거나 Ctrl + Shift + C를 눌러 검사 창을 띄웁니다.

 

일별 시세에서 다른 페이지를 눌러 보겠습니다. 그런데 페이지를 바꿔도 URL 주소가 변경되지 않습니다.

 

왜 그런지 살펴보기 위해 검사 창에 Network 탭에 들어가 봅니다.

 

페이지를 누를 때마다 새로운 URL주소가 생깁니다. 

 

다음과 같이 주소를 선택한 후 마우스 오른쪽 클릭해서 Copy -> Copy link address를 클릭합니다.

 

 

finance.naver.com/world/worldDayListJson.nhn?symbol=SPI@SPX&fdtc=0&page=2
복사한 URL을 살펴보니 worldDayListJson을 호출하고 있습니다.

 

이 주소를 브라우저 창에 넣고 접속 해보도록 하겠습니다.

다음과 같이 JSON 형태의 데이터로 반환하고 있음을 알 수 있습니다.


파이썬에서 json 데이터를 크롤링 하는 코드를 작성해보겠습니다.

 

import pandas as pd
from urllib.request import urlopen
import json

symbol = 'SPI@SPX'
page = 1
url = 'https://finance.naver.com/world/worldDayListJson.nhn?symbol=' + symbol + '&fdtc=0&page=' + str(page)
httpResponse = urlopen(url)
jsondata = json.load(httpResponse)
jsondata

위 코드를 실행하면 json 형태로 데이터를 반환합니다.

 

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 데이터프레임(DataFrame)에 있는 데이터를 SQLite 테이블에 넣는 방법에 대해 설명드리겠습니다.

 

SQLite는 서버없이 사용하는 가벼운 DB 엔진이고 Data Base가 파일로 구성되어 있습니다.

복잡하지 않고 가벼운 DB시스템을 원한다면 SQLite는 적절한 선택이 될 것입니다.

 

SQLite 테이블에 Insert할 데이터프레임 정보는 다음을 참고하시기 바랍니다. 

 

2020/12/06 - [프로그래밍/┗크롤링과 스크레이핑] - [Python] 웹 페이지에 있는 table 읽어서 데이터프레임(DataFrame)에 담기

 

[Python] 웹 페이지에 있는 table 읽어서 데이터프레임(DataFrame)에 담기

이번 포스팅에서는 웹 페이지에 있는 table 태그를 읽어서 데이터프레임(DataFrame)에 담는 과정을 설명드리겠습니다. 네이버 금융에서 시간별 시세(분봉)를 가져와 보도록 하겠습니다. 삼성전자(005

grand-unified-engine.tistory.com

SQLite를 사용하기 위해 DB Browser for SQLite를 설치합니다. 경로는 다음과 같습니다.

 

DB Browser for SQLite (sqlitebrowser.org)

 

DB Browser for SQLite

DB Browser for SQLite The Official home of the DB Browser for SQLite Screenshot What it is DB Browser for SQLite (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. DB4S is for users and dev

sqlitebrowser.org

설치 후 프로그램을 열면 아주 쉬운 인터페이스로 구성되어 있음을 알 수 있습니다.

 

1. 먼저 새 데이터베이스를 생성합니다. 새 데이터베이스를 클릭합니다.
   다음과 같이 데이터베이스가 파일로 저장되는 것을 확인할 수 있습니다.

2. 원하는 데이터베이스 이름을 지정하고 저장을 클릭합니다.

 

3. 테이블을 생성하기 위해 테이블 생성하기 버튼을 클릭합니다.

   다음과 같이 테이블 정의 팝업이 뜹니다.

"필드 추가" 버튼을 눌러 필드를 계속 추가할 수 있고 아래쪽에 스크립트가 자동생성되는 것을 볼 수 있습니다.

확인 버튼을 눌러 테이블을 생성합니다.

 


이제 파이썬 코딩을 해보겠습니다.

 

우선 DataFrame에 있는 데이터를 print해서 확인하는 것까지 해보겠습니다.

 

소스는 다음과 같습니다.

 

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import datetime

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201210153000'
df = pd.DataFrame()
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]

for page in range(1, int(last_page)+1):
    page_url = '{}&page={}'.format(url, page)
    df = df.append(pd.read_html(page_url, header=0)[0])

df = df.dropna()
df = df[['체결시각', '체결가', '거래량', '변동량']]
df[['체결가', '거래량', '변동량']] = df[['체결가', '거래량', '변동량']].astype(int)

df.insert(len(df.columns), "코드", '005930')

today = datetime.datetime.today().strftime('%Y-%m-%d')
for row in df.itertuples():
    print("코드 : {}, 체결시각: {}, 체결가: {}, 거래량: {}, 변동량: {}".format(row[5], today + " " + row[1] + ":00", row[2], row[3], row[4]))

 

결과는 다음과 같습니다.

데이터가 잘 들어가 있으니 SQLite 테이블에 Insert 하겠습니다.

 

먼저 sqlite3를 import합니다. 파이썬에 내장되어 있어 바로 import되는 것을 볼 수 있습니다.

 

아래 코드를 추가하고 실행합니다.

 

con = sqlite3.connect("D:/PycharmProject_32bit/Kiwoom/sqlite/stock_jarvis.db")
cur = con.cursor()

for row in df.itertuples():
    sql = "insert into minute_price(code, time, close, volume, diff) values (?, ?, ?, ?, ?)"
    cur.execute(sql, (row[5], row[1], row[2], row[3], row[4]))
con.commit()

 

먼저 DB Browser for SQLite를 이용해서 데이터가 잘 들어갔는지 확인해 보도록 하겠습니다.

파이썬으로도 확인해보겠습니다.

 

cur.execute("select * from minute_price")
 
# 데이타 Fetch
rows = cur.fetchall()
for row in rows:
    print(row)
 
# Connection 닫기
con.close()

튜플 형태로 데이터를 반환하는 것을 확인할 수 있습니다.

 

지금까지 DataFrame 데이터를 SQLite 테이블에 Insert 하는 과정을 살펴봤습니다.

 

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 웹 페이지에 있는 table 태그를 읽어서 데이터프레임(DataFrame)에 담는 과정을 설명드리겠습니다.

 

네이버 금융에서 시간별 시세(분봉)를 가져와 보도록 하겠습니다.

 

삼성전자(005930)을 조회합니다. 시세 탭을 클릭 후 '시간별 시세'의 데이터가 표시된 곳에서 마우스 오른쪽 클릭하여 프레임 소스 보기를 클릭합니다.

소스 보기에서 view-source: 를 지우고 finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047 만 남겨두고 접속합니다.

그러면 시간별 시세만 페이지에 표시됩니다.

 

첫 페이지에 있는 table을 DataFrame에 담아보겠습니다.

파이썬 코드는 다음과 같습니다.

import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame() # (1)
df = df.append(pd.read_html(url, header=0)[0]) # (2)
df = df.dropna() # (3)
print(df)

(1) DataFrame 변수 df를 선언하고 

(2) pandas로 html을 읽어오는데 header=0은 table의 첫 행을 DataFrame 컬럼으로 설정하라는 것이고 다음 [0]은 해당 url의 첫 번째 table을 가져오라는 것입니다.

(3) 비어 있는 행을 삭제하라는 것입니다.

 

결과는 다음과 같습니다.

이번에는 마지막 페이지를 구한 후 해당 일자의 전체 분봉 정보를 가져오겠습니다.

 

마지막 페이지를 구하기 위해 '맨뒤'를 마우스 위치시키고 마우스 오른쪽 클릭 후 '검사'를 선택합니다. 

아니면 Ctrl + Shift + c 하면 element를 선택할 수 있는 상태가 되는데 그 상태에서 '맨뒤'를 마우스 클릭합니다.

'맨뒤'의 url 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40 입니다.

뒤에 &page=40 이런 식으로 파라미터가 붙는 것을 알 수 있고 마지막 페이지는 40임을 알게 되었습니다.

 

이제 마지막 페이지를 구하는 파이썬 코드를 구현해 보도록 하겠습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR') # (1)
    s = str(pgrr.a['href']).split('=') # (2)
    last_page = s[-1] # (3)
print(last_page)

(1) 'pgRR' 클래스를 가지는 td 태그를 찾아서 pgrr에 담습니다.

(2) pgrr 아래 a 링크 주소를 '=' 기준으로 split 합니다. a 링크 주소는 /item/sise_time.nhn?code=005930&thistime=20201204161047&page=40인데 '=' 기준으로 split하면 s에는 ['/item/sise_time.nhn?code', '005930&thistime', '20201204161047&page', '40']이 될 것입니다.

(3) 리스트 데이터의 마지막 데이터를 가져옵니다.

 

이제 마지막 페이지까지 루프를 돌아 전체 페이지를 읽어오는 로직을 구현해 봅시다.

파이썬 코드는 다음과 같습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://finance.naver.com/item/sise_time.nhn?code=005930&thistime=20201204161047'
df = pd.DataFrame()
with urlopen(url) as doc:
    html = BeautifulSoup(doc, 'lxml')
    pgrr = html.find('td', class_='pgRR')
    s = str(pgrr.a['href']).split('=')
    last_page = s[-1]

for page in range(1, int(last_page)+1):
    page_url = '{}&page={}'.format(url, page) # (1)
    df = df.append(pd.read_html(page_url, header=0)[0]) # (2)

df = df.dropna()
print(df)

(1) page 파라미터에 1부터 last_page 까지 for문을 돌아 url을 갱신합니다.

(2) 각 페이지마다 읽은 데이터를 DataFrame에 append 합니다.

 

결과는 다음과 같습니다.

이제 분봉 데이터를 이용할 수 있게 되었습니다.

728x90
반응형
728x90
반응형

이번 포스팅에서는 웹 페이지에서 크롤링 후 원하는 데이터의 태그 위치를 찾는 방법에 대해 알아보겠습니다.(크롬을 이용합니다)

 

네이버 증권 일별 시세에서 원하는 데이터를 가져오는 방법으로 설명드리겠습니다.

 

네이버 증권에 들어가 삼성전자(005930)를 검색하고 시세 탭에 들어갑니다. 다른 종목으로 하셔도 됩니다.

 

일별 시세에서 마우스 오른쪽을 클릭해서 프레임 소스 보기를 클릭합니다.

 

일별시세 프레임의 소스가 표시됩니다.

url 주소창에 view-source:를 삭제하고 엔터키를 누릅니다.

그러면 다음과 같이 일별시세만 화면에 표시됩니다.

이제부터 원하는 데이터의 위치 찾기입니다.

날짜 필드의 첫번째 날짜 위치를 찾아보겠습니다.

날짜 필드의 첫번째 날짜에 마우스를 갖다대고 마우스 오른쪽 클릭하여 검사 버튼을 누릅니다.

그러면 크롬 창 오른쪽에 해당 데이터의 태그를 찾아갑니다.

 

파이썬으로 해당 위치를 찾아가 보도록 하겠습니다.

먼저 해당 페이지에서 span태그가 몇개 있는지 살펴보겠습니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

naver_index = 'https://finance.naver.com/item/sise_day.nhn?code=005930'
source = urlopen(naver_index).read()
source = BeautifulSoup(source, 'lxml')
span = source.find_all('span')
print(len(span))

해당 페이지에서 span은 71개가 나왔습니다.

 

이렇게 같은 태그가 많은 페이지에서 원하는 데이터의 위치를 찾을  때 사용하는 방법이 있습니다. 바로 XPath 입니다.

 

다음 그림처럼 Elements탭에서 가져오고자 하는 데이터를 선택 후 마우스 오른쪽 클릭하여 Copy -> Copy XPath를 클릭합니다.

붙여넣기(Ctrl + v) 해보면 다음과 같은 정보가 나옵니다.

/html/body/table[1]/tbody/tr[3]/td[1]/span 

앞에서부터 html -> body -> table -> tr -> td -> span으로 찾아가라는 것입니다.

 

XPath 상의 tbody는 실제 코드상에 있는 것이 아니라 여기에서부터 테이블이 시작된다고 표시하는 것이기 때문에 tbody는 제외해야 합니다.

from urllib.request import urlopen
from bs4 import BeautifulSoup

naver_index = 'https://finance.naver.com/item/sise_day.nhn?code=005930'
source = urlopen(naver_index).read()
source = BeautifulSoup(source, 'lxml')
span = source.find_all('table')[0].find_all('tr')[2].find_all('td')[0].find('span')
print(span)

결과로 <span class="tah p10 gray03">2020.12.04</span> 가 나옵니다.

 

여기서 span.text를 print하면 2020.12.04 값만 추출되는 걸 볼 수 있습니다.

 

웹페이지에서 크롤링하여 원하는 데이터를 추출하는 방법에 대해 알아보았습니다.

 

728x90
반응형
728x90
반응형

아나콘다에서 pandas를 설치 후 파이썬을 실행하면 No module named 'numpy.core._multiarray_umath' 라고 에러가 발생하는 경우가 있습니다.

위 메시지는 파이썬 버전보다 numpy 버전이 상위 버전이라서 오류가 발생하는 것입니다. 

현재(2020년12월1일) 아나콘다에서 파이썬 3.7 버전을 설치 후 pandas를 설치하면 문제가 생깁니다.

아나콘다에서 파이썬 3.7 버전을 설치하면 pandas를 따로 설치해줘야 하는데 python 3.8 이상에서는 기본으로 함께 설치됩니다. 

아나콘다에서 pandas를 사용하고자 한다면 파이썬 3.8 이상을 설치하시기 바랍니다.

728x90
반응형

+ Recent posts