Spider
- Spider의 종류 (참고로, 아래 3가지 종류의 Spider는 잘 사용되지 않는다.)
- CrawlSpider
- XMLFeedSpider
- CSVFeedSpider
- SitemapSpider
1 | # 여러사이트를 크롤링하기 위한 spider를 생성 |
- spider 폴더의 many_site.py파일에서 코드를 작성하기에 앞서 settings.py에서 naver와 daum은 robots.txt에서 크롤링을 불허하기에 다음과 같은 수정작업을 해주어야 크롤링이 가능하다.
daum과 naver를 크롤링하기 위한 setting.py 수정
- 아래의 코드처럼 여러 도메인을 크롤링할 수 있는 방법은 크게 3가지 정도가 있다.
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 실행 -> 선택자 확인 -> 코딩 -> 데이터 저장(프로그램 테스트)
Items
- 구조적으로 데이터를 크롤링할 수 있게 해주는 역할을 한다. 예를 들면 내가 크롤링할 데이터를 정확하게 구분(신문기사의 이름, 본문, 이미지 이렇게 구조적으로 구분)하게 구조적으로 규칙을 정하고 그 규칙들을 Items라는 파일안에 작성하여 나중에 Items를 return하면 명확하게 구분된 우리가 원하는 여러가지 형식으로 저장할 수 있다.
spider는 직접 크롤링을 하는 역할, Items는 크롤링 될 타겟 데이터를 명확히 해주는 역할이라고 생각하면 될 것이다.
Scrapy Item
장점
- 1) 수집 데이터를 일관성있게 관리 가능
- 2) 데이터를 사전형(Dict)로 관리, 오타 방지
3) 추후 가공 및 DB 저장 용이
Items를 사용한 scrapy는 새로운 사이트를 크롤링할 것이므로 새로운 spider를 만들어준다.
1 | scrapy genspider using_items itnews.com |
- items.py 파일에서 우리의 타켓 데이터를 정의해준다.
items.py를 활용하기 위해 import를 할 경우 다음과 같이 절대경로를 사용한 path 추가 방법을 사용
해야한다. 다음과 같이 items의 ItArticle class를 활용하여 spider를 좀 더 깔끔하게 작성할 수 있다.