크롤링 도구를 선택할 때, 사용하기 편하고 기능을 많이 제공하는걸 사용하고 싶었다.
그러던 중, Scrapy에서 많은 기능을 제공한다고해서 사용해보기로 마음먹었다. 

# 아까 가상환경을 통해 만든 환경으로 접속 
$ workon test

#프로젝트를 만들어준다. 
$ (test) root@447fe7338239:~/.virtualenvs/test# scrapy startproject tutorial

# 위와같이 프로젝트를 만들면, 자동으로 파일들이 생긴다. 좀더 편하게 개발할려면 pycharm같은 도구를 설치하는 것을 추천!

먼저 items.py 에 가져올 아이템을 정의한다.
여기선 title, link, desc을 가져오기로 정의
import scrapy

class DmozItem(scrapy.Item):
   title = scrapy.Field()
   link = scrapy.Field()
   desc = scrapy.Field()


이제 파싱을 해야되는데, 실제 크롤링하고 싶은 사이트와 비교하면서 하면 편하다.  ( 다들 아시겠지만 크롬에서 개발자 도구를 가면 해당 Elements들을 확인가능하다 ) 


위 Elements에 <div class= "title-and-desc”> 인 element을 긁어와서 title, link, desc에 파싱해줄거다.
위 Elements들과 아래 코드들을 비교하면, 금방 익숙해질것이다. 

이제 정보을 수집할 spider을 만들어 준다. spiders directory안에 아래와 같이 만들어주었다.
dmoz_spider.py
import scrapy
from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
   name = "dmoz"
   allowed_domains = ["dmoz.org"]
   start_urls = [
   ]

   def parse(self, response):
       for sel in response.xpath('//*[@class="title-and-desc"]'):
           title = sel.xpath('a/div[@class="site-title"]/text()').extract()
           link = sel.xpath('a/@href').extract()
           desc = sel.xpath('div[@class="site-descr "]/text()').extract()

           item = DmozItem()
           item['title'] = title
           item['link'] = link
           item['desc' = desc
           yield item

# yield는 generator다 아이템이 생성될때마다 리스트형태로 쌓이게 된다. 
( stack형태로 쌓이게 됌 ) 

실행
$ scrapy crawl dmoz


json형태로 저장
scrapy crawl dmoz -o items.json


이것으로 간단하게 크롤링을 해보았다. 
더 많은 정보는 공식사이트에 가면 자세히 나와 있다. scrapy는 필터 등 다양한 기능을 제공하니, 적은 비용으로 크롤링 서비스를 구축하고 싶으면 한번 시도해봤음한다.





'apps > crawling' 카테고리의 다른 글

scrapy를 통해 크롤링 해보기 - 설치  (0) 2018.09.13
scrapy설치 ( ubuntu에서 진행 ) 
python가상환경을 통해 만들어주었다. 
이런식으로 안 해도 되지만, 프로젝트별로 별도로 환경을 구축하면 라이브러리도 안 꼬이고 편하다.

# 먼저 앱 업데이트를 먼저 해준다.
$ apt-get update 
# gcc나 make등 개발하기 위한 기본 패키지
$ apt-get install build-essential

# python을 설치 하고, pip도 설치해준다.
$ apt-get install python
# 버전 확인
$ python -V
# python package관리를 위해 python-pip설치
$ apt-get install python-pip 

# 파이썬 가상환경 구축 ( 가상환경을 사용 안 해도 되지만, library가 꼬일 가능성이 있기에 가상환경을 구축하였다 ) 
#virtualenvwrapper :  virtualenv을 사용하기 쉽게 제공
$ pip install virtualenv virtualenvwrapper

# vim 이없어서 설치해줌 .. 
$ apt-get install vim

# 환경변수에 넣어준다.
$  vi .bashrc
# 맨 아래 두줄 추가
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

# 바로 적용 
$ source .bashrc

# test라는 가상환경 패키지생성
$ mkvirtualenv test

(test) root@447fe7338239:~#
나갈땐 
$ deactivate

들갈 땐 
$ workon test

# 설치되는 위치 
$  cd .virtualenvs/


########## scrapy설치
$ apt-get install libffi-dev libssl-dev
$ pip install Scrapy




'apps > crawling' 카테고리의 다른 글

scrapy을 사용하여 크롤링 - 실전  (0) 2018.09.13
ELK STACK이란 ?



Log 및 데이터 분석을 한다고 할 때, 가장 먼저 떠 오르는 도구는 ELK Stack이다.

ELK는 수집 기능을 하는 Logstash, 분석 및 저장 기능을 담당하는 ElasticSearch, 시각화 도구인 Kibana의 앞 글자만 따서 ELK Stack이라고 한다.
이런 조합이 많이 떠오르는 이유는 접근 용이성 때문이라고 생각한다. 

ELK vs Apache echo system으로 비교해보았을 때, ELK가 더 접근성이 좋다.
하지만 좀 더 깊게 들어가서, 큰 시스템을 구축한다고 가정한다면 Apache echo system이 좀 더 유리하다고 생각된다.

ELK을 공부하며 느낀 점은 맘만 먹으면 하루 만에 간단한 기능을 제공할 수 있을 정도로 쉽다는 점이다.

LogStash
먼저 Logstash에 대해 살펴보자 

Logstash는 수집기능을 제공한다고 했다. 아래 그림을 보면 좀 더 명확히 이해할 수 있다. 
다양한 입력형태의 데이터를 읽어, 데이터 필터 기능을 제공하고, 다른 저장소에 저장도 가능하다. 



예로서 logstash설정파일을 보자 
$ logstash-simple.conf

input {
  file {
   # csv 파일에서 받음
    path => "/home/Documents/sample.csv"
   # 파일에서 처음부터 받을라면 beginning (보통은 end가 default )
    start_position => “beginning"
   # 데이터 offset정보가 sincedb에 저장 
    sincedb_path => "/dev/null"
  }
}
#필터 ( csv에서 ,를 분리자로 사용 )
filter {
  csv {
      separator => ","
      columns => [“Test”,”data1”,"data2"]
  }
# float로 변환
  mutate {convert => [“data1", "float"]}
  mutate {convert => [“data2", "float"]}
}
output {
    elasticsearch {
        hosts => "localhost"
        index => “test"
    }
    stdout {}
$ cat sample.csv

Test,data1,data2
abc,100,200
Bcd,200,300
Jas,400,100
이러고 실행함 수집이 된다. ( 무척 쉽다 )
$  ./logstash -f logstash-simple.conf


ElasticSearch
이제 ElasticSearch에 대한 간단 예를 보여주겠다. 

ElasticSearch는 Rest API형식으로 기능을 제공하는데, 아래와 같이 document들을 index기반으로 저장을 하므로 검색 시 Relational DB보다 빠르다. 


Elastic Search와 Relational DB을 비교한 표다
Elastic Search
Relational DB
Index
DataBase
Type
Table
Document
Row
Field
Column
Mapping
Schema

Elastic Search
Relational DB
GET
Select
Put
Update
Post
Insert
Delete
Delete
ElasticSearch는 Rest기반으로 제공하기 때문에 아래와 같이 사용해야한다.
Elastic Search
Relational DB
curl -XGET localhost:9200/classes/class/1 
select * from class where id =1
curl -XPOST localhost:9200/classes/class/1 -d ‘{xxx}'
insert into class values {xxx}
curl -XPUT localhost:9200/classes/class/1 -d ‘{xxx}'
update class set xxx where id = 1
curl -XDELETE localhost:9200/classes/class/1
delete from class where id = 1
Logstash을 거치지 않고도 ElasticSearch에 데이터를 넣고, 조회가 가능하다.
하지만 지금은 ELK에 대해 이해하기 위함 이기에 이 과정은 생략하였다.


Kibana
키바나는 설치 후, 조회할 indexname을 저장하면 다양한 차트를 만들 수 있다.



다양한 형태로 데이터를 볼 수있다. 더 많은 기능은 kibana홈페이지 팜고



이렇게 지도로도 제공가능하다.



많은 오픈소스들을 사용하면서, 절대적으로 좋은 도구는 없다고 생각한다.
주어진 상황에 맞춰서 사용하면, 좀 더 개발하는데 비용을 아낄수 있을 것이다.











+ Recent posts