스크래피(scrapy) 설치 및 scrapy 프로젝트 시작하기
이전 scrapy에 대한 소개와 아키텍처에 대한 글과 이어지는 내용입니다~
[Python/Python 프로그래밍] - 파이썬 웹 스크래핑할 때 이거 쓰세요. 최고의 파이썬 웹 스크래핑 솔루션 scrapy
window에서 anaoncda를 통해 scrapy를 설치했을 때 계속 실행 오류가 뜨시면 일반 Python 공식 사이트에서 배포하는 Python 프로그램을 설치하여 Scrapy를 설치하세요! 저도 최근 anaconda를 설치해서 scrapy를 진행했었는데 계속 오류가 나서 Python으로 다시 진행했더니 잘 작동됩니다! |
| scrapy 설치
scrapy를 설치하기 위해서는 pip 패키지 매니져를 이용할 때는 다음과 같은 명령어를 입력하시면 됩니다. (이때, python이 설치된 디렉터리를 경로가 환경변수로 설정되어 있어야 합니다.)
pip install Scrapy
Anaconda를 설치해서 Anaconda 패키지에서 제공하는 conda 패키지 매니져를 이용할 경우 다음과 같은 명령어를 입력하시면 됩니다.
conda install -c scrapinghub scrapy
| scrapy 프로젝트 시작
원하는 디렉터리에서 아래와 같은 명령어를 치게되면 scrapy 시작 프로젝트가 세팅되게 됩니다.
scrapy startproject tutorial
그리고 다음과 같은 구조의 프로젝트가 생성됩니다.
tutorial/
| scrapy.cfg
|
\---tutorial
| items.py
| middlewares.py
| pipelines.py
| settings.py
| __init__.py
|
+---spiders
| | __init__.py
- item.py: 크롤링할 데이터를 저장하는 기능을 하는 객체의 클래스를 정의하는 곳입니다.
- middlewares.py: scrapy의 커스텀 middleware의 기능을 정의하는 곳입니다. middleware는 다시 한 번 이야기하자면 engine에서 다른 모듈로 request와 response 정보가 교환될 때 지나가는 중간 통로입니다.
- pipelines.py: item pipelines의 커스텀 모듈을 정의하는 곳입니다. pipeline은 item이 다른 저장소로 저장될 때 거치는 통로라고 생각하면 됩니다.
- settings.py: 현재 scrapy 프로젝트의 설정을 하는 파이썬 파일입니다.
- scrapy.cfg: scrapy 프로젝트들의 전체적인 설정을 하는 곳입니다. 어떤 프로젝트가 어떤 설정을 따를 것인지 배포는 어떤 식으로 할 것인지를 정합니다.
| scrapy 예제
다음은 스크래피의 공식사이트에서 가져온 scrapy의 시작 예제입니다. scrapy를 통해 크롤링을 하려면 spider 파일을 만들어야 합니다. 이 파일은 spiders 디렉터리에 다음과 같이 위치시켜놓으면 됩니다.
| scrapy.cfg
|
\---tutorial
| items.py
| middlewares.py
| pipelines.py
| settings.py
| __init__.py
|
+---spiders
| | spider.py
| | __init__.py
spider.py
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
name : scrapy의 Spider
- name : scrapy의 Spider 객체를 식별하는 역할을 하는 클래스 변수입니다. 오직 하나의 유일한 name을 Spider 객체는 가질 수 있습니다.
- start_requests: 크롤링이 최초로 시작되는 요청 메서드입니다. 반드시 반복가능한(iterable) 요청 객체인 Requests를 반환해야하며 크롤링할 url들을 명시해야합니다. 이 최초의 요청이 시작되면 이로 인한 연속적인 요청이 Spider에서 이루어집니다. 이 때문에 반복가능한(iterable) 객체를 반환하도록 되어 있는 것입니다.
- parse: 요청한 데이터에 대한 응답 객체인 Reponse 객체를 받아서 응답 데이터를 파싱하는 데 쓰이는 메서드입니다. Spider에서의 각 요청 데이터들에 대한 응답을 파싱하는 데에 포인트를 두셔야 합니다. 위 response 파라미터는 TextResponse라는 인스턴스이며 페이지의 컨텐츠에 대한 정보를 담고 있습니다.
아래의 명령어를 실행하면 위 scrapy 프로젝트가 실행되면서 명시했던 url들을 크롤링하고 데이터를 파일로 저장하게 됩니다.
scrapy crawl quotes
2019-09-24 23:19:50 [scrapy.core.engine] INFO: Spider opened
2019-09-24 23:19:50 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-09-24 23:19:50 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2019-09-24 23:19:51 [quotes] DEBUG: Saved file quotes-1.html
2019-09-24 23:19:51 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2019-09-24 23:19:51 [quotes] DEBUG: Saved file quotes-2.html
2019-09-24 23:19:51 [scrapy.core.engine] INFO: Closing spider (finished)
2019-09-24 23:19:51 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 678,
'downloader/request_count': 3,
'downloader/request_method_count/GET': 3,
'downloader/response_bytes': 5976,
'downloader/response_count': 3,
'downloader/response_status_count/200': 2,
'downloader/response_status_count/404': 1,
'elapsed_time_seconds': 1.296532,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2019, 9, 24, 14, 19, 51, 801004),
'log_count/DEBUG': 5,
'log_count/INFO': 10,
'response_received_count': 3,
'robotstxt/request_count': 1,
'robotstxt/response_count': 1,
'robotstxt/response_status_count/404': 1,
'scheduler/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': datetime.datetime(2019, 9, 24, 14, 19, 50, 504472)}
2019-09-24 23:19:51 [scrapy.core.engine] INFO: Spider closed (finished)
물어보고 싶은 거나 궁금한 점들은 댓글로 물어봐주시면 친절히 답변드리도록 하겠습니다! 좋아요 한 번 눌러주시면 감사하겠습니다
'Python > Python 프로그래밍' 카테고리의 다른 글
[Python] 클로저(Closure) (0) | 2021.03.27 |
---|---|
[Python] lambda (0) | 2021.03.27 |
[Python] Generator, yield (0) | 2021.03.27 |
[Python] print 함수 사용시 소수점 자리 찍기 (0) | 2021.03.27 |
파이썬을 이용한 selenium 사용법 및 동적 웹 스크래핑 (0) | 2021.03.27 |
회사 프록시 때문에 pip, npm을 통해 제대로 패키지 다운로드가 안 될 때 (0) | 2021.03.27 |
파이썬 웹 스크래핑할 때 이거 쓰세요. 최고의 파이썬 웹 스크래핑 솔루션 scrapy (0) | 2021.03.27 |
[Python, 파이썬] Call by assignment, mutable, immutable, 파이썬 복사(Python Copy) (0) | 2021.03.27 |