반응형

Scrapy 기초

Scrapy는 2008년에 처음 0.7버전으로 공개되었다고 합니다. 

그만큼 오랫동안 사용되어 왔고, 안정성을 갖추고 있다고 알려져 있습니다. 웹 스크래핑을 본격적으로 하는 경우에 있어, Scrapy를 사용하는 것이 성능상 매우 큰 이점을 갖게 될 것입니다.

빠르고 안정적인 성능 외에도 스크래피의 장점을 들어보자면, 일단 깨진 HTML을 이해합니다.

Scrapy에서 직접 BeautifulSoup 또는 lxml을 사용할 수 있습니다. 하지만 스크래피는 XPath 인터페이스인 selectors를 제공하고, 이것으로 깨진 HTML 코드와 혼란스러운 인코딩을 효율적으로 수행할 수 있게 해줍니다.

Scrapy는 본래 웹 스크래핑을 위해 디자인 되었지만, API를 사용해서 데이터를 추출하거나 일반적인 웹 크롤러 목적으로도 사용할 수 있습니다.

* 보통 크롤링과 스크래핑을 혼용하지만, 웹 크롤링은 모든 데이터를 가져오는 것으로, 웹 스크래핑은 특정 데이터만 추출하는 것으로 구분할 수 있습니다.

Scrapy 라이브러리를 제대로 배우기 위해서는 많은 시간과 노력이 필요할 것입니다. 이번 정리에서는 기본적으로 크롤링을 하는 방법을 알아보도록 할 것입니다.  

1) 새로운 Scrapy 프로젝트 생성

2) 추출할 아이템 정의

3) 사이트를 크롤링하고 아이템을 추출하기 위해 스파이더 작성

4) 추출된 아이템을 저장하기 위해 아이템 파이프라인 작성

(이미 Scrapy가 설치되어 있다고 가정하겠습니다. 전 제 맥에서 pip install scrapy로 설치했습니다)


1. 새로운 Scrapy 프로젝트 생성

스크래핑을 시작하기 전에, 가장 먼저 해야 할 일은 새로운 Scrapy 프로젝트를 설정하는 것입니다. 

파이썬을 실행하고, 아래 코드를 입력합니다.

>>> scrapy start project tutorial

이것은 다음 콘텐츠를 가진 tutorial 디렉토리를 생성할 것입니다.


tutorial/

    scrapy.cfg # 설정 파일을 배치


    tutorial/ # 프로젝트의 파이썬 모듈, 여기에서 당신 코드를 임포트할 것입니다.

        __init__.py


        items.py # 프로젝트 아이템 파일

        pipelines.py # 프로젝트 파이프라인 파일

        settings.py # 프로젝트 설정 파일

        spiders/ # 나중에 당신의 스파이더들이 들어갈 디렉토리

        __init__.py

        ...


2. 아이템 정의

아이템은 스크랩한 데이터를 싫은 콘테이너라고 할 수 있습니다. 이것은 파이썬 딕셔너리처럼 동작합니다. 아이템은 scrapy.item 클래스를 생성함으로써 선언됩니다. 그리고 ORM과 매우 유사하게 scrapy.Field 오브젝트로 속성이 정의됩니다. 

예를 들자면, 우리가 어떤 사이트의 타이틀, url, 사이트 설명을 캡처하고 싶다면, 우리는 이 세가지 데이터를 위해 필드를 각각 정의해야 합니다. 

앞에서 생성된 items.py 파일을 다음과 같이 에디트합니다.

import scrape


class DmozItem(scrape.Item):

    title = scrape.Field()

    link = scrape.Field()

    desc = scrapy.Field()


3. 스파이더 작성

스파이더는 작성자가 직접 정의하는 클래스입니다. 

Scrapy는 도메인 또는 그룹 도메인에서 정보를 스크랩하기 위해 사용합니다. 

제일 먼저 다운로드할 URLs의 첫번째 리스트를 정의합니다. 

그리고 아이템을 추출하기 위해 어떻게 페이지 콘텐츠를 읽어들일지 정의합니다.

그럼 스파이더를 생성해 보도록 하겠습니다.

import scrapy


class Dmozspider(scrapy.Spider):

    name = “dmoz”

    allowed_domains = [“dmoz.org”]

    start_urls = [

http://www.dmoz.org/Computers/Programming/Languages/Python/Books/“,

http://www.domz.org/Computers/Programming/Languages/Python/Resources/“

    ]

    

    def parse(self, response):

        filename = response.url.split(“/“)[-2] + ‘.html’

        with open(filename, ‘wb’) as f:

            f.write(response.body)

위의 예를 보면, scrapy.Spider를 서브 클래스로 받았습니다. 그리고 몇가지 속성을 정의했다는 것을 알 수 있습니다.

- name : 스파이더를 알아보게 하는 용도로 씁니다. 그래서 고유한 이름을 써야 합니다. 즉, 다른 스파이더와 동일한 이름을 설정할 수 없습니다.

- start_urls : 스파이더가 크롤링을 시작하는 URLs입니다. 다운로드한 첫번째 페이지는 여기부터 시작합니다. 하위 URLs는 여기 시작 URLs에 포함된 데이터에서 생성될 것입니다.

- parse() : 각 시작 URL의 다운로드한 Response 객체와 함께 불러오는 스파이더의 메서드입니다. 

그럼, 위에 작성한 스파이더를 동작시키기 위해, 프로젝트 최상위 디렉토리에서 다음 명령어를 실행합니다. 

>>> scrapy crawl dmoz

위 명령어는 우리가 추가한 dmoz 이름을 가진 스파이더를 실행합니다. 이것은 'dmoz.org' 도메인에 몇가지 request를 보낼 것입니다. 아래와 유사한 output을 받게 될 것입니다.

2014-01-23 18:13:07-0400 [scrapy] INFO: Scrapy started (bot: tutorial)

2014-01-23 18:13:07-0400 [scrapy] INFO: Optional features available: ...

2014-01-23 18:13:07-0400 [scrapy] INFO: Overridden settings: {}

2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled extensions: ...

2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled downloader middlewares: ...

2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled spider middlewares: ...

2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled item pipelines: ...

2014-01-23 18:13:07-0400 [scrapy] INFO: Spider opened

2014-01-23 18:13:08-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/2014-01-23 18:13:09-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/2014-01-23 18:13:09-0400 [scrapy] INFO: Closing spider (finished)

 

3-1. Selectors 소개 

웹 페이지에서 데이터를 추출하기 위해서는 몇가지 방법이 있습니다. 

Scrapy에서는 Scrapy Selectors라고 불리는 XPath 또는 CSS에 기반한 메커니즘을 사용합니다. 

XPath 표현과 그 의미를 다음 사례를 통해 기본적으로 이해할 수 있습니다.

  • /html/head/title: HTML 문서의 <head> 요소 안의 <title>요소를 선택하세요.
  • /html/head/title/text(): 앞에서 언급한 <title> 내부의 텍스트를 선택하세요.
  • //td: 모든 <td> 요소를 선택하세요.
  • //div[@class=“mine”]: class=“mine”속성을 포함한 모든 div요소를 선택하세요.

위 사례는 XPath의 간단한 예제일 뿐입니다. 실제로 더 파워풀하게 사용이 가능합니다. 

CSS와 XPath로 작업하기 위해, Scrapy는 Selector 클래스를 제공하고 response로부터 무엇을 선택할 것이지에 대한 편리한 단축키를 제공합니다.

- Selectors는 4가지 기본 메서드를 가지고 있습니다.

  • xpath() :  인수로 주어진 xpath에서 선택된 각 노드를 대표하는 selectors 리스트를 돌려줍니다
  • css() : 인수로 주어진 CSS에서 선택된 각 노드를 대표하는 selectors 리스트를 돌려줍니다
  • extract() : 선택된 데이터와 함께 유니코드 string을 돌려줍니다
  • re() : 인수로 주어진 정규 표현식을 적용해서 추출한 유니코드 string을 돌려줍니다

4. 스크랩한 데이터 저장 

스크랩한 데이터를 저장하는 가장 간단한 방법은 크롤링할 때 저장형태를 포함한 다음 명령어를 쓰는 것입니다. 

>>> scrapy crawl dmoz -o dmoz.json

위 명령어는 모든 스크랩한 데이터들을 포함한 json 형태의 dmoz.json파일을 생성합니다.

Scrapy는 기존 파일을 덮어쓰지 않고, 파일에 데이터를 추가합니다. 


위 예제 및 설명은 www.scrapy.org의 공식 문서를 참고해서 작성했습니다.



반응형

'파이썬으로 할 수 있는 일 > 크롤링' 카테고리의 다른 글

최근의 웹 스크래핑에 대해  (0) 2023.10.20

+ Recent posts