Scrapy 프레임워크는 데이터를 크롤링하는 애플리케이션을 만들고 관리하는 데 사용할 수 있는 오픈 소스 Python 크롤러 프레임워크이며 현재 시장에서 가장 인기 있는 크롤러 프레임워크 중 하나입니다. Scrapy 프레임워크는 네트워크 요청에 비동기 IO를 사용하므로 웹사이트 데이터를 효율적으로 캡처할 수 있으며 확장성과 안정성이라는 장점이 있습니다.
이 글에서는 Scrapy 프레임워크의 특징과 장점을 심층적으로 분석하고, 구체적인 코드 예제를 통해 Scrapy 프레임워크의 효율적이고 안정적인 작동을 설명합니다.
Scrapy 프레임워크는 배우기 쉽고 진입 장벽이 낮은 Python 언어를 사용합니다. 동시에 사용자가 빠르게 시작할 수 있도록 완전한 문서와 샘플 코드도 제공합니다. 다음은 Zhihu에서 인기 있는 질문의 제목과 링크를 얻는 데 사용할 수 있는 간단한 Scrapy 크롤러 예입니다.
import scrapy class ZhihuSpider(scrapy.Spider): name = "zhihu" # 爬虫名 start_urls = [ 'https://www.zhihu.com/hot' ] # 起始网站链接 def parse(self, response): for question in response.css('.HotItem'): yield { 'title': question.css('h2::text').get(), 'link': question.css('a::attr(href)').get() }
위 코드에서 "zhihu"라는 크롤러 프로그램은 scrapy.Spider 클래스를 상속하여 정의됩니다. start_urls 속성은 클래스에 정의되며 크롤링할 웹사이트 링크는 목록에 지정됩니다. 응답을 구문 분석하고 CSS 선택기를 통해 인기 있는 질문의 제목과 링크를 얻은 다음 결과를 사전 산출물로 반환하도록 구문 분석() 메서드가 정의됩니다.
Scrapy 프레임워크는 네트워크 요청에 비동기 IO를 사용하여 동시에 여러 비동기 요청을 보내고 모든 응답을 즉시 반환할 수 있습니다. 이 방법은 크롤러의 속도와 효율성을 크게 향상시킵니다. 다음은 간단한 Scrapy 비동기 요청 코드 예시입니다.
import asyncio import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): urls = [ 'https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com' ] tasks = [] for url in urls: tasks.append(asyncio.ensure_future(fetch(url))) responses = await asyncio.gather(*tasks) print(responses) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
위 코드에서 비동기 요청 메서드는 asyncio 라이브러리와 aiohttp 라이브러리를 통해 구현됩니다. 요청 전송을 위해 fetch() 비동기 함수가 정의되고 aiohttp 라이브러리는 비동기 HTTP 클라이언트를 구현하는 데 사용됩니다. URL을 처리하기 위해 main() 비동기 함수가 정의되고, fetch()가 반환한 Future 객체가 작업 목록에 추가되며, 마지막으로 asyncio.gather() 함수를 사용하여 모든 작업의 반환 결과를 얻습니다.
Scrapy 프레임워크는 풍부한 확장 인터페이스 및 플러그인 세트를 제공합니다. 사용자는 사용자 정의 미들웨어, 파이프라인, 다운로더 등을 쉽게 추가하여 기능과 성능을 확장할 수 있습니다. 다음은 간단한 Scrapy 미들웨어의 예입니다.
from scrapy import signals class MyMiddleware: @classmethod def from_crawler(cls, crawler): o = cls() crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) crawler.signals.connect(o.spider_closed, signal=signals.spider_closed) return o def spider_opened(self, spider): spider.logger.info('常规中间件打开: %s', spider.name) def spider_closed(self, spider): spider.logger.info('常规中间件关闭: %s', spider.name) def process_request(self, request, spider): spider.logger.info('常规中间件请求: %s %s', request.method, request.url) return None def process_response(self, request, response, spider): spider.logger.info('常规中间件响应: %s %s', str(response.status), response.url) return response def process_exception(self, request, exception, spider): spider.logger.error('常规中间件异常: %s %s', exception, request.url) return None
위 코드에는 MyMiddleware 미들웨어 클래스가 정의되어 있습니다. 크롤러 프로그램의 신호 연결을 처리하기 위해 특별한 from_crawler() 함수가 클래스에 정의되어 있습니다. spider_opened() 및 spider_closed() 함수는 크롤러의 열기 및 닫기 신호를 처리하도록 정의됩니다. process_request() 및 process_response() 함수는 요청 및 응답 신호를 처리하기 위해 정의됩니다. process_Exception() 함수는 예외 정보를 처리하기 위해 정의됩니다.
Scrapy 프레임워크는 구성 및 조정이 가능하며 사용자 요구에 따라 크롤러 세부 정보를 조정할 수 있으므로 Scrapy 프레임워크 크롤러의 안정성과 견고성이 향상됩니다. 다음은 Scrapy 다운로드 지연 및 시간 초과 구성의 예입니다.
DOWNLOAD_DELAY = 3 DOWNLOAD_TIMEOUT = 5
위 코드에서 DOWNLOAD_DELAY 매개변수를 3으로 설정하면 두 다운로드 사이에 3초를 기다려야 한다는 의미입니다. DOWNLOAD_TIMEOUT 매개변수를 5로 설정하면 5초 이내에 응답이 수신되지 않으면 시간 초과되어 종료된다는 의미입니다.
요약
Scrapy 프레임워크는 쉬운 학습, 비동기식 IO, 확장성 및 안정성의 장점을 갖춘 효율적이고 확장 가능하며 안정적인 Python 크롤러 프레임워크입니다. 이 기사에서는 구체적인 코드 예제를 통해 Scrapy 프레임워크의 주요 기능과 장점을 소개합니다. 효율적이고 안정적인 크롤러 애플리케이션을 개발하려는 사용자에게는 Scrapy 프레임워크가 의심할 여지 없이 좋은 선택입니다.
위 내용은 Scrapy 프레임워크의 특징과 장점에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!