Scrapy 웹 크롤링 02 - Spider, Scrapy selectors, Items

Spider

  • Spider의 종류 (참고로, 아래 3가지 종류의 Spider는 잘 사용되지 않는다.)
    • CrawlSpider
    • XMLFeedSpider
    • CSVFeedSpider
    • SitemapSpider
1
2
# 여러사이트를 크롤링하기 위한 spider를 생성
scrapy genspider many_site hub.scraping.com

여러사이트를 크롤링하기 위한 새로운 spider 생성

  • spider 폴더의 many_site.py파일에서 코드를 작성하기에 앞서 settings.py에서 naver와 daum은 robots.txt에서 크롤링을 불허하기에 다음과 같은 수정작업을 해주어야 크롤링이 가능하다.

daum과 naver를 크롤링하기 위한 setting.py 수정

  • 아래의 코드처럼 여러 도메인을 크롤링할 수 있는 방법은 크게 3가지 정도가 있다.

여러 사이트 크롤링 방법

  • 다음과 같이 1번째 방법을 사용해서 로깅 및 분기처리로 여러 사이트를 크롤링할 수 있게끔 코드를 수정해 주었다.
    여러 사이트 크롤링 방법 1

Selector

xpath selector 도움 사이트

css selector 도움 사이트

crawling시 활용 tip

  • 타겟 데이터는 크롬 개발자 도구 사용
  • 선택자 연습 팁 : scrapy shell 에서 테스트(효율성)
  • scrapy shell 도메인

  • 중요(완전 동치는 아니다!)

    • get() == extract_first()
    • getall() == extract()

CSS 선택자

  • div#chan div : (자손) chan이라는 class속성값으로 갖는 div tag의 아래에 존재하는 모든 div
  • div#chan > div : (자식) chan이라는 class속성값으로 갖는 div tag의 직계자식 div들
  • ::text -> 노드의 텍스트만 추출
  • ::attr(name) -> 노드 속성값 추출
  • get(default=’’) : get으로 추출할 때 해당사항이 없다면 공백으로 출력

  • 예시)

    • response.css(‘title::text’).get() : title tag의 텍스트만 추출
    • response.css(‘div > a::attr(href)’).getall() : div tag의 자식 a tag의 href속성값 전부 추출

Xpath 선택자

  • nodename : 이름이 nodename 선택
  • text() -> 노드 텍스트만 추출
  • / : 루트부터 시작
  • // : 현재 node 부터 문서상의 모든 노드 조회
  • . : 현재 node
  • .. : 현재 node의 부모노드
  • @ : 속성 선택자
  • 예시)
    • response.xpath(‘/div’) : 루트노드부터 모든 div tag 선택
    • response.xpath(‘//div[@id=”id”]/a/text()’).get() : div tag 중 id가 ‘id’인 자식 a tag의 텍스트 하나만 추출

혼합 사용 가능!!

  • response.css(‘img’).xpath(‘@src’).getall()

실습) w3school(웹에 관한 정보들이 있는 사이트)

  • 실습 목표 : nav 메뉴 이름 크롤링 실습
  • 과정 : shell 실행 -> 선택자 확인 -> 코딩 -> 데이터 저장(프로그램 테스트)

실습을 위한 spider 코드

Items

  • 구조적으로 데이터를 크롤링할 수 있게 해주는 역할을 한다. 예를 들면 내가 크롤링할 데이터를 정확하게 구분(신문기사의 이름, 본문, 이미지 이렇게 구조적으로 구분)하게 구조적으로 규칙을 정하고 그 규칙들을 Items라는 파일안에 작성하여 나중에 Items를 return하면 명확하게 구분된 우리가 원하는 여러가지 형식으로 저장할 수 있다. spider는 직접 크롤링을 하는 역할, Items는 크롤링 될 타겟 데이터를 명확히 해주는 역할이라고 생각하면 될 것이다.

Scrapy Item

장점
  • 1) 수집 데이터를 일관성있게 관리 가능
  • 2) 데이터를 사전형(Dict)로 관리, 오타 방지
  • 3) 추후 가공 및 DB 저장 용이

  • Items를 사용한 scrapy는 새로운 사이트를 크롤링할 것이므로 새로운 spider를 만들어준다.

1
scrapy genspider using_items itnews.com

using_items spider 생성

  • items.py 파일에서 우리의 타켓 데이터를 정의해준다.

items.py 파일에 데이터 정의

  • items.py를 활용하기 위해 import를 할 경우 다음과 같이 절대경로를 사용한 path 추가 방법을 사용해야한다. 다음과 같이 items의 ItArticle class를 활용하여 spider를 좀 더 깔끔하게 작성할 수 있다.

using_items.py spider 작성