scrapy란?
scrapy는 파이썬 기반의 오픈 소스 웹 크롤링 프레임워크이다. 크롤링 작업을 자동화하고, 웹 사이트에서 데이터를 추출하고, 웹페이지를 크롤링하는 데 사용된다. scrapy는 웹 크롤링에 필요한 다양한 기능과 도구를 제공하여 개발자가 효율적으로 크롤링 작업을 구현할 수 있도록 도와준다.
scrpapy의 핵심 기능
- 스파이더 (Spider): Scrapy의 핵심 개념으로, 크롤링 작업을 수행하는 데 사용된다. 스파이더는 웹페이지를 탐색하고 데이터를 추출하는 룰 기반의 크롤링 로직을 포함한다. 사용자는 스파이더를 작성하여 필요한 데이터를 웹페이지에서 추출할 수 있다.
- 요청 및 응답 처리: Scrapy는 HTTP 요청을 보내고 웹 서버로부터 받은 응답을 처리하는 기능을 제공한다. 이를 통해 스파이더가 웹페이지를 방문하고 데이터를 추출할 수 있다.
- 아이템 (Item): 추출한 데이터를 구조화하여 저장하는 데 사용되는 데이터 컨테이너이다. Scrapy를 사용하여 추출한 데이터는 아이템 객체로 저장되며, 이후 데이터베이스, 파일 또는 다른 저장 매체로 전송될 수 있다.
- 파이프라인 (Pipeline): 추출한 데이터를 처리하고 저장하기 위한 파이프라인 기능을 제공다. 사용자는 파이프라인을 사용하여 데이터를 가공, 정제, 저장 또는 다른 후속 처리 작업을 수행할 수 있다.
- 미들웨어 (Middleware): 요청 및 응답 처리 중에 추가적인 기능을 수행하기 위한 확장성을 제공한다. 예를 들어, 미들웨어를 사용하여 요청 및 응답을 가로채고 수정, 필터링 또는 로깅하는 등의 작업을 수행할 수 있다.
scrapy에서 아이템(item) 개념은 Django의 모델(Model) 개념과 유사한 개념이다. 아이템은 scrapy에서 추출한 데이터를 구조화하여 저장되는데 사용되는 데이터 컨테이너이다.
scrapy 사용 방법
scrapy 설치
아래 명령어로 scrapy를 설치할 수 있다.
pip install scrapy
프로젝트 생성
설치 후에 프로젝트를 생성할 경로로 이동하여 아래 명령어로 프로젝트를 생성한다.
scrapy startproject [프로젝트명]
스파이더 생성
프로젝트로 경로 이동 후, 아래 명령어를 통해 URL에 대한 스파이더를 생성할 수 있다.
scrapy genspider [스파이더명] example.com
스파이더 실행
스파이더를 실행하는 명령어에는 `scrapy crawl [스파이더 name]`와 `scrapy runspider [스파이더]` 두 개가 있다.
scrapy crawl [스파이더 name]
scrapy crawl 명령어는 Scrapy 프로젝트 내에서 설정된 설정 파일을 사용하여 스파이더를 실행하는 명령어이다.
[스파이더 name]은 실행할 스파이더의 이름을 지정하는 부분이다. 이는 프로젝트 내에 정의된 스파이더 클래스의 이름과 동일해야 한다.
scrapy.cfg 설정 파일을 기반으로 Scrapy 프로젝트 설정을 로드하고, 설정에 지정된 설정과 파이프라인을 사용하여 스파이더를 실행한다.
대부분의 경우, 크롤링 작업을 수행할 때 scrapy crawl 명령어를 사용한다.
scrapy runspider [스파이더]:
scrapy runspider 명령어는 Scrapy 프로젝트의 설정 파일을 사용하지 않고, 단일 스파이더 파일을 직접 실행하는 명령어이다.
[스파이더]는 실행할 스파이더 파일의 경로 또는 모듈 이름을 지정하는 부분이다. 스파이더 파일은 스파이더 클래스가 정의된 Python 스크립트 파일이다.
스파이더 파일 내에서 스파이더 클래스를 직접 인스턴스화하고 실행하는 방식으로 작동한다.
scrapy.cfg 설정 파일이 없어도 독립적으로 스파이더를 실행할 때 scrapy runspider 명령어를 사용할 수 있다.
crawl | runspider |
scrapy 프로젝트의 설정 파일과 설정을 사용하여 스파이더 실행 | 설정 파일을 사용하지 않고 단일 스파이더 파일을 실행 |
scrapy.cfg 설정 파일을 기반으로 프로젝트 설정을 로드함 | 스파이더 파일 내에서 스파이더 클래스를 직접 인스턴스화하고 실행함 |
대부분의 경우에 사용됨 | 설정 파일 없이 독립적으로 실행할 때 사용함 |
scrapy runspider commerce.py 명령어로 실행 시 아래처럼 모든 로그가 다 출력이 된다.
로그를 출력하지 않으려면 `--nolog` 옵션을 추가한다. (scrapy runspider commerce.py --nolog)
로그 파일을 따로 정리하려면 settings.py에 들어가서 설정할 수 있다.
** 불필요한 주석처리된 데이터는 삭제해도 됨
로그 파일이 매우 길기 때문에, 실행할 때는 --nolog옵션으로 보이지않게하고 파일로 따로 설정하는게 좋은 것 같다.
ROBOTSTXT_OBEY는 로봇 배제 표준(robot.txt)에 관련된 내용으로, True로 설정되어있으면 스크래피가 로봇 배제 표준을 준수하고, False로 설정되어있으면 로봇 배제 표준을 무시한다.
False로 되어있으면 막히는 경우가 있어서 True로 변경해준다.
ROBOTSTXT_OBEY = True # True를 False로 변경
LOG_FILE = '로그파일명.log'
터미널을 하나 더 실행해서 spiders 폴더 상위로 이동한다.
scrapy shell을 입력하면 다양한 도구와 기능을 사용할 수 있다.
주요기능
- CSS 또는 XPath 선택자를 사용하여 웹 페이지의 요소를 선택하고 데이터를 추출할 수 있다.
- 웹 페이지를 브라우징하면서 요청 및 응답 데이터를 살펴볼 수 있다.
- 스크래피의 내장된 파이썬 콘솔을 사용하여 코드를 실행하고 데이터 추출 및 가공 작업을 수행할 수 있다.
- 개발자 도구와 유사한 컨텍스트에서 웹 페이지의 요소를 탐색하고 테스트할 수 있다.
scrapy shell
scrapy shell을 입력한 후 아래 명령어를 실행하여 URL 데이터를 가져온다.
fetch('크롤링할 URL')
아래 명령어로 해당 태그의 데이터에 접근할 수 있다.
response.xpath('xpath경로')
아이템이란?(Item)
scrapy 모듈에서 제공하는 기능으로 파싱한 데이터를 구조화하여 활용할 수 있다.
추출된 데이터를 키-값 쌍을 정의하는 Python 개체인 항목 으로 반환해주는 기능이다.
관련 문서
https://docs.scrapy.org/en/latest/topics/items.html
Items — Scrapy 2.9.0 documentation
© Copyright 2008–2023, Scrapy developers. Revision 52c07264. Last updated on May 08, 2023.
docs.scrapy.org
items.py에서 가공할 아이템을 정의할 수 있다.
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
# 가공할 아이템 정의
class NewsCrawlingItem(scrapy.Item):
# define the fields for your item here like:
# title = scrapy.Field()
# content = scrapy.Field()
# writer = scrapy.Field()
# url = scrapy.Field()
# site = scrapy.Field()
pass
정의한 후 spyder에서 아래와 같이 사용할 수 있다.
from [프로젝트명].items import [클래스명]
item = NewsItem()
item['Name'] = response.xpath('xpath 입력')
모듈이 임포트 되지않을 경우 현재 디렉토리의 절대 경로를 python의 모듈 검색경로로 추가해야한다.
export PYTHONPATH="$PYTHONPATH:$(pwd)"
실행 중에 강제 종료할 경우
ctrl+z과 같이 실행 중에 강제 종료할 경우 리액터가 정상적으로 종료되지않아 오류가 발생할 수 있다.
File "/opt/homebrew/lib/python3.11/site-packages/scrapy/commands/crawl.py", line 30, in run
self.crawler_process.start()
File "/opt/homebrew/lib/python3.11/site-packages/scrapy/crawler.py", line 390, in start
reactor.run(installSignalHandlers=False) # blocking call
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/twisted/internet/asyncioreactor.py", line 254, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "/opt/homebrew/lib/python3.11/site-packages/twisted/internet/base.py", line 1299, in startRunning
ReactorBase.startRunning(cast(ReactorBase, self))
File "/opt/homebrew/lib/python3.11/site-packages/twisted/internet/base.py", line 843, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
리액터 또는 scrapy 프로세스가 실행 중에는, 새로운 프로세스가 실행되지 않는 오류이다.
아래 os별 명령어로 현재 실행 중인 scrapy 프로세스를 조회한다.
unix / linux / macOS
ps aux | grep scrapy
windows
tasklist | findstr scrapy
종료방법은, 아래 명령어를 이용한다.
실행중인 모든 scrapy 프로세스를 강제종료하는 명령어이므로 주의한다.
unix / linux / macOS
pkill -f scrapy
windows
taskkill /F /IM scrapy.exe
'Development > Python' 카테고리의 다른 글
[Python] 이미지 분석 모듈 사용해보기 (0) | 2023.07.20 |
---|---|
[Python] pass 명령어란? (2) | 2023.06.18 |
[Python] base64 디코드 (0) | 2023.05.23 |
[Python] logging 모듈 (0) | 2023.05.17 |
[Python] instaloader 라이브러리 (1) | 2023.05.08 |