目录
1 Scrapy 的简介
2 Scrapy选择器
3 快速创建Scrapy 爬虫
4 下载器与爬虫中间件
5 使用管道Pielines
Scrapy 是一个用于爬取网站数据并进行数据提取的开源网络爬虫框架。它使用 Python 编程语言编写,并提供了一套强大的工具和库,帮助用户在网页上浏览和抓取数据。Scrapy 旨在简化爬虫开发流程,提供了高度可定制的机制来处理各种网站的数据抓取需求。
以下是 Scrapy 框架的一些主要特点和组件:
请求和响应管理: Scrapy 提供了一个异步的请求和响应管理系统,允许用户发出 HTTP 请求并处理返回的 HTML 或其他数据。
数据提取: Scrapy 使用基于 XPath 或 CSS 选择器的数据提取方法,使用户能够方便地从网页中提取所需数据。
中间件: Scrapy 允许用户定义中间件来自定义请求和响应的处理过程,例如修改请求头、处理代理等。
管道: 管道是 Scrapy 中用于处理数据的组件,您可以在管道中对抓取到的数据进行清洗、处理、存储等操作。
调度器: 调度器负责管理请求的发送顺序,以及处理并发请求的方式,确保爬虫在合理的速率下访问网站。
自动限速: Scrapy 自带自动限速功能,以避免对目标网站造成过多负担。
异步支持: Scrapy 支持异步处理,能够高效地执行多个请求和处理操作。
扩展性: 您可以根据需要编写扩展来定制 Scrapy 的行为,如添加新的中间件、管道等。
命令行工具: Scrapy 提供了命令行工具,方便用户创建、管理和运行爬虫。
文档丰富: Scrapy 提供详细的官方文档和教程,使新用户能够快速入门,并且为高级用户提供深入了解框架的资源。
总之,Scrapy 是一个功能强大且高度可定制的网络爬虫框架,适用于各种规模的数据抓取项目,从简单的数据收集任务到复杂的数据挖掘和分析。无论您是初学者还是有经验的开发人员,都可以利用 Scrapy 快速有效地构建和管理爬虫。
Scrapy 提供了两种主要的选择器用于从网页中提取数据:基于 XPath 的选择器和基于 CSS 的选择器。这两种选择器都能够让您轻松地从 HTML 或 XML 文档中定位和提取所需的数据。
基于 XPath 的选择器: XPath(XML Path Language)是一种用于在 XML 文档中定位元素的语言。在 Scrapy 中,XPath 选择器允许您通过路径表达式来选择和提取数据。以下是一些常见的 XPath 表达式示例:
- 选择元素:
//elementName
(选取所有名称为 elementName 的元素)- 选择特定路径下的元素:
//parent/child
(选取 parent 元素下的所有 child 元素)- 选择具有特定属性的元素:
//element[@attribute='value']
(选取具有 attribute 属性且值为 value 的元素)基于 CSS 的选择器: CSS(Cascading Style Sheets)选择器在网页设计中常用于样式设置,但它们也可以用于从 HTML 文档中选择元素。Scrapy 中的 CSS 选择器允许您使用类似于 CSS 选择器的语法来定位和提取数据。以下是一些常见的 CSS 选择器示例:
- 选择元素:
elementName
(选取所有名称为 elementName 的元素)- 选择类:
.className
(选取所有具有 className 类的元素)- 选择 ID:
#idName
(选取具有 idName ID 的元素)- 选择路径下的元素:
parent > child
(选取 parent 元素下的所有 child 元素)
在 Scrapy 中,您可以使用这些选择器来定位和提取网页中的数据。以下是使用 Scrapy 选择器的示例代码:
from scrapy.selector import Selector
html_content = """
Title
Paragraph 1
Paragraph 2
"""
selector = Selector(text=html_content)
# 使用 XPath 选择器提取数据
title = selector.xpath("//h1/text()").get()
paragraphs = selector.xpath("//p/text()").getall()
# 使用 CSS 选择器提取数据
title = selector.css("h1::text").get()
paragraphs = selector.css("p::text").getall()
无论您选择使用 XPath 还是 CSS 选择器,Scrapy 都提供了方便的方法来从网页中提取所需的数据,使数据抓取任务变得更加简单和高效。
创建一个简单的 Scrapy 爬虫可以分为以下几个步骤。以下示例将引导您创建一个爬取名言的简单爬虫。
pip install scrapy
创建新的 Scrapy 项目: 在命令行中,导航到您希望创建项目的目录,并运行以下命令来创建新的 Scrapy 项目:
scrapy startproject quotes_spider
这将在当前目录下创建一个名为 "quotes_spider" 的项目目录。
(1)创建爬虫: 在项目目录下,进入到 "quotes_spider" 目录,并运行以下命令来创建一个爬虫:
cd quotes_spider
scrapy genspider quotes quotes.toscrape.com
这将创建一个名为 "quotes" 的爬虫,它将从 "quotes.toscrape.com" 网站爬取数据。
(2)编辑爬虫代码: 在 "quotes_spider/spiders" 目录下找到名为 "quotes.py" 的文件,这是刚刚创建的爬虫文件。使用您喜欢的编辑器打开该文件,并编辑 start_urls
和 parse
方法:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('span small::text').get(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
在这个示例爬虫中,我们从名言网站爬取名言文本和作者信息。parse
方法负责从网页中提取数据,并通过使用 response.follow
方法来跟踪下一页链接。
(3)运行爬虫: 回到项目目录("quotes_spider" 目录)并运行以下命令来运行爬虫:
scrapy crawl quotes
爬虫将开始访问起始 URL,抓取数据并显示在终端上。
这是一个简单的 Scrapy 爬虫创建过程示例。实际上,您可以根据需要定制爬虫的各个方面,包括请求头、管道、中间件等。通过阅读 Scrapy 的官方文档,您可以深入了解如何创建更复杂和定制的爬虫。
在 Scrapy 框架中,下载器中间件和爬虫中间件是两种不同类型的中间件,用于在请求/响应的处理流程中插入自定义的逻辑。它们分别位于请求的发送和响应的接收过程中,允许您对网络请求和数据处理进行修改和控制。
下载器中间件(Downloader Middleware): 下载器中间件位于请求发送过程中,负责对请求进行处理,以及在响应返回之前的操作。这些中间件可以用于修改请求头、设置代理、处理cookies等。下载器中间件可以在全局范围或特定爬虫范围内进行配置。
一些常见的下载器中间件操作包括:
- 修改请求头,以模拟不同类型的浏览器请求。
- 配置代理服务器,用于隐藏爬虫的真实 IP 地址。
- 处理 cookies,以保持会话状态。
- 对请求进行重试和错误处理。
- 控制请求的并发性。
爬虫中间件(Spider Middleware): 爬虫中间件位于响应接收和数据处理过程中,负责对响应和提取的数据进行处理。这些中间件可以用于修改爬取到的数据、处理异常、进行数据转换等。爬虫中间件可以在全局范围或特定爬虫范围内进行配置。
一些常见的爬虫中间件操作包括:
- 对从网页中提取的数据进行预处理和清洗。
- 自定义数据转换,如日期格式化、文本处理等。
- 处理异常,如被封 IP 的处理策略。
- 控制数据的流向和过滤。
配置中间件在 Scrapy 的 settings.py
文件中进行。您可以为每个中间件设置优先级,以确定它们在处理流程中的顺序。更具体地说,下载器中间件的优先级较高的将首先处理请求,而爬虫中间件的优先级较高的将首先处理响应和提取的数据。
以下是一个简单的示例,展示了如何配置下载器和爬虫中间件:
# settings.py
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyDownloaderMiddleware': 543,
}
SPIDER_MIDDLEWARES = {
'myproject.middlewares.MySpiderMiddleware': 543,
}
在上面的示例中,
myproject.middlewares.MyDownloaderMiddleware
和myproject.middlewares.MySpiderMiddleware
分别是自定义的下载器和爬虫中间件。它们的优先级设置为 543。通过使用下载器和爬虫中间件,您可以在请求和响应的处理流程中插入自定义的逻辑,实现更灵活、高效和符合您需求的爬虫。
在 Scrapy 中,管道(Pipeline)是用于处理爬虫抓取到的数据的组件。它允许您在数据从爬虫抓取到最终保存或处理的过程中进行多个操作,如数据清洗、验证、存储到数据库、导出到文件等。Scrapy 的管道提供了一种灵活且可定制的方式来处理爬取的数据流。
以下是如何使用管道来处理爬取到的数据:
(1)启用管道: 在 Scrapy 的配置文件(settings.py
)中,您需要启用并配置管道。您可以在 ITEM_PIPELINES
设置中指定要使用的管道类及其优先级。优先级是一个整数值,较小的值表示较高的优先级。
# settings.py
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 300,
}
在上面的示例中,myproject.pipelines.MyPipeline
是您自定义的管道类,优先级被设置为 300。
(2)创建管道类: 在项目中创建一个管道类,该类将处理爬虫抓取到的数据。您需要实现一些方法来处理数据,例如 process_item
方法。
# pipelines.py
class MyPipeline:
def process_item(self, item, spider):
# 在这里处理数据,可以进行清洗、验证、存储等操作
return item
在上面的示例中,process_item
方法接收两个参数:item
表示爬虫抓取到的数据项,spider
表示当前爬虫实例。
(3)处理数据: 在管道类的 process_item
方法中,您可以对数据进行各种操作,如数据清洗、格式化、验证等。您还可以将数据保存到数据库、导出到文件等。
以下是一个简单的示例,展示了如何在管道中处理爬取到的数据并保存到 JSON 文件中:
# pipelines.py
import json
class MyPipeline:
def open_spider(self, spider):
self.file = open('data.json', 'w')
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
data = {
'text': item['text'],
'author': item['author']
}
json.dump(data, self.file)
self.file.write('\n')
return item
在上面的示例中,
open_spider
和close_spider
方法在爬虫开始和结束时分别被调用,打开和关闭数据文件。process_item
方法将数据提取并保存到 JSON 文件中。通过配置和编写自定义的管道类,您可以对爬取到的数据进行各种操作,从而实现高度定制化的数据处理流程。