Python爬虫系列教程之第十一篇:Scrapy框架实战
大家好,欢迎继续关注本系列爬虫教程!本篇博客将为大家介绍如何使用 Scrapy 框架构建一个高效、可扩展的爬虫项目。Scrapy 是一个功能强大的爬虫框架,它内置了许多优秀的特性,如异步请求、内置中间件、Item 管道等,非常适合用于大规模数据采集和项目维护。
在本文中,我们将以抓取 Quotes to Scrape 网站为例,详细讲解如何从创建项目、定义数据结构、编写爬虫、数据清洗到数据存储的全过程,并附上详细的代码及中文注释,帮助你快速掌握 Scrapy 的使用方法。
1. Scrapy框架简介
Scrapy 是一个开源的、基于 Python 的爬虫框架,主要特点包括:
- 高性能:基于异步 I/O 实现,能够高效抓取海量数据。
- 模块化设计:项目结构清晰,便于扩展和维护。
- 内置多种组件:支持中间件、管道、调度器等,满足复杂爬虫项目的需求。
2. 环境准备与项目创建
2.1 安装Scrapy
首先,通过 pip 安装 Scrapy:
pip install scrapy
2.2 创建Scrapy项目
在命令行中执行以下命令创建一个新的 Scrapy 项目(项目名称这里取为 myproject
):
scrapy startproject myproject
项目目录结构如下:
myproject/
│ scrapy.cfg
└───myproject/
│ __init__.py
│ items.py # 定义数据结构
│ middlewares.py
│ pipelines.py # 数据处理与存储
│ settings.py # 项目配置
└───spiders/
│ __init__.py
│ quotes_spider.py # 爬虫代码
3. 编写Scrapy爬虫
3.1 定义数据结构(items.py)
在 myproject/items.py
中定义我们要抓取的数据结构,本例中抓取“名言”的文本、作者及标签:
import scrapy
class QuoteItem(scrapy.Item):
# 定义抓取的字段
text = scrapy.Field() # 名言文本
author = scrapy.Field() # 作者
tags = scrapy.Field() # 标签列表
3.2 编写爬虫代码(spiders/quotes_spider.py)
在 myproject/spiders/quotes_spider.py
中编写爬虫代码,抓取 Quotes to Scrape 网站的内容:
import scrapy
from myproject.items import QuoteItem # 导入定义好的数据结构
class QuotesSpider(scrapy.Spider):
name = "quotes" # 定义爬虫名称,在运行时使用
allowed_domains = ["quotes.toscrape.com"] # 允许抓取的域名
start_urls = [
"http://quotes.toscrape.com/" # 初始请求的URL
]
def parse(self, response):
"""
解析网页内容,提取名言信息并处理翻页
"""
# 遍历页面中所有包含名言信息的块
for quote in response.css("div.quote"):
item = QuoteItem() # 创建一个数据项对象
# 提取名言文本,使用 CSS 选择器
item["text"] = quote.css("span.text::text").get()
# 提取作者信息
item["author"] = quote.css("small.author::text").get()
# 提取标签列表
item["tags"] = quote.css("div.tags a.tag::text").getall()
yield item # 生成数据项,交由管道处理
# 处理翻页,提取下一页链接
next_page = response.css("li.next a::attr(href)").get()
if next_page:
# 将相对URL转换为绝对URL
next_page = response.urljoin(next_page)
# 递归调用parse方法继续抓取下一页
yield scrapy.Request(url=next_page, callback=self.parse)
4. 数据存储与Item Pipeline
为了将抓取的数据进行存储,我们可以使用 Scrapy 的 Item Pipeline。这里我们以将数据存储到 JSON 文件为例。
4.1 编写Pipeline(pipelines.py)
在 myproject/pipelines.py
中编写如下代码:
import json
class MyProjectPipeline:
def open_spider(self, spider):
"""
爬虫启动时调用,打开数据存储文件
"""
self.file = open("quotes.json", "w", encoding="utf-8")
def close_spider(self, spider):
"""
爬虫关闭时调用,关闭文件
"""
self.file.close()
def process_item(self, item, spider):
"""
处理每个数据项,将其写入JSON文件
"""
# 将Item转换为字典,并转换为JSON字符串
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
4.2 启用Pipeline
在 myproject/settings.py
中启用我们定义的 Pipeline,添加或修改如下配置:
ITEM_PIPELINES = {
'myproject.pipelines.MyProjectPipeline': 300,
}
数字 300
表示该 Pipeline 的执行顺序,数字越小越先执行。
5. 运行爬虫
在项目根目录下打开命令行,执行以下命令启动爬虫:
scrapy crawl quotes
运行成功后,爬虫会依次抓取 Quotes to Scrape 网站的所有页面,并将抓取的数据存储到项目根目录下的 quotes.json
文件中。你可以打开该文件查看抓取结果,每行代表一条 JSON 格式的名言数据。
6. 小结
在本篇博客中,我们介绍了如何使用 Scrapy 框架构建一个完整的爬虫项目,具体内容包括:
- 项目创建:使用
scrapy startproject
命令快速生成项目结构。 - 定义数据结构:在
items.py
中定义抓取的数据字段。 - 编写爬虫:在
spiders/quotes_spider.py
中编写爬虫代码,使用 CSS 选择器提取数据,并处理翻页逻辑。 - 数据存储:通过自定义 Pipeline 将数据存储到 JSON 文件中,并在
settings.py
中启用 Pipeline。 - 运行爬虫:使用
scrapy crawl
命令启动爬虫,完成数据抓取与存储。
Scrapy 强大的框架特性使得爬虫项目的开发、维护和扩展变得更加高效。希望本篇博客能帮助你快速上手 Scrapy,构建自己的高效爬虫项目。如果你有任何问题或建议,欢迎在评论区留言讨论!别忘了点赞、收藏并分享给需要的朋友,我们下篇博客再见!