1.1 Scrapy 简介 Scrapy 基础领域 1.1 Scrapy 简介 Scrapy 是一个强大的 Python 爬虫框架,用于快速、高效地抓取网站数据。它提供了一整套工具和结构,使得开发者可以专注于数据提取和处理,而无需从头构建爬虫的所有组件。Scrapy 以其可扩展性、灵活性和易用性而闻名,被广泛应用于数据挖掘、信息监测、自动化测试等领域。 1.1.1 Scrapy 的核心组件 Scrapy 的架构基于 Twisted 异步网络框架,这使得它能够处理大量的并发请求,从而提高爬取速度。以下是 Scrapy 的核心组件: Scrapy Engine: 引擎是 Scrapy 的核心,负责控制数据流在各个组件之间的流动,并触发事件。
Scrapy 是一个强大的 Python 爬虫框架,用于快速、高效地抓取网站数据。它提供了一整套工具和结构,使得开发者可以专注于数据提取和处理,而无需从头构建爬虫的所有组件。Scrapy 以其可扩展性、灵活性和易用性而闻名,被广泛应用于数据挖掘、信息监测、自动化测试等领域。
1.1.1 Scrapy 的核心组件
Scrapy 的架构基于 Twisted 异步网络框架,这使得它能够处理大量的并发请求,从而提高爬取速度。以下是 Scrapy 的核心组件:
Scrapy Engine: 引擎是 Scrapy 的核心,负责控制数据流在各个组件之间的流动,并触发事件。
Scheduler: 调度器接收引擎发来的请求,并将它们放入队列中,以便稍后下载。
Downloader: 下载器负责下载网页内容。它从调度器获取请求,并使用下载中间件处理请求和响应。
Spiders: 蜘蛛是开发者编写的类,用于定义如何抓取特定的网站。蜘蛛负责解析网页内容,提取数据,并生成新的请求。
Item Pipeline: 项目管道负责处理蜘蛛提取的数据。它可以用于清洗、验证、存储数据,或者将数据导出到不同的格式。
Downloader Middlewares: 下载器中间件是位于引擎和下载器之间的钩子,用于处理请求和响应。它可以用于修改请求头、添加代理、处理重定向等。
Spider Middlewares: 蜘蛛中间件是位于引擎和蜘蛛之间的钩子,用于处理蜘蛛的输入和输出。它可以用于修改请求、过滤响应、处理异常等。
可以用 Mermaid 图表表示 Scrapy 的架构:
1.1.2 Scrapy 的工作流程
Scrapy 的工作流程如下:
引擎从蜘蛛获取初始请求。
引擎将请求发送给调度器。
调度器将请求放入队列中。
下载器从调度器获取请求,并下载网页内容。
下载器将响应发送给蜘蛛。
蜘蛛解析响应,提取数据,并生成新的请求。
引擎将提取的数据发送给项目管道。
项目管道处理数据,例如清洗、验证、存储等。
如果蜘蛛生成了新的请求,则重复步骤 2-8。
1.1.3 Scrapy 的优势
高效性: 基于 Twisted 异步网络框架,能够处理大量的并发请求。
可扩展性: 提供了中间件和管道等机制,方便开发者扩展功能。
灵活性: 可以自定义蜘蛛、中间件和管道,以满足不同的需求。
易用性: 提供了丰富的 API 和工具,方便开发者快速构建爬虫。
强大的选择器: 支持 CSS 选择器和 XPath 选择器,方便开发者提取数据。
自动处理 Cookies 和会话: 自动处理网站的 Cookies 和会话,方便开发者模拟用户行为。
支持多种数据格式: 支持 JSON、CSV、XML 等多种数据格式。
1.1.4 Scrapy 的应用场景
数据挖掘: 抓取网站数据,用于分析和挖掘。
信息监测: 监测网站内容的变化,例如新闻、价格、评论等。
自动化测试: 模拟用户行为,进行网站的自动化测试。
搜索引擎: 构建自己的搜索引擎。
价格比较: 抓取不同网站的价格,进行比较。
社交媒体分析: 抓取社交媒体数据,进行分析。
1.1.5 Scrapy 的安装
可以使用 pip 安装 Scrapy:
pip install scrapy
1.1.6 Scrapy 的基本使用
以下是一个简单的 Scrapy 爬虫示例,用于抓取 Quotes to Scrape 网站的名言:
创建 Scrapy 项目:
scrapy startproject quotes_spider
这会创建一个名为 quotes_spider 的目录,其中包含 Scrapy 项目的结构。
定义 Item:
在 quotes_spider/items.py 文件中定义 Item 类,用于存储抓取的数据:
import scrapy class QuotesSpiderItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field()
创建 Spider:
在 quotes_spider/spiders 目录下创建一个名为 quotes.py 的文件,并定义 Spider 类:
import scrapy from quotes_spider.items import QuotesSpiderItem class QuotesSpider(scrapy.Spider): name = "quotes" allowed_domains = ["quotes.toscrape.com"] start_urls = [ 'http://quotes.toscrape.com/page/1/', ] def parse(self, response): quotes = response.css('.quote') for quote in quotes: item = QuotesSpiderItem() item['text'] = quote.css('.text::text').get() item['author'] = quote.css('.author::text').get() item['tags'] = quote.css('.tag::text').getall() yield item next_page_url = response.css('.next a::attr(href)').get() if next_page_url: next_page_url = response.urljoin(next_page_url) yield scrapy.Request(next_page_url)
name: 蜘蛛的名称,用于标识蜘蛛。
allowed_domains: 允许抓取的域名,防止爬虫爬到其他网站。
start_urls: 初始 URL 列表,爬虫从这些 URL 开始抓取。
parse: 解析响应的回调函数,用于提取数据和生成新的请求。
运行 Spider:
在项目根目录下运行以下命令:
scrapy crawl quotes -o quotes.json
这会运行名为 quotes 的蜘蛛,并将抓取的数据保存到 quotes.json 文件中。
1.1.7 代码详解
scrapy.Item: scrapy.Item 是一个简单的容器,用于存储抓取的数据。它类似于 Python 的字典,但提供了更多的功能,例如类型检查和序列化。
scrapy.Field: scrapy.Field 用于定义 Item 中的字段。
scrapy.Spider: scrapy.Spider 是所有蜘蛛的基类。它定义了如何抓取特定的网站。
name: 蜘蛛的名称,用于标识蜘蛛。
allowed_domains: 允许抓取的域名,防止爬虫爬到其他网站。
start_urls: 初始 URL 列表,爬虫从这些 URL 开始抓取。
parse: 解析响应的回调函数,用于提取数据和生成新的请求。
response.css(): 使用 CSS 选择器提取数据。
response.xpath(): 使用 XPath 选择器提取数据。
::text: 提取元素的文本内容。
.get(): 获取第一个匹配的元素。
.getall(): 获取所有匹配的元素。
response.urljoin(): 将相对 URL 转换为绝对 URL。
scrapy.Request(): 创建一个新的请求。
yield: 将 Item 或 Request 发送给 Scrapy 引擎。
1.1.8 Item Pipeline 的使用
可以在 quotes_spider/pipelines.py 文件中定义 Item Pipeline 类,用于处理抓取的数据。例如,可以创建一个 Item Pipeline,用于清洗数据:
class QuotesSpiderPipeline: def process_item(self, item, spider): item['text'] = item['text'].strip() item['author'] = item['author'].strip() return item
要在 Scrapy 中启用 Item Pipeline,需要在 quotes_spider/settings.py 文件中配置 ITEM_PIPELINES:
ITEM_PIPELINES = { 'quotes_spider.pipelines.QuotesSpiderPipeline': 300, }
1.1.9 Downloader Middlewares 的使用
可以创建 Downloader Middlewares,用于处理请求和响应。例如,可以创建一个 Downloader Middleware,用于添加 User-Agent:
class UserAgentMiddleware: def process_request(self, request, spider): request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
要在 Scrapy 中启用 Downloader Middleware,需要在 quotes_spider/settings.py 文件中配置 DOWNLOADER_MIDDLEWARES:
DOWNLOADER_MIDDLEWARES = { 'quotes_spider.middlewares.UserAgentMiddleware': 543, }
1.1.10 Spider Middlewares 的使用
可以创建 Spider Middlewares,用于处理蜘蛛的输入和输出。例如,可以创建一个 Spider Middleware,用于过滤响应:
class FilterResponseMiddleware: def process_spider_output(self, response, result, spider): for item in result: if 'example' in item['text']: continue yield item
要在 Scrapy 中启用 Spider Middleware,需要在 quotes_spider/settings.py 文件中配置 SPIDER_MIDDLEWARES:
SPIDER_MIDDLEWARES = { 'quotes_spider.middlewares.FilterResponseMiddleware': 543, }
1.1.11 Scrapy 常用命令
scrapy startproject <project_name>: 创建一个新的 Scrapy 项目。
scrapy genspider <spider_name> <domain>: 创建一个新的蜘蛛。
scrapy crawl <spider_name>: 运行指定的蜘蛛。
scrapy shell <url>: 进入 Scrapy shell,用于调试和测试选择器。
scrapy list: 列出所有可用的蜘蛛。
scrapy version: 显示 Scrapy 版本。
1.1.12 总结
Scrapy 是一个功能强大的 Python 爬虫框架,提供了丰富的功能和工具,方便开发者快速构建爬虫。通过学习 Scrapy 的核心组件、工作流程和基本使用,可以掌握 Scrapy 的基本原理和使用方法,从而能够使用 Scrapy 抓取网站数据。 通过灵活运用 Item Pipeline、Downloader Middlewares 和 Spider Middlewares,可以定制 Scrapy 的功能,以满足不同的需求。