초보자가 스크래핑으로 비트코인 가격을 취득하여 CSV에 출력해 본다
인사말
안녕하세요, lucille이라고 합니다. 최근 정보계를 공부하고 싶어지고 파이썬을 독학하기 시작한 비정보계 학생입니다.
이 기사는 정보계를 공부하는 여대생 Advent Calendar 2017의 18일째 기사입니다. 꼭 다른 분들의 기사도 봐 주세요.
이 기사의 목적
python3을 사용하여 할 수있는 일이 많이있는 것 같습니다. 나는 '초보자라도 다루기 쉽고' '네트의 바다를 나누어 간편하게 정보를 모으는 즐거움'을 실감하기 위해 스크래핑(웹사이트를 방문해 일부를 선택적으로 꺼내기)에 트라이 보기로 했습니다.
구체적으로는 python3을 사용하여 하나의 웹 사이트를 스크래핑하고 (이번에는 비트 코인 시세 요약 사이트), 그 내용 (비트 코인 시세 당 매매 가격)을 목록으로 CSV에 출력하는 코드를 쓰는 것이 본 기사의 목적입니다.
스크래핑과 크롤링은 재미 있지만 윤리적 문제를 일으킬 수 있으므로 조심하십시오. 조심하자. 오카자키 시립 중앙 도서관 사건
내 환경과 준비한 것
python3을 사용하여 할 수있는 일이 많이있는 것 같습니다. 나는 '초보자라도 다루기 쉽고' '네트의 바다를 나누어 간편하게 정보를 모으는 즐거움'을 실감하기 위해 스크래핑(웹사이트를 방문해 일부를 선택적으로 꺼내기)에 트라이 보기로 했습니다.
구체적으로는 python3을 사용하여 하나의 웹 사이트를 스크래핑하고 (이번에는 비트 코인 시세 요약 사이트), 그 내용 (비트 코인 시세 당 매매 가격)을 목록으로 CSV에 출력하는 코드를 쓰는 것이 본 기사의 목적입니다.
스크래핑과 크롤링은 재미 있지만 윤리적 문제를 일으킬 수 있으므로 조심하십시오. 조심하자. 오카자키 시립 중앙 도서관 사건
내 환경과 준비한 것
덧붙여서 나는 python의 가상 환경을 만들고 거기서 처리하고 있었기 때문에 약간 lxml의 인스톨이 번잡합니다. 방법은 다음과 같습니다 (참고 서적에서 인용).
$brew install libxml2 libxslt #OS X の場合
$sudo apt-get install -y libxml2-dev libxslt-dev libpython3-dev zlib1g-dev #Ubuntu の場合
이것을 실행 한 후 pip install lxml입니다.
참고로 한 것
「시간 간격을 설정해 두고, 시간이 되면 사이트로부터 정보를 취해, 스크래핑 해, 출력한다」라고 하는 기본적인 생각을 빌리고 있습니다.
해설
이번 스크래핑 하는 사이트 Bitcoin 시세 in 대한민국 가운데 페이지 상단의 '시세 데이터' 표에 있는 6개의 거래소의 매판과 매판을 각각 취득한다.
구조
어쨌든, "스크래핑""소정 시간에 파일에 쓰기"의 두 가지 동작을합니다. 단지 전자는 아래와 같은 하부 구조를 가지고 있습니다.
(1) 원하는 줄을 여러 문장 추출
(2) (1)의 1행에 대해 복수열 추출한다
적당히 코드내에 코멘트 써 두었으므로 봐 주세요.
코드
bitcoin.py# coding: UTF-8
import lxml.html
from datetime import datetime
import csv
import time
INTERVAL = 60 * 2 #待機時間の長さ設定。
#抜き出した行から複数列を抜き出す
def get_item(tr):
exchange = None
if len(tr[0]) > 0:
exchange = tr[0][0].text
else:
return None
return (exchange, tr[1].text, tr[2].text)
#ウェブサイトから複数行を抜き出す
def do_snapshot(url, format):
snapshot = list()
retult = None
parse_html = lxml.html.parse(url)
tr_array = parse_html.xpath(format)
for tr in tr_array:
retult = get_item(tr)
if retult:
snapshot.append(retult)
return snapshot
#取得したデータからリスト作成
def flush_handle(writer):
# 相場データ(0:取引所 1:買板 2:売板)
result = do_snapshot('http://xn--eck3a9bu7cul981xhp9b.com/',
'//div[@class="panel panel-info"]//table[@class="table table-bordered"]//tbody//tr')
# ページ下部の方の24時間の取引高(0:取引所 1:BTC 2:円換算)を取得する場合
# do_snapshot('http://xn--eck3a9bu7cul981xhp9b.com/','//div[@class="panel panel-warning"]//table[@class="table table-bordered"]//tbody//tr')
time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
for item in result:
# item[0] は「取引所」の名前です。
writer.writerow([time_, item[1], item[2]])
print('APPEND:' + time_)
def do_idle():
# You can do something
pass
#時間間隔を守りながらファイル書き込み操作
def main():
#bitcoin.csvというファイルを作り、開く。第2引数のaは追記モード。
with open('bitcoin.csv', 'a') as f:
#自動改行の設定
writer = csv.writer(f, lineterminator='\n')
#1行目に書き込む
writer.writerow(['時間', '売値', '買値'])
try:
check = 0
# 永久に実行させます
while True:
now = time.time()
#待機時間を超えた際
if now - check > INTERVAL:
flush_handle(writer)
writer.writerow(['___', '___', '___']) # 削除できます(テスト用)
f.flush()
check = time.time()
#待機時間
else:
do_idle()
#処理が中止された際の動作
except KeyboardInterrupt:
print('KeyboardInterrupt')
# Program entry
if __name__ == '__main__':
main()
결론
초보자라고 말하면서 긴 코드는 친구의 도움 때문입니다. 코드를 상당히 고쳐준 친구에게 감사감 강우가 됩니다.
여러분, 좋은 파이썬 생명을!
Reference
이 문제에 관하여(초보자가 스크래핑으로 비트코인 가격을 취득하여 CSV에 출력해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/lucille/items/a81753b06a2513eda97a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
bitcoin.py
# coding: UTF-8
import lxml.html
from datetime import datetime
import csv
import time
INTERVAL = 60 * 2 #待機時間の長さ設定。
#抜き出した行から複数列を抜き出す
def get_item(tr):
exchange = None
if len(tr[0]) > 0:
exchange = tr[0][0].text
else:
return None
return (exchange, tr[1].text, tr[2].text)
#ウェブサイトから複数行を抜き出す
def do_snapshot(url, format):
snapshot = list()
retult = None
parse_html = lxml.html.parse(url)
tr_array = parse_html.xpath(format)
for tr in tr_array:
retult = get_item(tr)
if retult:
snapshot.append(retult)
return snapshot
#取得したデータからリスト作成
def flush_handle(writer):
# 相場データ(0:取引所 1:買板 2:売板)
result = do_snapshot('http://xn--eck3a9bu7cul981xhp9b.com/',
'//div[@class="panel panel-info"]//table[@class="table table-bordered"]//tbody//tr')
# ページ下部の方の24時間の取引高(0:取引所 1:BTC 2:円換算)を取得する場合
# do_snapshot('http://xn--eck3a9bu7cul981xhp9b.com/','//div[@class="panel panel-warning"]//table[@class="table table-bordered"]//tbody//tr')
time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
for item in result:
# item[0] は「取引所」の名前です。
writer.writerow([time_, item[1], item[2]])
print('APPEND:' + time_)
def do_idle():
# You can do something
pass
#時間間隔を守りながらファイル書き込み操作
def main():
#bitcoin.csvというファイルを作り、開く。第2引数のaは追記モード。
with open('bitcoin.csv', 'a') as f:
#自動改行の設定
writer = csv.writer(f, lineterminator='\n')
#1行目に書き込む
writer.writerow(['時間', '売値', '買値'])
try:
check = 0
# 永久に実行させます
while True:
now = time.time()
#待機時間を超えた際
if now - check > INTERVAL:
flush_handle(writer)
writer.writerow(['___', '___', '___']) # 削除できます(テスト用)
f.flush()
check = time.time()
#待機時間
else:
do_idle()
#処理が中止された際の動作
except KeyboardInterrupt:
print('KeyboardInterrupt')
# Program entry
if __name__ == '__main__':
main()
결론
초보자라고 말하면서 긴 코드는 친구의 도움 때문입니다. 코드를 상당히 고쳐준 친구에게 감사감 강우가 됩니다.
여러분, 좋은 파이썬 생명을!
Reference
이 문제에 관하여(초보자가 스크래핑으로 비트코인 가격을 취득하여 CSV에 출력해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/lucille/items/a81753b06a2513eda97a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(초보자가 스크래핑으로 비트코인 가격을 취득하여 CSV에 출력해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lucille/items/a81753b06a2513eda97a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)