Scrapy
是一个强大的 Python 网络爬虫框架,专门用于抓取网页数据。它不仅能够从网页提取信息,还能处理诸如网站导航、数据存储、网页请求等复杂任务。与其他爬虫库(如 BeautifulSoup
和 Requests
)相比,Scrapy
提供了更多的功能和灵活性,适用于大型和复杂的爬虫项目。
目录
1. Scrapy 概述
Scrapy
是一个功能齐全的框架,适用于开发用于数据采集的爬虫。它不仅仅是一个简单的爬虫库,它还包括以下特性:
- 异步处理:基于 Twisted 异步网络库,
Scrapy
可以高效地并发发送请求,处理大量网页数据。 - 数据清洗:内建支持提取数据并清洗,适合进行数据抓取后处理。
- 强大的选择器:内建 XPath 和 CSS 选择器,可以方便地提取网页数据。
- 扩展性:支持自定义中间件、扩展、管道和信号,便于扩展和优化爬虫功能。
- 支持不同输出格式:支持将抓取到的数据导出为 JSON、CSV、XML 等格式。
Scrapy 适合于中到大型的爬虫项目,并且提供了非常方便的框架来进行调试、扩展和维护。
2. 安装 Scrapy
首先,你需要安装 Scrapy
。你可以通过 pip
来安装:
pip install scrapy
由于 Scrapy
依赖 Twisted 库,安装时可能会遇到一些编译问题。可以参考 Scrapy 安装文档 获取更多帮助,尤其是在 Windows 环境下的安装。
3. Scrapy 项目结构
Scrapy 项目具有明确的结构,通常包含以下目录和文件:
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
example_spider.py
scrapy.cfg
:配置文件,指定项目的配置信息。items.py
:定义爬虫抓取的数据结构(字段)。middlewares.py
:自定义中间件,用于处理请求和响应。pipelines.py
:用于处理抓取的数据(如清洗、存储等)。settings.py
:项目配置文件,包含如并发请求数、下载延迟等设置。spiders/
:存放爬虫代码,爬虫文件通常包含在该目录下。
创建 Scrapy 项目
scrapy startproject myproject
该命令会创建一个新的 Scrapy 项目,并初始化项目目录结构。
4. 基本用法
4.1 编写爬虫
在 spiders/
目录下创建一个爬虫文件,例如 example_spider.py
。
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example'
start_urls = ['https://quotes.toscrape.com/']
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(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
name
:指定爬虫的名称,必须唯一。start_urls
:指定爬虫的起始 URL 列表。parse
:处理响应的回调函数,提取网页数据。
4.2 运行爬虫
在命令行中运行爬虫:
scrapy crawl example
你可以通过命令行选项将数据保存为 JSON、CSV 或 XML 格式:
scrapy crawl example -o quotes.json
5. 请求和响应处理
在 Scrapy 中,请求(Request)和响应(Response)是抓取过程中非常核心的部分。
5.1 发起请求
通过 scrapy.Request
类发起请求,并通过回调函数处理响应:
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example'
start_urls = ['https://quotes.toscrape.com/']
def parse(self, response):
next_page = response.css('li.next a::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
response.follow()
:用于处理相对 URL 并发起新的请求。
5.2 提交表单
通过 scrapy.FormRequest
提交表单:
import scrapy
class LoginSpider(scrapy.Spider):
name = 'login'
start_urls = ['http://example.com/login']
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'myusername', 'password': 'mypassword'},
callback=self.after_login
)
def after_login(self, response):
# 处理登录后的页面
pass
6. 数据提取和管道
Scrapy 提供了 items
和 pipelines
两个功能来进行数据提取和存储。
6.1 定义 Item
在 items.py
中定义抓取数据的结构:
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
6.2 使用 Pipelines
pipelines.py
中定义数据处理逻辑,如清洗数据、保存到数据库等。
class QuotePipeline:
def process_item(self, item, spider):
item['text'] = item['text'].strip()
return item
在 settings.py
中启用管道:
ITEM_PIPELINES = {
'myproject.pipelines.QuotePipeline': 1,
}
7. 参考资料
出站链接
站内链接
Scrapy
是一个非常强大且高效的爬虫框架,特别适用于处理大型爬虫项目。它不仅提供了强大的功能,还能够通过中间件、管道等机制灵活定制爬虫的各个方面。如果你需要开发一个高效、可维护的爬虫,Scrapy
是一个非常适合的工具。
发表回复