首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >实战:用Scrapy框架搭建第一个爬虫项目

实战:用Scrapy框架搭建第一个爬虫项目

原创
作者头像
富贵软件
发布2025-09-29 11:26:12
发布2025-09-29 11:26:12
15000
代码可运行
举报
文章被收录于专栏:编程教程编程教程
运行总次数:0
代码可运行

​免费编程软件「python+pycharm」

链接:https://pan.quark.cn/s/48a86be2fdc0

引言:Scrapy框架的核心价值

Scrapy是Python生态中针对网络爬虫优化的高性能框架,其设计核心在于通过“引擎-调度器-下载器-爬虫-管道”的协作模式,实现从页面抓取、数据解析到持久化的全流程自动化。相比传统requests+BeautifulSoup的组合,Scrapy内置了请求队列管理、自动重试、中间件扩展等关键功能,特别适合需要处理大规模数据抓取的场景。本文将以实战为导向,通过抓取“名人名言”网站(quotes.toscrape.com)的完整流程,详细拆解Scrapy的每个核心组件及其协作逻辑。

环境准备:从安装到验证

1.1 安装依赖

通过pip安装Scrapy框架(推荐Python 3.6+环境):

代码语言:javascript
代码运行次数:0
运行
复制
pip install scrapy
代码语言:javascript
代码运行次数:0
运行
复制
验证安装成功可通过终端执行:
代码语言:javascript
代码运行次数:0
运行
复制
scrapy version
代码语言:javascript
代码运行次数:0
运行
复制
若输出类似 Scrapy 2.11.1的版本信息即表示安装完成。Windows用户若遇 win32api 模块缺失错误,需额外安装pypiwin32包。

1.2 项目初始化

在目标目录执行创建命令:

代码语言:javascript
代码运行次数:0
运行
复制
scrapy startproject quotes_project
代码语言:javascript
代码运行次数:0
运行
复制
生成的项目结构包含:
  • scrapy.cfg:项目配置文件,定义部署参数
  • quotes_project/:主代码目录,包含:
    • items.py:数据结构模板
    • pipelines.py:数据处理管道
    • settings.py:全局配置
    • spiders/:爬虫代码存放目录

核心组件详解与实战编码

2.1 定义数据结构(Items)

items.py中定义抓取目标字段,例如:

代码语言:javascript
代码运行次数:0
运行
复制
import scrapy

class QuoteItem(scrapy.Item):
    text = scrapy.Field()      # 名言文本
    author = scrapy.Field()    # 作者
    tags = scrapy.Field()      # 标签列表

2.2 编写爬虫逻辑(Spider)

spiders/quotes_spider.py中创建爬虫类:

代码语言:javascript
代码运行次数:0
运行
复制
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('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall()
            }
        
        # 处理翻页
        next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield scrapy.Request(
                response.urljoin(next_page),
                callback=self.parse
            )
代码语言:javascript
代码运行次数:0
运行
复制
关键解析逻辑:
  • 使用CSS选择器定位名言区块(div.quote
  • 通过::text伪类提取纯文本内容
  • getall()方法获取标签列表,get()获取单值
  • 翻页请求通过response.urljoin拼接绝对路径

2.3 数据处理与存储(Pipelines)

pipelines.py中实现数据清洗和存储逻辑:

代码语言:javascript
代码运行次数:0
运行
复制
import json

class QuotesPipeline:
    def __init__(self):
        self.file = open('quotes.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        # 数据清洗示例:去除首尾空格
        item['text'] = item['text'].strip()
        # 序列化为JSON行
        line = json.dumps(dict(item), ensure_ascii=False) + '\n'
        self.file.write(line)
        return item

    def close_spider(self, spider):
        self.file.close()
代码语言:javascript
代码运行次数:0
运行
复制
启用管道需在 settings.py中添加:
代码语言:javascript
代码运行次数:0
运行
复制
ITEM_PIPELINES = {
'quotes_project.pipelines.QuotesPipeline': 300,
}

2.4 配置优化(settings.py)

关键配置项说明:

代码语言:javascript
代码运行次数:0
运行
复制
ROBOTSTXT_OBEY = False # 禁用robots.txt协议遵守(需谨慎)
DOWNLOAD_DELAY = 2 # 设置请求间隔避免被封
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' # 伪装浏览器UA
AUTOTHROTTLE_ENABLED = True # 启用自动限速机制

运行与调试技巧

3.1 启动爬虫

项目根目录执行:

代码语言:javascript
代码运行次数:0
运行
复制
scrapy crawl quotes -o quotes.json
代码语言:javascript
代码运行次数:0
运行
复制
-o 参数支持JSON/CSV/XML等多种格式导出,数据将自动追加写入指定文件。

3.2 交互式调试

使用Scrapy Shell实时测试选择器:

代码语言:javascript
代码运行次数:0
运行
复制
scrapy shell "http://quotes.toscrape.com/page/1/"
代码语言:javascript
代码运行次数:0
运行
复制
进入后可直接执行:
代码语言:javascript
代码运行次数:0
运行
复制
response.css('div.quote:first-child span.text::text').get()
代码语言:javascript
代码运行次数:0
运行
复制
快速验证选择器是否正确匹配目标元素。

常见问题Q&A

Q1:被网站封IP怎么办?

A:立即启用代理池策略,推荐使用住宅代理(如站大爷IP代理),配合scrapy-rotating-proxies中间件实现每请求自动更换IP。同时启用自动限速(AutoThrottle)和随机延迟(DOWNLOAD_DELAY)提升请求隐蔽性。

Q2:如何处理动态加载的内容?

A:对于JavaScript渲染的页面,需结合Selenium或Splash实现动态加载。以Splash为例,需先安装scrapy-splash插件,在settings.py中配置:

代码语言:javascript
代码运行次数:0
运行
复制
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

Q3:如何提升爬虫效率?

A:通过调整并发参数优化性能,在settings.py中设置:

代码语言:javascript
代码运行次数:0
运行
复制
CONCURRENT_REQUESTS = 32 # 最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 单域名并发限制
代码语言:javascript
代码运行次数:0
运行
复制
同时启用管道异步写入(如使用 aiohttp 库)减少 I/O 阻塞。

Q4:数据存储出现乱码如何解决?

A:在管道中显式指定UTF-8编码,示例:

代码语言:javascript
代码运行次数:0
运行
复制
import codecs
self.file = codecs.open('data.json', 'w', encoding='utf-8')
代码语言:javascript
代码运行次数:0
运行
复制
JSON导出时添加 ensure_ascii=False 参数确保中文字符正常显示。

Q5:如何实现分布式爬虫?

A:通过scrapy-redis组件实现分布式架构,配置要点包括:

代码语言:javascript
代码运行次数:0
运行
复制
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
代码语言:javascript
代码运行次数:0
运行
复制
需部署Redis集群作为共享存储,支持多节点协同抓取和去重。

性能优化与扩展方向

6.1 内存管理

通过JOBDIR参数实现爬虫断点续爬,避免因网络中断导致数据丢失。在settings.py配置:

代码语言:javascript
代码运行次数:0
运行
复制
JOBDIR = 'crawls/quotes'
代码语言:javascript
代码运行次数:0
运行
复制
重启时自动加载上次未完成的任务队列。

6.2 反爬策略升级

  • 动态User-Agent池:通过中间件随机切换请求头
  • 指纹混淆:修改scrapy请求指纹算法绕过简单反爬
  • 验证码处理:集成第三方OCR服务(如云打码平台)

6.3 监控与部署

结合Scrapy-Docker实现容器化部署,使用Scrapyd提供REST API远程控制爬虫任务。监控推荐使用Scrapy-Stats收集运行指标,通过Grafana可视化展示吞吐量、错误率等关键数据。

总结与展望

通过本实战案例,我们完整经历了从项目创建到数据存储的Scrapy开发全流程。该框架的核心优势在于其模块化设计和高度可扩展性——通过中间件(Middleware)可灵活插入代理切换、请求重试等逻辑,通过管道(Pipeline)可对接数据库、消息队列等存储方案。未来随着AI反爬技术的演进,Scrapy生态也在持续迭代,例如集成Playwright实现更复杂的浏览器自动化操作,或结合机器学习模型进行动态反爬对抗。

对于开发者而言,掌握Scrapy不仅是掌握一个工具,更是理解分布式系统设计、网络协议、数据流处理等核心技术的绝佳实践场景。建议读者在完成基础案例后,尝试挑战更复杂的场景(如登录认证、AJAX接口解析),并在实战中深化对框架设计哲学的理解。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言:Scrapy框架的核心价值
  • 环境准备:从安装到验证
    • 1.1 安装依赖
    • 1.2 项目初始化
  • 核心组件详解与实战编码
    • 2.1 定义数据结构(Items)
    • 2.2 编写爬虫逻辑(Spider)
    • 2.3 数据处理与存储(Pipelines)
    • 2.4 配置优化(settings.py)
  • 运行与调试技巧
    • 3.1 启动爬虫
    • 3.2 交互式调试
  • 常见问题Q&A
    • Q1:被网站封IP怎么办?
    • Q2:如何处理动态加载的内容?
    • Q3:如何提升爬虫效率?
    • Q4:数据存储出现乱码如何解决?
    • Q5:如何实现分布式爬虫?
  • 性能优化与扩展方向
    • 6.1 内存管理
    • 6.2 反爬策略升级
    • 6.3 监控与部署
  • 总结与展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档