BOBO's Note

크롤링 (Crawling) 본문

etc

크롤링 (Crawling)

bobo_hee 2021. 8. 18. 13:53

크롤링(Crawling)

크롤링이란, 웹상에 존재하는 컨텐츠를 프로그래밍으로수집하는 작업이다. 

 

Scrapy

Scrapy는 Python 기반의 오픈소스 웹크롤링 프레임워크이다. 

 

Scrapy의 구성요소는 다음과 같다.

  • Engine: 모든 구성요소간 데이터 흐름 관리
  • Scheduler: 엔진으로부터 request를 받아 큐에 저장하고 이후 엔진에 다시 반환
  • Downloader: 웹 페이지 fetch해서 엔진을 거쳐 스파이더에 반환
  • Spider: response를 파싱해서 아이템을 추출
  • Item Pipeline: 스파이더에 의해 추출된 아이템 처리

Scrapy Data Flow

1. 스파이더로부터 엔진이 request를 받는다.

2. 엔진은 스케쥴러에 request를 등록하고 다음 request를 요청한다.

3. 스케쥴러는 엔진에게 request를 반환한다.

4. 엔진은 다운로더에 request를 보낸다.

5. 페이지가 다운로드되면 다운로더는 response를 생성해 엔진에 전송한다.

6. 엔진은 다운로더로부터 response를 받고, 그것을 스파이더에 전송한다.

7. 스파이더는 response를 처리하고 엔진에 스크랩된 아이템과 새 request를 반환한다.

8. 엔진은 처리된 아이템을 아이템 파이프라인에 전송하고, 처리된 request는 스케쥴러에 보내 다음 request를 요청한다.

8. 스케쥴러로부터 더이상 request가 없을 때까지 위의 과정을 반복한다.

 

출처: https://docs.scrapy.org/en/latest/topics/architecture.html

 

Architecture overview — Scrapy 2.5.0 documentation

© Copyright 2008–2021, Scrapy developers. Revision 5fd75f86. Last updated on Apr 07, 2021.

docs.scrapy.org

 

Scrapy Tutorial 따라하기

개발환경: Pycharm2021.2 / Python3.9 / Scrapy

 

[STEP 1] test.py에서 개발환경 초기화

import scrapy
from scrapy import cmdline

# init
cmdline.execute('scrapy startproject tutorial'.split())

위 코드를 실행하면 tutorial이라는 디렉토리가 생성되어 scrapy 프로젝트 개발환경이 생성된다.

tutorial 디렉토리

 

[STEP 2] Spider 코드 작성

Spider는 scrapy가 웹사이트에서 데이터를 스크랩하기 위해 사용하는 클래스이다. 초기 request를 정의하고 페이지 내에서 링크를 어떻게 타고갈지, 데이터 추출을 위해 어떻게 파싱할지 등을 정의해줄 수 있다.

 

tutorial/tutorial/spiders/ 디렉토리 아래에 다음과 같이 quotes_spider.py 파일을 작성한다.

import scrapy

class QuoteSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = ['http://quotes.toscrape.com/page/1/',
                'http://quotes.toscrape.com/page/2/']

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = f'quotes-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')
  • name: 스파이더의 이름. 프로젝트 내에서 고유해야 한다.
  • start_requests(): 스파이더가 열릴 때 맨 처음 한번만 호출되는 메소드. 스파이더가 동작할 일련의 request를 반환해야 한다. 
  • parse(): request에 콜백함수를 지정하지 않았을 때 기본으로 호출되는 콜백. Scrapy가 다운로드된 response를 처리할 때 사용된다.

start_requests()를 직접 구현하여 request를 만드는 대신, start_urls 변수에 url을 지정해줄 수도 있다. 

import scrapy

class QuoteSpider(scrapy.Spider):
    name = "quotes"

    start_urls = ['http://quotes.toscrape.com/page/1/',
                  'http://quotes.toscrape.com/page/2/']

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = f'quotes-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log(f'Saved file {filename}')

start_requests()의 default 구현에 의해 start_urls에 지정된 url로 request를 만들게 되고, 이 request들을 default 콜백인 parse() 메소드를 호출해 처리하게 된다.

 

[STEP 3] Spider 실행

scrapy 프로젝트의 최상위 디렉토리(이 경우 tutorial/)에서 다음 커맨드를 실행한다. quotes라는 이름의 스파이더를 실행시키는 커맨드이다.

scrapy crawl quotes

 

위 커맨드를 실행하면 quotes-1.html, quotes-2.html 파일이 생성된다. 지정한 url 페이지의 내용이 그대로 저장되어 있다.

'etc' 카테고리의 다른 글

대칭키와 비대칭키  (0) 2020.07.21
직무특강 / SW개발  (0) 2020.06.30
Comments