티스토리 뷰

Scrapy 를 이용해 데이터 추출하기

  1. scrapy 명령어를 사용해 프로젝트 만들기

  • Scrapy 프로젝트 만들기

  • 구조

  1. Spider 클래스를 작성해서 크롤링과 데이터 추출 코드 작성

  • spiders 폴더 내부에 파일 생성

import scrapy

class Book1Spider(scrapy.Spider):
  name = 'book'
  start_urls = [
    'https://wikibook.co.kr/list/'
  ]

  def parse(self, response):
    # 도서 목록 추출
    title = response.css('title')
    print(title.extract())
  1. 명령줄에서 scrapy 명령어 실행

  • --nolog 옵션은 로그를 출력하지 않는다.

  1. 데이터를 추출해서 저장

import scrapy

class Book2Spider(scrapy.Spider):
  name = 'book2'
  start_urls = [
    'https://wikibook.co.kr/list/'
  ]

  def parse(self, response):
    # 도서 목록 추출
    li_list = response.css('.book-url')
    for a in li_list:
      # href 속성과 텍스트 추출
      href = a.css('::attr(href)').extract_first()
      text = a.css('::text').extract_first()
      # 절대 경로로 변환
      href2 = response.urljoin(href)
      # 결과 리턴 return이 아닌 yield 키워드 사용
      yield {
        'text': text,
        'url': href2
      }
  • list.json 파일로 출력하기

  • list.json 파일 확인

Scrapy shell로 실행

  • scrapy shell 실행

  • 페이지 읽기

  • 타이틀 출력

  • 내부 텍스트 출력

  • 종료

Scrapy를 이용한 위키북스의 도서 표지 다운로드

genspider로 기본 spider 골격 만들기

  • book3.py 파일을 spiders 폴더에 생성

  • 스크래이핑 할 도메인을 넣는다.

  • 기본 템플릿으로 생성된다.

import scrapy


class Book3Spider(scrapy.Spider):
    name = 'book3'
    allowed_domains = ['wikibook.co.kr']
    start_urls = ['http://wikibook.co.kr/']

    def parse(self, response):
        pass
  • 이미지 링크 추출하기

import scrapy

class Book3Spider(scrapy.Spider):
  name = 'book3'
  allowed_domains = ['wikibook.co.kr']
  # 도서 목록 페이지 
  start_urls = [
    'https://wikibook.co.kr/list'
  ]

  # 도서 목록 페이지 스크레이핑
  def parse(self, response):
    li_list = response.css('.book-url')
    # 5개만 가져오기
    for a in li_list[:5]:
      href = a.css('::attr(href)').extract_first()
      print(href)
      # 개별 도서 페이지 크롤링 요청하기
      yield response.follow(
        response.urljoin(href), self.parse_book
      )
      
  # 개별 도서 페이지를 스크레이핑하는 함수
  def parse_book(self, response):
    # 제목과 링크 추출하기 
    title = response.css('.main-title::text').extract_first()
    img_url = response.css('.book-image-2d::attr(src)').extract_first()
    # 결과 출력하기
    yield {
      'title': title,
      'img_url': response.urljoin(img_url)
    }

  • list3.json 파일 확인

이미지 파일 다운로드

import scrapy

class Book4Spider(scrapy.Spider):
  name = 'book4'
  allowed_domains = ['wikibook.co.kr']
  start_urls = [
    'https://wikibook.co.kr/list'
  ]

  def parse(self, response):
    li_list = response.css('.book-url')
    #  5개만 다운로드 
    for a in li_list[:5]:
      href = a.css('::attr(href)').extract_first()
      yield response.follow(
        response.urljoin(href), self.parse_book
      )

  def parse_book(self, response):
    title = response.url.split("/")[-2]
    img_url = response.css('.book-image-2d::attr(src)').extract_first()
    # 다운로드를 지시
    req = scrapy.Request(
      response.urljoin(img_url),
      callback=self.parse_img
    )
    # 함수끼리 데이터를 전송하는 방법
    req.meta["title"] = title
    yield req

  # 이미지 다운로드 
  def parse_img(self, response):
    # 전달된 데이터를 받기
    title = response.meta["title"]
    title = title.replace(r'[\/:*?"<>|.]+', '_').strip()
    fname = title + '.jpg'
    # 파일을 저장
    with open(fname, 'wb') as f:
      f.write(response.body)
  • 실행하기

  • 다운로드 확인

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함