首页
/ 2025爬虫入门实战:从0到1精通Scrapy框架,30分钟快速抓取网络数据

2025爬虫入门实战:从0到1精通Scrapy框架,30分钟快速抓取网络数据

2026-01-19 10:49:27作者:翟萌耘Ralph

你是否曾因不懂编程而无法获取所需数据?是否尝试过手动复制粘贴却效率低下?本文将通过实战案例,带你从零开始掌握Scrapy框架,轻松实现自动化数据抓取。读完本文,你将能够:

  • 理解网络爬虫(Web Crawler)的基本原理和工作流程
  • 熟练配置和使用Scrapy框架的核心组件
  • 掌握CSS选择器和XPath表达式两种数据提取方法
  • 编写可扩展的爬虫程序并存储结构化数据
  • 解决实际爬取过程中的常见问题

1. 为什么选择Scrapy框架?

Scrapy是一个用Python编写的开源网络爬虫框架(Framework),专为高效提取网站数据而设计。相比其他爬虫工具,它具有以下优势:

特性 Scrapy 传统Requests+BeautifulSoup Selenium
并发处理 内置异步处理,高效爬取 需要手动实现并发 模拟浏览器,性能较低
数据提取 支持CSS和XPath选择器 需手动解析 支持定位元素,但较繁琐
扩展性 丰富的中间件和插件 需自行开发 有限的扩展能力
数据存储 内置多种输出格式 需手动实现 需手动实现
反爬机制 可配置User-Agent、代理等 需手动设置 模拟真实用户行为

2. 环境准备与项目搭建

2.1 安装Scrapy

在开始之前,确保你的系统已安装Python环境。通过以下命令安装Scrapy:

pip install scrapy

2.2 获取项目代码

使用以下命令克隆项目仓库:

git clone https://gitcode.com/gh_mirrors/qu/quotesbot
cd quotesbot

2.3 项目结构解析

项目的目录结构如下:

quotesbot/
├── LICENSE
├── README.md
├── quotesbot/
│   ├── __init__.py
│   ├── items.py         # 定义数据结构
│   ├── pipelines.py     # 数据处理管道
│   ├── settings.py      # 项目配置
│   └── spiders/         # 爬虫程序目录
│       ├── __init__.py
│       ├── toscrape-css.py  # 使用CSS选择器的爬虫
│       └── toscrape-xpath.py  # 使用XPath的爬虫
└── scrapy.cfg           # Scrapy配置文件

3. 核心组件详解

3.1 Items(数据结构)

items.py文件定义了要抓取的数据结构,类似于数据库表结构:

import scrapy

class QuotesbotItem(scrapy.Item):
    # 定义要抓取的字段
    text = scrapy.Field()    # 名言文本
    author = scrapy.Field()  # 作者
    tags = scrapy.Field()    # 标签

3.2 Spiders(爬虫程序)

Spiders是Scrapy的核心,负责定义爬取规则和数据提取方式。项目中提供了两个爬虫示例,分别使用CSS选择器和XPath表达式。

3.3 Settings(配置文件)

settings.py包含了项目的各种配置选项,如爬虫名称、并发请求数、下载延迟等:

BOT_NAME = 'quotesbot'
SPIDER_MODULES = ['quotesbot.spiders']
NEWSPIDER_MODULE = 'quotesbot.spiders'

# 遵守robots.txt规则
ROBOTSTXT_OBEY = True

# 并发请求数
#CONCURRENT_REQUESTS = 32

# 下载延迟(秒)
#DOWNLOAD_DELAY = 3

3.4 Pipelines(数据管道)

Pipelines用于处理抓取到的数据,如验证、清洗、存储等。默认配置下未启用,如需使用可在settings.py中取消注释:

#ITEM_PIPELINES = {
#    'quotesbot.pipelines.SomePipeline': 300,
#}

4. CSS选择器爬虫实战

4.1 爬虫代码解析

toscrape-css.py使用CSS选择器提取数据:

import scrapy

class ToScrapeCSSSpider(scrapy.Spider):
    name = "toscrape-css"  # 爬虫名称,必须唯一
    start_urls = [
        'http://quotes.toscrape.com/',  # 起始URL
    ]

    def parse(self, response):
        # 提取所有名言区块
        for quote in response.css("div.quote"):
            # 生成数据字典
            yield {
                'text': quote.css("span.text::text").extract_first(),
                'author': quote.css("small.author::text").extract_first(),
                'tags': quote.css("div.tags > a.tag::text").extract()
            }

        # 提取下一页链接
        next_page_url = response.css("li.next > a::attr(href)").extract_first()
        if next_page_url is not None:
            # 递归爬取下一页
            yield scrapy.Request(response.urljoin(next_page_url))

4.2 CSS选择器语法

CSS选择器是一种用于选择HTML元素的模式,常用语法如下:

选择器 描述 示例
element 选择指定元素 div 选择所有div元素
.class 选择指定类 .quote 选择类为quote的元素
#id 选择指定ID #author 选择ID为author的元素
element > element 选择直接子元素 div > a 选择div的直接子元素a
element element 选择后代元素 div a 选择div内的所有a元素
[attribute] 选择带指定属性的元素 [href] 选择所有带href属性的元素

4.3 运行爬虫

使用以下命令运行CSS选择器爬虫:

scrapy crawl toscrape-css

如需将结果保存到文件,可使用-o参数:

scrapy crawl toscrape-css -o quotes.json

5. XPath爬虫实战

5.1 爬虫代码解析

toscrape-xpath.py使用XPath表达式提取数据:

import scrapy

class ToScrapeSpiderXPath(scrapy.Spider):
    name = 'toscrape-xpath'
    start_urls = [
        'http://quotes.toscrape.com/',
    ]

    def parse(self, response):
        # 使用XPath选择所有名言区块
        for quote in response.xpath('//div[@class="quote"]'):
            yield {
                'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
                'author': quote.xpath('.//small[@class="author"]/text()').extract_first(),
                'tags': quote.xpath('.//div[@class="tags"]/a[@class="tag"]/text()').extract()
            }

        # 提取下一页链接
        next_page_url = response.xpath('//li[@class="next"]/a/@href').extract_first()
        if next_page_url is not None:
            yield scrapy.Request(response.urljoin(next_page_url))

5.2 XPath语法基础

XPath(XML Path Language)是一种在XML文档中查找信息的语言,也适用于HTML。常用语法:

表达式 描述 示例
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 //div 选择所有div元素
/ 从根节点选取 /html/body 选择body元素
. 选取当前节点 ./span 选择当前节点的span子元素
.. 选取当前节点的父节点 ../div 选择当前节点的父节点下的div
@ 选取属性 @class 选择class属性
[@attribute='value'] 选取具有指定属性值的元素 //div[@class='quote'] 选择class为quote的div

5.3 CSS vs XPath:如何选择?

两种选择器各有优势,选择建议:

  • 简单提取:优先使用CSS,语法更简洁
  • 复杂条件:XPath更强大,支持更多条件表达式
  • 位置选择:XPath支持按位置选择元素(如第n个元素)
  • 属性操作:XPath支持更复杂的属性匹配

6. 数据存储与格式转换

Scrapy支持多种数据输出格式,常用的有:

6.1 JSON格式

scrapy crawl toscrape-css -o quotes.json

生成的JSON文件内容示例:

[
{"author": "Albert Einstein", "text": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"author": "J.K. Rowling", "text": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", "tags": ["abilities", "choices"]}
]

6.2 CSV格式(适合Excel)

scrapy crawl toscrape-css -o quotes.csv

6.3 XML格式

scrapy crawl toscrape-css -o quotes.xml

7. 高级配置与优化

7.1 设置下载延迟

为避免对目标网站造成过大压力,可在settings.py中设置下载延迟:

DOWNLOAD_DELAY = 3  # 单位:秒

7.2 自定义User-Agent

有些网站会阻止默认的Scrapy User-Agent,可在settings.py中修改:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

7.3 启用自动限速

Scrapy的AutoThrottle扩展可根据网站响应速度自动调整爬取速度:

AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60

8. 常见问题与解决方案

8.1 爬虫无法启动

问题:执行scrapy crawl命令后无反应或报错。

解决方案

  • 检查Python环境是否正常
  • 确认Scrapy已正确安装:scrapy --version
  • 检查当前目录是否在项目根目录下

8.2 提取数据为空

问题:爬虫运行正常,但未提取到任何数据。

解决方案

  • 使用Scrapy Shell测试选择器:scrapy shell "http://quotes.toscrape.com"
  • 检查网页结构是否有变化
  • 确认选择器语法是否正确
# 在Scrapy Shell中测试选择器
scrapy shell "http://quotes.toscrape.com"
response.css("div.quote span.text::text").extract_first()

8.3 爬取速度过慢

解决方案

  • 调整并发请求数:CONCURRENT_REQUESTS = 32
  • 减少下载延迟:DOWNLOAD_DELAY = 1
  • 启用HTTP缓存:
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 3600  # 缓存有效期1小时

9. 扩展学习与实践建议

9.1 学习路径图

timeline
    title Scrapy学习路径
    2025-09-10, 基础阶段 : Python基础 -> Scrapy安装 -> 运行示例爬虫
    2025-09-17, 进阶阶段 : CSS/XPath选择器 -> 自定义Item -> 数据存储
    2025-09-24, 高级阶段 : 中间件开发 -> 分布式爬取 -> 反爬策略
    2025-10-01, 实战阶段 : 电商数据爬取 -> 新闻聚合 -> 数据分析应用

9.2 练习项目

  1. 修改现有爬虫,增加抓取作者的出生日期和简介
  2. 实现一个爬取豆瓣电影Top250的爬虫
  3. 开发一个监控特定网站更新的爬虫,并发送邮件通知

10. 总结与展望

通过本文的学习,你已经掌握了Scrapy框架的基本使用方法,包括环境搭建、爬虫编写、数据提取和存储等核心技能。Scrapy作为一个强大的爬虫框架,还有更多高级特性值得探索,如:

  • 分布式爬取(Scrapy-Redis)
  • 动态网页爬取(结合Splash)
  • 爬虫监控与调度
  • 大规模数据处理

希望这篇教程能帮助你开启网络爬虫的学习之旅。记住,爬虫的使用应遵守网站的robots协议和相关法律法规,尊重网站的知识产权和使用政策。

登录后查看全文
热门项目推荐
相关项目推荐