초보자가 스크래핑으로 비트코인 ​​가격을 취득하여 CSV에 출력해 본다

인사말



안녕하세요, lucille이라고 합니다. 최근 정보계를 공부하고 싶어지고 파이썬을 독학하기 시작한 비정보계 학생입니다.
 이 기사는 정보계를 공부하는 여대생 Advent Calendar 2017의 18일째 기사입니다. 꼭 다른 분들의 기사도 봐 주세요.

이 기사의 목적



python3을 사용하여 할 수있는 일이 많이있는 것 같습니다. 나는 '초보자라도 다루기 쉽고' '네트의 바다를 나누어 간편하게 정보를 모으는 즐거움'을 실감하기 위해 스크래핑(웹사이트를 방문해 일부를 선택적으로 꺼내기)에 트라이 보기로 했습니다.

구체적으로는 python3을 사용하여 하나의 웹 사이트를 스크래핑하고 (이번에는 비트 코인 시세 요약 사이트), 그 내용 (비트 코인 시세 당 매매 가격)을 목록으로 CSV에 출력하는 코드를 쓰는 것이 본 기사의 목적입니다.

스크래핑과 크롤링은 재미 있지만 윤리적 문제를 일으킬 수 있으므로 조심하십시오. 조심하자. 오카자키 시립 중앙 도서관 사건

내 환경과 준비한 것


  • bash on ubuntu on windows 와 Atom
  • python3-5-2
  • xpath (웹 사이트의 스크래핑하고 싶은 요소를 지정하는 것)
  • lxml version4.1.1
    덧붙여서 나는 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()
    
    

    결론



    초보자라고 말하면서 긴 코드는 친구의 도움 때문입니다. 코드를 상당히 고쳐준 친구에게 감사감 강우가 됩니다.
    여러분, 좋은 파이썬 생명을!

    좋은 웹페이지 즐겨찾기