1. 경쟁 참여 URL

https://www.kaggle.com/c/competitive-data-science-predict-future-sales/data

 

Predict Future Sales

Final project for "How to win a data science competition" Coursera course

www.kaggle.com

 

2. 과제 참고 GITHUB

https://github.com/legolas140/competitive-data-science-1

 

 

 

 

 

Additional Materials and Links

Week 1

Recap of main ML algorithms

Overview of methods

Additional Tools

Software/Hardware requirements

StandCloud Computing:

AWS spot option:

Stack and packages:

Feature preprocessing and generation with respect to models

Feature preprocessing

Feature generation

Feature extraction from text and images

Feature extraction from text

Bag of words

Word2vec

NLP Libraries

Feature extraction from images

Pretrained models

Finetuning

Week 2

Exploratory data analysis

Visualization tools

Others

Validation

Data leakages

Week 3

Metrics optimization

Classification

Ranking

Clustering

Week 4

Hyperparameter tuning

Tips and tricks

Advanced features II

Matrix Factorization:

t-SNE:

Interactions:

Ensembling

Week 5

Competitions go through

You can often find a solution of the competition you're interested on its forum. Here we put links to collections of such solutions that will prove useful to you.

Past solutions

1. RANDOM FOREST

https://www.datasciencecentral.com/profiles/blogs/random-forests-explained-intuitively

 

2. GRADIENT BOOSTING

http://arogozhnikov.github.io/2016/06/24/gradient_boosting_explained.html

 

3. KNN

https://www.analyticsvidhya.com/blog/2018/03/introduction-k-neighbours-algorithm-clustering/

 



3월달부터 시작해서 6월까지 달리다가 취직준비로 몇달을 쉬고 다시 시작하게 된 알고리즘 트레이딩.

여러개의 기계학습 알고리즘을 사용해봤지만.. 아무래도 내 스타일에 맞는 학습방법은 1개뿐이였음....

강화 학습도 은근 매력 있었지만 예측의 Y를 아무리 생각해도 모델링 할 수 없어 포기하고 말았음 ㅠ


오늘부터 서비스 시작해서 달마다의 추이를 보고 알고리즘을 개선할 예정임... 그렇다고 딱히 알고리즘의

문제라기 보다는 데이터 전처리의 문제(?) 또는 개선 방향이 우선시 되어야 하겠지만 ㅎㅎㅎ..

차트 모델링 부터 여러 방면으로 생각해보고 결정계수와 상관계수를 건드려도 늦지 않는다는 생각이 든다..


서버(?) 컴퓨터로는 액정이 부서져서 반쪽만 보이는 노트북으로 절전모드 off 해놓은 상태로 작업스케쥴러로

24시간 * 30일 돌릴 예정 ㅎㅎ.. 이미 수명이 다 한 노트북이여서 그 정도는 돌려도 가혹하지 않다고 봄.. 

다만! 그 노트북의 1)발열 2) 보관장소(전원공급) 을 해결할 수 있는 환경을 찾아야 하는게 급선무!

자동 매매 기록


자동 매매를 하다보면 내가 투자한 종목, 손익, 손절, 수익률, 수익금의 현황을 한눈에 볼 수 있도록 하는 GUI 환경이 필요하다는 것을 요즘 많이 깨닫고 있습니다. 알고리즘을 테스트한 방법으로 피드백을 해야 하기 때문이죠.



필요한 TR 호출


<OPT10074>


<OPT10085>


<OPW00007>


<OPW00009>


알고리즘을 테스트하여 종목을 사고 팔다보면 증권계좌에 기록이 남습니다. 남은 기록을 호출하여 이쁘게 만드는 과정을 거쳐 합니다. 그 과정에서 증권사 마다 TR을 제공해주는데, 키움증권에는 위와 같은 TR이 있네요. 중복되는 데이터도 있기 때문에 위 4개의 TR을 적절히 사용하여 GUI를 만들어 알고리즘을 피드백 해야 겠습니다.


GUI 예시


알고리즘마다 1달의 테스트기간을 거쳐 실투자로 넘어가는게 좋다고 생각듭니다. 위 사진과 같이 매매 일자에 대한 계좌 데이터를 하루하루 자동으로 기록하여 피드백 하는것이죠. 



급등주 따라잡기


전날 급등했던 종목을 다음날 추격 매수 하는 기법입니다. 데이트레이딩에서 등락율에 대한 상관 관계 분석을 좀 더 용이하게 하긴 위한 지표로 급등, 상한가 종목들을 비교 지표로 선정하여 다음날 오를 종목을 미리 예측하는 방법입니다.




비교 지표


3W 방법에 의하여 서술하고자 합니다. 

1. 급등을 기록했던 시간이 언제인가?(When)

2. 급등을 이뤘던 등락율의 퍼센트는 어디인가?(Where)

3. 어떤 이유로 급등하였는가?(Why)


When.

급등을 기록했던 시간이 '장 초반'일수록 강한 상승세를 보입니다.


Where.

저의 경우 시가와 종가가 + 일 경우, 장 초반(11시 이전) +10%이상 종목에 대해서만 강한 상승세로 판단합니다.


Why.

When과 Where이 모두 충족되었다면 이 종목이 어떤 이유로 급등했는지 알아야 할 필요가 있습니다. 세력, 테마, 재료 등등...


Why, LDA


위 과정은 모두 '당일' 데이터를 갖고 '다음날'데이터를 예측하는 것입니다. 예측 이란것이 쉽진 않지만.. 인터넷상의 돌아다니는 데이터들을 갖고 예측을 해봅니다. 위의 설명했던 Why에 대한 내용중 저는 LDA을 설명하고 싶습니다. 종목에 대한 뉴스, 찌라시들을 크롤링 한 후, LDA을 이용하여 호재, 악재를 구분하는 것입니다. 아직 적용해보진 않았지만 굉장히 매력있는 방법이라고 생각듭니다.


거래량 상위 100개 종목

 

1. 오버나잇 하지 않아야 된다.

2. 빠르게 사고 팔아야 된다.

3. 하루안에 승패가 결정된다 .

위와 같은 이유로 데이트레이딩에 대한 종목선정 기준에 대해서는 '회전율'을 가장 중요한 지표로 생각해야 합니다. 그러므로 거래량 상위 100개 종목에 대해서 조건검색식을 이용하여 당일 매수할 종목을 선정합니다.


차트 데이터 선정


주가,시가,고가,거래량,등락율,5평,20평 등등의 데이터를 API에서 받아옵니다.

원하는 데이터를 Data frame에 저장합니다. 파이썬 패키지중 Pandas를 사용하여 데이터를 분석합니다.

어떤것을 저장하느냐에 따라 최종 종목 선정에 영향을 끼치게 됩니다.



데이터 분석


<Correlation graph>

<Heat map>


heat map, correlation graph 등 데이터를 활용할 방법 적용합니다. 위 그래프는 거래량, 등락율에 대한 Data frame을 만들고 각 column data가 얼마나 correlation의 상태에 있는지 확인할 수 있는 도구 입니다. 거래량과 등락율을 normalize하여 (0~1 사이 값으로 정규화) 각각을 비교 plot 합니다. 


최근 2주간의 거래량 상위 100개 종목에 대한 데이터를 모아본 결과로

1. 거래량은 D,D1,D2... 시간에 대한 서로의 연관성이(0.5 이상) 어느정도 있었다.

2. 거래량과 등락율은 서로 연관성이 없다.

3. 등락율은 시간에 대한 서로의 연관성이 없다.

위와 같이 생각할 수 있습니다. 따라서 거래량과 등락율을 주요 topic으로 생각하는 데이트레이딩의 경우에 거래량 상위 종목이 다음날의 거래량에도 영향을 미치므로 '거래량'에 대한 topic은 해결했다고 생각하고 등락율과 직접적으로 연관성있는 Data frame을 만들어 비교분석하는 과정을 거쳐야 합니다. 



API사용


각 증권사 마다 자동매매를 할 수 있게 API를 제공해준다. 

API를 이용하여 주식의 이동평균선, 일봉, 월봉 차트등 수많은 데이터를 받아 볼 수 있게 코딩한다



크롤링


증권사에서 제공해주는 데이터 뿐만 아니라 크롤링을 이용하여 웹에서의 정보를 끌고 오도록 한다.

크롤링은 api 데이터를 쓸것이냐, 웹에 있는 데이터를 쓸것이냐에 따라 작업 방법이 달라진다.



데이터 처리


위 1), 2) 항목을 수행할 능력이 있을 경우 3)으로 넘어온다.

수많은 데이터를 처리하기 위한 방법이 필요하다.

하루하루 갱신되는 데이터( 나의 경우 하루 1300개 셀이 누적된다)들의 경향을 파악하기 위한 라이브러리가 필요한데, R이든 python이든 어느것을 사용해도 무방하다. 다만 '잘' 알고 쓰는것이 돈을 버는 데에 조금 더 도움이 될수있을것이라고 생각된다.



자동화 환경


자동화 환경 구축이 정말 까다롭다. window환경에서 이것저것 설정해줘야 하는데 자동 로그인과 작업 스케쥴러 사용법 숙지하고 정상작동 시키는데에도 꽤 오랜 시간이 걸린다. A컴퓨터에서는 됐다가 B에서는 안되는 상황도 많이 겪었기 때문에 문제가 발생할때마다 ppt 매뉴얼로 정리하여 디버깅에 용이하도록 하는것이 중요하다.



매매 환경


데이,스윙,HTF,존버 등등 어떤 알고리즘을 선택할것이냐에 따라 매우 다른 매매 환경이 구축된다.

지금은 데이트레이딩을 접목시키는 환경에서 TCP/IP로 데이터를 송수신하는 방법을 사용중이다.

그러나 주식 시장에따라 알고리즘이 바뀔수있고, 매매 방법에 따라 바뀔수있으므로 여러가지 경험을 쌓는게 중요한것같다.



GUI 환경


이 부분이 가장 골치아픈 부분이라고 생각된다. 알고리즘을 GUI환경에서 쉽게 수정했으면 좋겠다는 생각이 요즘 부쩍 늘고있다. 왜냐하면, 코드에서 일일이 parameter를 modify하는것이 매우 귀찮고 에너지를 많이 소비하는 작업이기 때문이다.






과제를 위해 기상청 홈페이지 크롤링을 하였다.


cmd -> activate py27 -> scrapy shell http://www.kma.go.kr/weather/climate/past_table.jsp?stn=108&yy=2016&x=28&y=1&obs=07 을 실행한 결과이다.

이전글과 같이 정적 웹페이지에서 크롤링을 구현하려 했으나 자꾸 이상한 데이터가 나와서 원인을 분석하고 솔루션을 내었다.


문제) 특정 페이지를 scrapy shell url로 했을 경우 scrapy 환경에서 reponse가 http://www.kma.go.kr/weather/climate/past_table.jsp?stn=108로 실행된다.

그 말은, 기상청 데이터(연도별 기온)를 얻고자 할때는 특정 url을 넣어줘야 한다.


솔루션) 정적 웹페이지에서 데이터를 얻지 못하므로 selenium -> chromedriver 를 사용하여 크롬을 띄우고 특정 url을 불러온뒤 그 페이지에 있는 xpath을 추출하여 response하는 방법을 사용한다.



<2017년도 기상청 데이터>



<2016년도 기상청 데이터>


원하고자하는 data는 2016이지만 selenium을 쓰지않는 크롤링으로는 2017년 데이터만 크롤링 된다.


1. kma_spider.py


#-*- coding: utf-8 -*-

#activate py27 -> cd kma_crawler -> scrapy crawl kma -o pl.csv

#1.item.py에서 필드 설정

#2.rt_spider.py에서 코드 입력

#3.pipeline.py에서 코드 입력

#4.setting.py에서 코드 설정


#scrapy 라이브러리

import scrapy

import time

from selenium import webdriver

from kma_crawler.items import kmaItem

from scrapy.selector import Selector


class kmaSpider(scrapy.Spider):

    name = "kma" # scrapy crawl 실행 이름

    allowed_domains = ["kma.go.kr"] # 허용된 도메인

    start_urls = ["http://www.kma.go.kr/weather/climate/past_table.jsp?stn=108&yy=2016&x=18&y=15&obs=07"] # 정보 검색하려는 페이지



    def __init__(self):

        scrapy.Spider.__init__(self)

        self.browser = webdriver.Chrome("/users/32goqudeo/chromedriver") # chromedriver가 있는 폴더에서 크롬을 실행.

  

    def parse(self, response):

        self.browser.get('http://www.kma.go.kr/weather/climate/past_table.jsp?stn=108&yy=2016&x=18&y=15&obs=07') # xpath를 얻고자하는url실행

        #time.sleep(3)

        html = self.browser.find_element_by_xpath('//*').get_attribute('outerHTML') #크롬드라이버에 띄어져있는 xpath 소스들을 가져온다

        selector = Selector(text=html) # selector는 parse함수에서 사용할 response변수와 속성이 동일하다.

        rows = selector.xpath('//*[@id="content_weather"]/table/tbody/tr') # 얻고자 하는 행의 xpath를 등록 (반복되는 tr값에 유의하여 추출할것)

        time.sleep(2)


        for row in rows :

            #for td in rowsc

            item = kmaItem()

            item["day"] = row.xpath('./td[1]/text()')[0].extract().strip().encode('euc-kr')#.strip() 은 공백을 무시해서 크롤링해줌

            item["one_month"] = row.xpath('./td[2]/text()')[0].extract().strip()

            item["two_month"] = row.xpath('./td[3]/text()')[0].extract().strip()

            item["three_month"] = row.xpath('./td[4]/text()')[0].extract().strip()

            item["four_month"] = row.xpath('./td[5]/text()')[0].extract().strip()

            item["five_month"] = row.xpath('./td[6]/text()')[0].extract().strip() 

            item["six_month"] = row.xpath('./td[7]/text()')[0].extract().strip()

            item["seven_month"] = row.xpath('./td[8]/text()')[0].extract().strip()

            item["eight_month"] = row.xpath('./td[9]/text()')[0].extract().strip() 

            item["nine_month"] = row.xpath('./td[10]/text()')[0].extract().strip()

            item["ten_month"] = row.xpath('./td[11]/text()')[0].extract().strip()

            item["eleven_month"] = row.xpath('./td[12]/text()')[0].extract().strip()

            item["twelve_month"] = row.xpath('./td[13]/text()')[0].extract().strip()

            yield item #아이템 반출


2. pipeline.py


#-*- coding: utf-8 -*-


# Define your item pipelines here

#

# Don't forget to add your pipeline to the ITEM_PIPELINES setting

# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


import csv # 저장하고자 하는 파일의 형태를 import


class kmaPipeline(object):


    def __init__(self):

        self.csvwriter = csv.writer(open("kma.csv", "wb"))# kma.csv 파일에 등록한다. "w"일 경우 줄띄움실행. "wb"일 경우 줄띄움없이 실행

        self.csvwriter.writerow(["day", 

                                 "1month", 

                                 "2month", 

                                 "3month", 

                                 "4month", 

                                 "5month", 

                                 "6month", 

                                 "7month",

                                 "8month",

                                 "9month",

                                 "10month",

                                 "11month",

                                 "12month",

                                 ]) #엑셀에 직접적으로 쓰여지는 내용


    def process_item(self, item, spider):

        row = []

        #row.append(item["day"]) 

        row.append(item["one_month"])

        row.append(item["two_month"])

        row.append(item["three_month"])

        row.append(item["four_month"])

        row.append(item["five_month"])

        row.append(item["six_month"])

        row.append(item["seven_month"])

        row.append(item["eight_month"])

        row.append(item["nine_month"])

        row.append(item["ten_month"])

        row.append(item["eleven_month"])

        row.append(item["twelve_month"])

        self.csvwriter.writerow(row)

        return item


3. setting.py


ITEM_PIPELINES = {

   'kma_crawler.pipelines.kmaPipeline': 400,

} #Item_pipeline 활성화.  맨뒤에 .kmaPipeline은 pipeline.py에서의 함수와 이름이 동일해야함


4. item


#-*- coding: utf-8 -*-


# Define here the models for your scraped items

#

# See documentation in:

# http://doc.scrapy.org/en/latest/topics/items.html


import scrapy


class kmaItem(scrapy.Item) :

    #day = scrapy.Field()

    one_month = scrapy.Field()

    two_month = scrapy.Field()

    three_month = scrapy.Field()

    four_month = scrapy.Field()

    five_month = scrapy.Field()

    six_month = scrapy.Field()

    seven_month = scrapy.Field()

    eight_month = scrapy.Field()

    nine_month = scrapy.Field()

    ten_month = scrapy.Field()

    eleven_month = scrapy.Field()

    twelve_month = scrapy.Field()


* 실행 방법


cmd ->activate py27 -> cd kma_crawler -> scrapy crawl kma -> 해당 폴더에 kma.csv 파일 생성. 기상청 데이터값 크롤링



구동환경

1) python 3.6

2) Miniconda3

3) jupyter notebook

4) scrapy


위 그림 설명

1) cmd로 들어가서 activate py27 입력

2) scrapy startproject movie_crawler 입력 (path가 된 폴더에 movie_crawler 폴더가 생성, scrapy 준비 완료)






url 화면.


https://www.rottentomatoes.com/top/bestofrt/?year=2017 <- 스크랩이 될 url





2017년에 개봉한 영화중 순위가 높은 순서대로 스크랩 후 액셀 저장.



작업 순서

1) rt_crawler 폴더안에 rt_spider라는 .py 파일을 만들어서 아래와 같이 입력한다.


#-*- coding: utf-8 -*-

#activate py27 -> cd rt_crawler -> scrapy crawl RottenTomatoes

#1.item.py에서 필드 설정

#2.rt_spider.py에서 코드 입력

#3.pipeline.py에서 코드 입력

#4.setting.py에서 코드 설정


#scrapy 라이브러리

import scrapy

from rt_crawler.items import RTItem


class RTSpider(scrapy.Spider):

    name = "RottenTomatoes" # scrapy crawl 실행 이름

    allowed_domains = ["rottentomatoes.com"] # 허용된 도메인

    start_urls = ["https://www.rottentomatoes.com/top/bestofrt/?year=2017"] # 정보 검색하려는 페이지


#xpath값 삽입.

    def parse(self, response):

        for tr in response.xpath('//*[@id="top_movies_main"]/div/table/tr'): # 정보 검색하려는 페이지의 영화 제목

            href = tr.xpath('./td[3]/a/@href') # href는 속성값

            url = response.urljoin(href[0].extract()) # 허용된 도메인에 서브 URL붙이기

            yield scrapy.Request(url, callback=self.parse_page_contents) # 서브 URL 붙인 최종 URL 반출, 최종URL에서 불러들일 정보 반출


    def parse_page_contents(self, response): #parse_page_contents 함수 작성

        item = RTItem()

        item["title"] = response.xpath('//*[@id="movie-title"]/text()')[0].extract().strip() #타이틀 스크랩

        item["score"] = response.xpath('//*[@id="tomato_meter_link"]/span[2]/span/text()')[0].extract() #평점 스크랩

        item["genres"] = response.xpath('//*[@id="mainColumn"]/section[3]/div/div/ul/li[2]/div[2]/a[1]/text()')[0].extract().strip()    #장르 스크랩

        item["runtime"] = response.xpath('//*[@id="mainColumn"]/section[3]/div/div/ul/li[8]/div[2]/time/text()')[0].extract().strip() #런타임 스크랩

        consensus_list = response.xpath('//*[@id="all-critics-numbers"]/div/div[2]/p//text()').extract()[2:] #설명 스크랩

        item["consensus"] = ' '.join(consensus_list).strip()

        yield item #아이템 반출


2) rt_crawler 폴더에 만들어져있는 item.py에 들어가서 아래와 같이 입력한다.


import scrapy


class RTItem(scrapy.Item) :

    title = scrapy.Field()

    score = scrapy.Field()

    genres = scrapy.Field()

    runtime = scrapy.Field()

    consensus = scrapy.Field()


3)  rt_crawler 폴더에 만들어져있는 pipeline.py에 들어가서 아래와 같이 입력한다.


import csv 


class RTPipeline(object):


    def __init__(self):

        self.csvwriter = csv.writer(open("rt_movies_new.csv", "w"))

        self.csvwriter.writerow(["title", "score", "genres", "runtime", "consensus"])


    def process_item(self, item, spider):

        row = []

        row.append(item["title"])

        row.append(item["score"])

        row.append('|'.join(item["genres"]))

        row.append(item["runtime"])

        row.append(item["consensus"])

        self.csvwriter.writerow(row)

        return item

        


4) rt_crawler 폴더에 만들어져있는 setting.py에 들어가서 코드를 아래와 같이 수정한다.


ITEM_PIPELINES = {

    'rt_crawler.pipelines.RTPipeline': 400,

}


5) cmd창에서 scrapy crawl RottenTomatoes 입력.

6) 엑셀에 스크랩하려는 정보를 저장시킨다.



url을 반복문으로 반출하기

<rt_crawler.py>


    def parse(self, response):

        for tr in response.xpath('//*[@id="top_movies_main"]/div/table/tr'): # 정보 검색하려는 페이지의 영화 제목

            href = tr.xpath('./td[3]/a/@href') # href는 속성값

            url = response.urljoin(href[0].extract()) # 허용된 도메인에 서브 URL붙이기

            yield scrapy.Request(url, callback=self.parse_page_contents) # 서브 URL 붙인 최종 URL 반출, 최종URL에서 불러들일 정보 반출



activate py27 -> scrapy startproject rt_crawler -> scrapy shell ('url1')의 환경에서  (url1 : 스크랩할 페이지)

reponse.xpath('xpath')을 실행시킨다.  


<괄호 안에 들어갈 xpath 예시>




개발자도구 (컨트롤+쉬프트+i) -> 엘리먼트 선택(컨트롤+쉬프트+c)

영화 Get out에 마우스 커서를 갖다대면 사진의 오른쪽과 같이 (a herf ~) 파란색 박스가 뜨게 된다.






해당 박스에 오른쪽 마우스를 누르면 Copy Xpath가 뜨게 된다.

클릭하여 실행창에 붙여넣으면 //*[@id="top_movies_main"]/div/table/tbody/tr[1]/td[3]/a 와 같은 문장이 나오게 된다.

이 문장을 위에 설명한 환경에서 reponse.xpath('//*[@id="top_movies_main"]/div/table/tbody/tr[1]/td[3]/a') 이런 식으로 넣게되면 

copy xpath에 해당하는 element가 무엇인지 출력하게 된다.



위 그림은 //*[@id="top_movies_main"]/div/table/tbody/tr[1]/td[3]/a 를 조금씩 수정하면서 출력값을 얻어낸 화면이다.


최종적으로 맨밑에줄에 

response.xpath('//*[@id="top_movies_main"]/div/table/tr[1]/td[3]/a/@href')[0].extract 을 실행하면 get out이라는 엘리먼트가 출력된다.

(href는 엘리먼트의 속성값)


get out이외의 다른 엘리먼트의 xpath를 복사하면 tr[1], tr[2], tr[3],.. 이런식으로 1위 ~ n위까지 path가 생성된다.

따라서 아래의 코드를 입력하여 반복적으로 url을 스크랩해온다.


 for tr in response.xpath('//*[@id="top_movies_main"]/div/table/tr'): # 정보 검색하려는 페이지의 영화 제목

            href = tr.xpath('./td[3]/a/@href') # href는 속성값

            url = response.urljoin(href[0].extract()) # 허용된 도메인에 서브 URL붙이기

            yield scrapy.Request(url, callback=self.parse_page_contents) # 서브 URL 붙인 최종 URL 반출, 최종URL에서 불러들일 정보 반출


정리해서 위의 코드를 해석하면,

xpath를 불러옴 -> href로 속성값을 따옴 -> 허용된 도메인에 href가 포함된 url 붙이기 -> 최종 url 반출.



contents를 xpath로 불어들이기


평점, 줄거리에 대한 엘리먼트값 확인

    

def parse_page_contents(self, response): #parse_page_contents 함수 작성

        item = RTItem()

        item["title"] = response.xpath('//*[@id="movie-title"]/text()')[0].extract().strip() #타이틀 스크랩

        item["score"] = response.xpath('//*[@id="tomato_meter_link"]/span[2]/span/text()')[0].extract() #평점 스크랩

        item["genres"] = response.xpath('//*[@id="mainColumn"]/section[3]/div/div/ul/li[2]/div[2]/a[1]/text()')[0].extract().strip()    #장르 스크랩

        item["runtime"] = response.xpath('//*[@id="mainColumn"]/section[3]/div/div/ul/li[8]/div[2]/time/text()')[0].extract().strip() #런타임 스크랩

        consensus_list = response.xpath('//*[@id="all-critics-numbers"]/div/div[2]/p//text()').extract()[2:] #설명 스크랩

        item["consensus"] = ' '.join(consensus_list).strip()

        yield item #아이템 반출


위 코드는 url에서 했던 내용과 일치한다.

각 아이템의 제목을 명시하고 response.xpath('')로 엘리먼트를 불러들인다.

+ xpath복사 후 /text() 추가 : 글자만 스크랩한다.

+ .strip()을 추가하여 해당 내용 외의 불필요한 소스들 제거




pipeline.py을 이용하여 엑셀에 저장하기

import csv 


class RTPipeline(object):


    def __init__(self):

        self.csvwriter = csv.writer(open("rt_movies_new.csv", "w"))

        self.csvwriter.writerow(["title", "score", "genres", "runtime", "consensus"])


    def process_item(self, item, spider):

        row = []

        row.append(item["title"])

        row.append(item["score"])

        row.append(item["genres"])

        row.append(item["runtime"])

        row.append(item["consensus"])

        self.csvwriter.writerow(row)

        return item


item.py을 이용하여 변수 설정하기


import scrapy


class RTItem(scrapy.Item) :

    title = scrapy.Field()

    score = scrapy.Field()

    genres = scrapy.Field()

    runtime = scrapy.Field()

    consensus = scrapy.Field()


이 상태에서 실행창에 scrapy crawl RottenTomatoes를 입력하면 엑셀에 스크랩한 정보가 저장된다.

'코딩이것저것' 카테고리의 다른 글

키움증권 API를 이용한 자동매매  (0) 2018.04.18
동적 웹 페이지에서 데이터 추출하고 수집하기  (0) 2017.09.02
CNN_deep CNN mnist  (0) 2017.08.07
CNN_drop out, ensemble  (0) 2017.08.06
CNN_weight initialization  (0) 2017.08.06

+ Recent posts