【공부 노트】 웹 사이트에서 데이터 수집을위한 Scrapy 기초

전회는 환경 구축 를 실시했습니다.
이번에는 Scrapy의 기초를 공부합니다.

주의사항



이 게시물은 간단한 공부 기록입니다. 나는 웹 스크래핑에 경험이 없기 때문에 잘못된 일을 할 가능성도 높다고 생각합니다. 그 때는 코멘트로 가르쳐 주시면 다행입니다. 그리고, 이 투고의 내용은 Scrapy의 공식 홈페이지 를 참고로 하고 있습니다.

이번 흐름


  • Scrapy 프로젝트 만들기
  • 웹 사이트에서 데이터 추출을위한 스파이더 생성
  • spider를 이용한 데이터 추출

  • 1. Scrapy 프로젝트 만들기



    Scrapy 프레임워크를 사용하려면 먼저 Scrapy 프로젝트를 만들어야 합니다. 원하는 폴더에 다음 명령을 입력합니다.
    
    docker/app$ scrapy startproject tutorial
    

    성공하면 다음과 같이 표시됩니다.
    
    New Scrapy project 'tutorial', using template directory '/usr/local/lib/python3.6/dist-packages/scrapy/templates/project', created in:
        /app/tutorial
    
    You can start your first spider with:
        cd tutorial
        scrapy genspider example example.com
    

    작성된 프로젝트의 구성은 다음과 같습니다.
    |-- scrapy.cfg    # configファイル
    `-- tutorial      # プロジェクトのpythonモジュール。
        |-- __init__.py
        |-- __pycache__
        |-- items.py    
        |-- middlewares.py
        |-- pipelines.py
        |-- settings.py
        `-- spiders     # 作成したspiderを入れるフォルダー
            |-- __init__.py
            `-- __pycache__
    
    4 directories, 7 files
    

    이제 Scrapy 프로젝트를 만들었습니다.

    2. 웹사이트에서 데이터 추출을 위한 spider 작성



    spider는 웹사이트를 탐색하는 방법을 결정하는 클래스입니다. 여기에는 crawl(링크를 쫓는다)과 데이터 추출도 포함됩니다. 즉, spider는 우리 대신 웹사이트에서 데이터를 가져오는 클래스라는 것입니다.

    Scrapy를 사용하면 spider를 쉽게 만들 수 있습니다. 이번은 공식 홈페이지의 튜토리얼에서 사용하고 있는 Quates 사이트 ( htp // 쿠오테 s. 그리고 sc 등. 코m/ ) 를 탐험하는 spider 를 작성합니다.

    Scrapy 프로젝트의 root directory에서 다음을 입력합니다.
    
    docker/app/tutorial$ scrapy genspider quotes quotes.toscrape.com
    

    실행 결과는 다음과 같습니다.
    Created spider 'quotes' using template 'basic' in module:
      tutorial.spiders.quotes
    

    그렇다면 tutorial/spider 폴더에 quotes.py가 생성되었음을 알 수 있습니다. 내용을 보면 아래와 같습니다. 각 항목에 대한 설명은 주석에 적혀 있습니다.
    
    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QuotesSpider(scrapy.Spider):
        # spiderの名前。必ずユニークな必要がある
        name = 'quotes'
        # 探索するドメイン
        allowed_domains = ['quotes.toscrape.com']
        # spiderが探索するURL
        start_urls = ['http://quotes.toscrape.com/']
    
        def parse(self, response):
            """
            各requestに対するreponseを処理する。
            """
            pass
    

    이 spider의 parse 메소드를 작성합니다.



    웹 페이지를 보면 div의 class "quote"안에, span class "text"에 원하는 명언이 쓰여져 있는 것을 알 수 있습니다.
    <div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork">
            <span class="text" itemprop="text">
                ....
            </span>
        ....
    </div>
    

    이 정보를 얻는 방법으로 CSS와 XPath가 있지만 XPath가 더 강력하기 때문에 XPath를 사용합니다. 간단하게 명언만을 추출하는 코드는 아래와 같습니다.
    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class QuotesSpider(scrapy.Spider):
        name = 'quotes'
        allowed_domains = ['quotes.toscrape.com']
        start_urls = ['http://quotes.toscrape.com/']
    
        def parse(self, response):
            quotes = response.xpath("//div[@class='quote']/span[@class='text']/text()").extract()
            yield {'quotes': quotes}
    

    XPath에 대해서는 다음에 설명합니다. 이제 Spider를 준비했습니다.

    3. spider를 이용하여 데이터 추출



    이번에는 간단한 커맨드 라인에서 추출을 수행합니다.
    docker/app/tutorial$ scrapy crawl quotes
    

    그러면 제대로 명언을 얻을 수 있는 것을 알 수 있습니다.
    {
        'quotes': ['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”', 
                   '“It is our choices, Harry, that show what we truly are, far more than our abilities.”', 
                   '“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”', 
                   '“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”', 
                   "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”", 
                   '“Try not to become a man of success. Rather become a man of value.”', 
                   '“It is better to be hated for what you are than to be loved for what you are not.”', 
                   "“I have not failed. I've just found 10,000 ways that won't work.”", 
                   "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", 
                   '“A day without sunshine is like, you know, night.”']
    }
    
    

    마지막으로



    이번에는 간단한 Scrapy의 기초를 공부했습니다. 다음 번에는 조금 더 복잡한 스파이더를 만들고 싶습니다.

    좋은 웹페이지 즐겨찾기