免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0
Scrapy是Python生态中针对网络爬虫优化的高性能框架,其设计核心在于通过“引擎-调度器-下载器-爬虫-管道”的协作模式,实现从页面抓取、数据解析到持久化的全流程自动化。相比传统requests+BeautifulSoup的组合,Scrapy内置了请求队列管理、自动重试、中间件扩展等关键功能,特别适合需要处理大规模数据抓取的场景。本文将以实战为导向,通过抓取“名人名言”网站(quotes.toscrape.com)的完整流程,详细拆解Scrapy的每个核心组件及其协作逻辑。
通过pip安装Scrapy框架(推荐Python 3.6+环境):
pip install scrapy
验证安装成功可通过终端执行:
scrapy version
若输出类似 Scrapy 2.11.1的版本信息即表示安装完成。Windows用户若遇 win32api 模块缺失错误,需额外安装pypiwin32包。
在目标目录执行创建命令:
scrapy startproject quotes_project
生成的项目结构包含:
scrapy.cfg
:项目配置文件,定义部署参数quotes_project/
:主代码目录,包含: items.py
:数据结构模板pipelines.py
:数据处理管道settings.py
:全局配置spiders/
:爬虫代码存放目录在items.py
中定义抓取目标字段,例如:
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field() # 名言文本
author = scrapy.Field() # 作者
tags = scrapy.Field() # 标签列表
在spiders/quotes_spider.py
中创建爬虫类:
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
)
关键解析逻辑:
div.quote
)::text
伪类提取纯文本内容getall()
方法获取标签列表,get()
获取单值response.urljoin
拼接绝对路径在pipelines.py
中实现数据清洗和存储逻辑:
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()
启用管道需在 settings.py中添加:
ITEM_PIPELINES = {
'quotes_project.pipelines.QuotesPipeline': 300,
}
关键配置项说明:
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 # 启用自动限速机制
项目根目录执行:
scrapy crawl quotes -o quotes.json
-o 参数支持JSON/CSV/XML等多种格式导出,数据将自动追加写入指定文件。
使用Scrapy Shell实时测试选择器:
scrapy shell "http://quotes.toscrape.com/page/1/"
进入后可直接执行:
response.css('div.quote:first-child span.text::text').get()
快速验证选择器是否正确匹配目标元素。
A:立即启用代理池策略,推荐使用住宅代理(如站大爷IP代理),配合scrapy-rotating-proxies
中间件实现每请求自动更换IP。同时启用自动限速(AutoThrottle)和随机延迟(DOWNLOAD_DELAY)提升请求隐蔽性。
A:对于JavaScript渲染的页面,需结合Selenium或Splash实现动态加载。以Splash为例,需先安装scrapy-splash
插件,在settings.py中配置:
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
A:通过调整并发参数优化性能,在settings.py中设置:
CONCURRENT_REQUESTS = 32 # 最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 单域名并发限制
同时启用管道异步写入(如使用 aiohttp 库)减少 I/O 阻塞。
A:在管道中显式指定UTF-8编码,示例:
import codecs
self.file = codecs.open('data.json', 'w', encoding='utf-8')
JSON导出时添加 ensure_ascii=False 参数确保中文字符正常显示。
A:通过scrapy-redis
组件实现分布式架构,配置要点包括:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
需部署Redis集群作为共享存储,支持多节点协同抓取和去重。
通过JOBDIR
参数实现爬虫断点续爬,避免因网络中断导致数据丢失。在settings.py配置:
JOBDIR = 'crawls/quotes'
重启时自动加载上次未完成的任务队列。
scrapy
请求指纹算法绕过简单反爬结合Scrapy-Docker实现容器化部署,使用Scrapyd提供REST API远程控制爬虫任务。监控推荐使用Scrapy-Stats收集运行指标,通过Grafana可视化展示吞吐量、错误率等关键数据。
通过本实战案例,我们完整经历了从项目创建到数据存储的Scrapy开发全流程。该框架的核心优势在于其模块化设计和高度可扩展性——通过中间件(Middleware)可灵活插入代理切换、请求重试等逻辑,通过管道(Pipeline)可对接数据库、消息队列等存储方案。未来随着AI反爬技术的演进,Scrapy生态也在持续迭代,例如集成Playwright实现更复杂的浏览器自动化操作,或结合机器学习模型进行动态反爬对抗。
对于开发者而言,掌握Scrapy不仅是掌握一个工具,更是理解分布式系统设计、网络协议、数据流处理等核心技术的绝佳实践场景。建议读者在完成基础案例后,尝试挑战更复杂的场景(如登录认证、AJAX接口解析),并在实战中深化对框架设计哲学的理解。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。