Scrapy로 쉬운 웹 스크래핑

웹 스크래핑을 가능하게 하는 framework인 Scrapy의 실행 방법을 알기 쉽게 기재했습니다.
도움이되면 다행입니다.

참고:
Python - Scrapy를 사용하여 크롤러 만들기
htps : // 이 m / 나카 j / ms / 4b2136b7b5 A4E 2432 8

소요시간 15분
내용
1.Scrapy 설치 및 프로젝트 생성
2.Spider 정보
3. 실제로 웹 페이지 정보를 얻어 보자!

1.Scrapy 설치 및 프로젝트 생성



터미널에서 아래 pip를 실행하고 scrapy 설치
pip install scrapy

그런 다음 scrapy 프로젝트를 만들려는 디렉토리로 이동하여 다음을 실행합시다.
scrapy startproject sake

이 후 일본주관계의 웹사이트를 스크래핑 하므로 프로젝트의 이름을 "sake"에 했습니다
그러면 현재 디렉토리 아래에 다음 폴더가 구성됩니다.



2.Spider 정보



위의 파일만으로는 웹 스크래핑을 할 수 없으므로 아래 명령을 입력하고
spiders 디렉토리에 파일을 작성합니다.
#scrapy genspider <ファイル名> <スクレイピングしたいweb URL>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/

그러면 spiders 디렉토리 내에 "scrapy_sake.py"라는 파일이 되어 있는 것을 확인할 수 있다고 생각합니다.

작성된 파일의 내용은 다음과 같습니다.

sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy


class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    allowed_domains = ['https://www.saketime.jp/ranking/']
    start_urls = ['http://https://www.saketime.jp/ranking/']

    def parse(self, response):
        pass

나중에 자세히 설명하겠지만 이 "def parse"부분을 주로 코딩해 나가게 됩니다.
코딩하기 전에 한 번 정확하게 웹 정보를 얻을 수 있는지 확인합시다.
"def parse"부분에 print 문을 추가하여 취득 정보를 살펴 보겠습니다.

sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy


class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    allowed_domains = ['https://www.saketime.jp/ranking/']
    start_urls = ['http://https://www.saketime.jp/ranking/']

    def parse(self, response):
        #passを削除しprint文を追記
        print(response)

그리고 아래의 명령을 실행하면 상당히 많은 출력이 돌아옵니다만 그 안에서 확실히 html이 취득되어 있는 것을 확인할 수 있습니다.

실행 명령
#scrapy crawl <ファイル名>
scrapy crawl scrapy_sake

출력

               <li class="brand_review clearfix">
                <div>
                  <p>
                    磯自慢 特別本醸造生酒原酒

本日のお酒はこちら、磯自慢の特別本醸造の生原酒!
米は...                    <br>
                    <span class="brand_review_user">
                      by
                      <span>すーさん</span>
                      <span>
                        <span class="review-star"></span>
                        <span>4.5</span>
                      </span>
                      <span class="reviewtime">
                        <span>2020年3月23日</span>
                      </span>
                    </span>

                  </p>
                </div>
              </li>
                                        </ul>
          </a>
                  </div>
:
:
:
'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)

그럼 이 다음에 여기에서 필요한 정보만을 꺼내 보자!

3. 실제로 웹 페이지 정보를 얻어 보자!



기본적으로 scrapy로 구현하는 파일은 아래 두 가지뿐입니다.
- items.py
- spiders > scrapy_sake.py

먼저 item.py에서 편집해 봅시다.
우선 열면 원래는 아래의 파일과 같이 되어 있습니다.

sake/items.py
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy

class SakeItem(scrapy.Item):
    pass


이 class 부분에 scrapy로 취득하고 싶은 정보를 임의로 등록합니다.

sake/items.py
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class SakeItem(scrapy.Item):
    #取得したい情報名称(任意) = scrapy.Field()
    prefecture_maker = scrapy.Field()
    prefecture = scrapy.Field()
    maker = scrapy.Field()
    brand = scrapy.Field()
    pass


이것으로, items.py의 기술은 종료입니다.
그런 다음 scrapy_sake.py의 코딩으로 이동합니다.

완성형이 아래와 같습니다.
상기 2장에서 본 것과 비교해 def parse()내가 리치가 되어 있다고 생각합니다.

sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
#items.pyをimportすることを忘れないようにしましょう
from sake.items import SakeItem

class ScrapySakeSpider(scrapy.Spider):
    name = 'scrapy_sake'
    #allowed_domains = ['ja.wikipedia.org']
    start_urls = ['https://www.saketime.jp/ranking/']

    def parse(self, response):
        items = []
        #htmlタグのli.clearfixという場所に日本酒情報が格納されていました。
        sakes = response.css("li.clearfix")

        #ページ内にある複数あるli.clearfixの1つずつをみていく
        for sake in sakes:
            #item.pyで定義したSakeItemオブジェクトを宣言 
            item = SakeItem()
            item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()

            #<div class="headline clearfix">のような記述の場合,headline.clearfixとして間に.をつけること
            item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()

            #取得したデータのクレンジング
            if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
                #¥nとスペースの削除
                item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
                #prefectureとmakerの分離
                item["prefecture"] = item["prefecture_maker"].split('|')[0]
                item["maker"] = item["prefecture_maker"].split('|')[1]
                items.append(item) 
        print(items)

    #ページ切り替えを再起的処理で反映
        #aタグのrel="next"の要素をリンク形式で取得する
        next_page = response.css('a[rel="next"]::attr(href)').extract_first()
        if next_page is not None:
            # URLが相対パスだった場合に絶対パスに変換する
            next_page = response.urljoin(next_page)
            #yieldで1回ずつRequestを返す、リクエスト後のページでsakesが登録され、上のfor文が再度実行される
            yield scrapy.Request(next_page, callback=self.parse)

이것을 실행하면 아래와 같습니다.
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'おろちの舌鼓',
 'maker': '木次酒造',
 'prefecture': '島根',
 'prefecture_maker': '島根|木次酒造'}, {'brand': '禱と稔',
 'maker': '福光屋',
 'prefecture': '石川',
 'prefecture_maker': '石川|福光屋'}, {'brand': '金沢美人',
 'maker': '福光屋',
 'prefecture': '石川',
 'prefecture_maker': '石川|福光屋'}, {'brand': '甚九郎',
 'maker': '北雪酒造',
 'prefecture': '新潟',
 'prefecture_maker': '新潟|北雪酒造'}, {'brand': '兼六桜',
 'maker': '中村酒造',
 'prefecture': '石川',
 'prefecture_maker': '石川|中村酒造'}, {'brand': '誕生',
 'maker': '東北銘醸',
 'prefecture': '山形',
 'prefecture_maker': '山形|東北銘醸'}, {'brand': 'SUMMERGODDESS',
 'maker': '真名鶴酒造',
 'prefecture': '福井',
:
:
:
 'scheduler/dequeued/memory': 221,
 'scheduler/enqueued': 221,
 'scheduler/enqueued/memory': 221,
 'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)

JSON 형식으로 110페이지의 일본술 정보가 20초 정도로 입수할 수 있었습니다.
편리하네요.

자신의 흥미가 있는 사이트등을 스크래핑 해 보고 정보를 취득해 봅시다.

메모



기본 정보이지만 스크래핑하고 싶은 사이트의 html 정보의 견해로는 chrome 브라우저이며 macOS의 경우 cmd + option + i로 표시 할 수 있습니다.
또한 cmd + shift + c를 눌러 사이트의 요소를 클릭하여 html 코드의 어디를 나타내는 지 확인할 수 있습니다.

좋은 웹페이지 즐겨찾기