티스토리 뷰
Scrapy 를 이용해 데이터 추출하기
-
scrapy 명령어를 사용해 프로젝트 만들기
-
Scrapy 프로젝트 만들기
-
구조
-
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())
-
명령줄에서 scrapy 명령어 실행
-
--nolog 옵션은 로그를 출력하지 않는다.
-
데이터를 추출해서 저장
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)
-
실행하기
-
다운로드 확인
'Machine Learning' 카테고리의 다른 글
붓꽃의 품종 분류하기 (0) | 2020.09.24 |
---|---|
머신러닝 개요, scikit-learn (0) | 2020.09.20 |
크롤링과 스크레이핑 - cron을 이용한 정기적인 크롤링 (0) | 2020.09.19 |
크롤링과 스크레이핑 - 웹 API로 데이터 추출 (0) | 2020.09.19 |
크롤링과 스크레이핑 - 웹 브라우저를 이용한 스크레이핑(selenium, 헤드리스 파이어폭스) (0) | 2020.09.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Disk System
- Java
- aop
- Spring
- I/O Mechanisms
- vmware
- File Protection
- Flume
- I/O Services of OS
- Allocation methods
- Variable allocation
- 하둡
- maven
- jdbc
- mapreduce
- Replacement Strategies
- hadoop
- HDFS
- 빅데이터 플랫폼
- SQL
- JSON
- Free space management
- SPARK
- 빅데이터
- oracle
- springboot
- gradle
- Disk Scheduling
- RAID Architecture
- linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함