资讯动态

Scrapy 入门总览:用 runspider 命令快速编写并运行异步爬虫

发布时间:2026/9/7 3:15:21 来源:尧图企业网站定制
Scrapy 入门总览用 runspider 命令快速编写并运行异步爬虫【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy本文基于 Scrapy 官方文档 Scrapy at a glance 展开带你完整走查一个最小可用的 QuotesSpider 示例从编写 Spider 类、用scrapy runspider命令无项目运行到理解爬虫引擎如何处理异步请求、如何配置抓取礼貌性下载延迟、并发限制以及 Scrapy 内置的 Selector、Feed 导出、扩展与中间件等核心能力。读完后你可以直接复制示例代码运行出结果并理解其背后的执行机制。一、Scrapy 是什么Scrapy读音 /ˈskreɪpaɪ/是一个用于爬取网站并提取结构化数据的应用框架可支撑数据挖掘、信息处理、历史档案化等多种应用。虽然 Scrapy 最初是为网页抓取web scraping设计的但官方文档 overview.rst 明确指出它同样可以从 API 中提取数据例如 Amazon Associates Web Services作为通用的 Web 爬虫general purpose web crawler使用。其底层基于 Twisted 事件驱动网络框架构建采用非阻塞异步代码实现并发——这一点会在下文“到底发生了什么”部分结合架构文档 architecture.rst 详细展开。二、示例 Spider 完整走查2.1 示例代码以下是一个抓取 quotes.toscrape.com 名言站点、并跟随分页翻页的 Spiderimport scrapy class QuotesSpider(scrapy.Spider): name quotes start_urls [ https://quotes.toscrape.com/tag/humor/, ] def parse(self, response): for quote in response.css(div.quote): yield { author: quote.xpath(span/small/text()).get(), text: quote.css(span.text::text).get(), } next_page response.css(li.next a::attr(href)).get() if next_page is not None: yield response.follow(next_page, self.parse)将这段代码保存为quotes_spider.py然后使用runspider命令运行scrapy runspider quotes_spider.py -o quotes.jsonl运行结束后quotes.jsonl文件会包含 JSON Lines 格式的名言列表每行一个 JSON 对象含text与author字段内容形如{author: Jane Austen, text: \u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d} {author: Steve Martin, text: \u201cA day without sunshine is like, you know, night.\u201d} {author: Garrison Keillor, text: \u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d} ...2.2 runspider 命令的源码解析scrapy runspider是“无需项目即可运行 Spider 文件”的最简方式。从源码 runspider.py 可以看到它的完整处理流程校验文件存在性filename.exists()否则抛出UsageError通过_import_file将.py文件作为模块导入会临时把文件所在目录插入sys.path用iter_spider_classes(module)在模块中查找 Spider 类找不到则报错调用crawler_process.crawl(...)创建爬虫并start()启动事件循环。该命令默认设置中使用了DummySpiderLoaderSPIDER_LOADER_CLASS这正是它“不需要项目目录结构”的原因——它不依赖项目级 Spider 加载器而是直接从给定文件中解析 Spider 类。命令的官方描述为[options] spider_file Run a spider from a Python file, no project required2.3 关键元素在源码中的落点start_urlsSpider 基类在 spiders/init.py 中将其声明为类属性。默认的start()协程该版本新增见源码 L89-L136会遍历start_urls为每个 URL 生成Request(url, dont_filterTrue)即“爬取起点就是这些 URL 的初始请求”。parse回调基类的parse方法默认抛出NotImplementedError源码 L145-L164Spider 必须自己实现。它是未指定callback的请求的默认回调响应到达引擎后会被路由到这里。response.css(...)/quote.xpath(...)Selector 的统一实现在 unified.py支持扩展的 CSS 选择器与 XPath 表达式并附带正则提取等辅助方法详见 selectors 文档。response.follow(next_page, self.parse)follow方法会把相对链接如/tag/humor/page/2/解析为绝对 URL 并生成以self.parse为回调的新请求从而形成“抓一页 → 提取数据 → 发现下一页 → 再抓”的递归翻页循环。三、到底发生了什么What just happened?官方文档对这条命令的执行过程给出了清晰的分解查找 Spider运行scrapy runspider quotes_spider.py时Scrapy 在文件中查找 Spider 定义并把它交给爬虫引擎crawler engine执行发起初始请求爬取从访问start_urls中定义的 URL 开始本例仅humor分类的第一页响应会作为参数传入默认回调parse回调中处理在parse中用 CSS Selector 循环遍历div.quote元素yield一个包含名言文本和作者的 Python dict同时用 CSS Selector 查找下一页链接并用response.follow以同样的parse方法为回调调度新请求。3.1 异步调度Scrapy 的核心优势文档特别强调这里体现了 Scrapy 的主要优势之一——请求被异步地调度和处理。含义是Scrapy 不需要等待某个请求完成并处理完才能做别的事它可以在等待期间发出另一个请求或执行其他操作即使某个请求失败或处理时发生错误其他请求仍然可以继续推进容错性。这一机制使 Scrapy 能够并发发送多个请求实现又快又容错的抓取。其数据流由执行引擎控制完整流程记录在 architecture.rst 中Spider 产出初始 Request → Engine 交给 Scheduler 排队 → Engine 将 Request 经 Downloader Middleware 发给 Downloader → 下载完成后 Response 经 Middleware 回到 Engine → Engine 将 Response 经 Spider Middleware 交给 Spider 处理 → Spider 产出 items 与新 Request → items 进入 Item Pipeline、新 Request 回到 Scheduler循环往复直到调度器中无请求为止。3.2 礼貌性控制并发与延迟设置异步高速抓取的同时Scrapy 通过设置项settings提供对抓取“礼貌程度”的控制。以下是 default_settings.py 中与之直接相关的默认值以当前仓库源码为准设置项默认值作用CONCURRENT_REQUESTS16全局并发请求数上限CONCURRENT_REQUESTS_PER_DOMAIN8每个域名的最大并发请求数CONCURRENT_ITEMS100并发处理 item 的数量上限DOWNLOAD_DELAY0同一域名两次请求之间的下载延迟秒0 表示不延迟RANDOMIZE_DOWNLOAD_DELAYTrue在DOWNLOAD_DELAY基础上做随机化避免固定节奏AUTOTHROTTLE_ENABLEDFalse自动节流扩展开关也就是说若希望降低对目标站点的压力可在运行参数或项目设置中调整DOWNLOAD_DELAY例如设为 1 秒并限制CONCURRENT_REQUESTS_PER_DOMAIN。完整的设置项参考见 settings 文档。更进一步Scrapy 内置了自动节流扩展AutoThrottle它会根据下载延迟等信号自动推断出合适的DOWNLOAD_DELAY与并发配置。从默认值看AUTOTHROTTLE_ENABLED默认为False另有关联的AUTOTHROTTLE_START_DELAY默认 5.0 秒、AUTOTHROTTLE_MAX_DELAY默认 60.0 秒和AUTOTHROTTLE_TARGET_CONCURRENCY默认 1.0可调节其行为。3.3 Feed 导出quotes.jsonl 是怎么来的官方文档中的注释指出上面的示例文件是用 **feed exportsFeed 导出**机制生成的 JSON Lines 文件。-o quotes.jsonl会依据文件扩展名自动选择 JSON Lines 导出器。你可以轻松更换导出格式如 XML 或 CSV改一下输出文件名扩展名即可更换存储后端如 FTP 或 Amazon S3编写 item pipeline 将 items 存入数据库。更多细节见 feed-exports 文档。四、What else?——Scrapy 还提供什么官方文档在示例之后列出了 Scrapy 的核心能力清单这里逐条说明并附上对应文档入口选择与提取内置对 HTML/XML 源数据的选择支持使用扩展的 CSS 选择器与 XPath 表达式并提供正则提取辅助方法。见 selectors。交互式 shell 控制台IPython 感知IPython aware的 shell用于在编写或调试 Spider 时快速试验 CSS/XPath 表达式。见 shell 文档。Feed 导出支持多种格式JSON、CSV、XML与多种存储后端FTP、S3、本地文件系统。见 feed-exports。健壮的编码支持与自动检测可应对国外、非标准乃至损坏的编码声明。强扩展性通过 signals 和一套定义良好的 APImiddlewares、extensions 与 pipelines插入自定义功能。见 组件文档。大量内置扩展与中间件用于处理cookies 与会话管理对应 downloadermiddlewares/cookies.pyHTTP 压缩、认证、缓存等特性如 httpcompression.py、httpauth.py、httpcache.pyUser-Agent 伪装useragent.pyrobots.txt 遵守robotstxt.py爬取深度限制对应 spidermiddlewares/depth.py由DEPTH_LIMIT设置控制默认 0 表示不限制。Telnet 控制台在 Scrapy 进程内部挂接一个 Python 控制台用于内省与调试爬虫。从默认设置看TELNETCONSOLE_ENABLED默认为开启值为 1可远程接入运行中的进程调试。见 telnetconsole 文档。其他实用组件可复用的 SpiderSitemapSpider抓取 Sitemap 站点、CSVFeedSpider/XMLFeedSpider抓取 XML/CSV feed——从 spiders/init.py 的__all__导出清单可确认这些可复用 Spider 均为框架内置媒体管道自动下载与抓取 item 关联的图片或其他媒体见 media-pipeline 文档带缓存的 DNS 解析器等。五、下一步按照官方文档 overview.rst 的指引接下来的路线是安装 Scrapy参考 install 文档当前仓库亦提供 INSTALL.md跟做教程通过 tutorial 学习如何创建一个完整的 Scrapy 项目含scrapy startproject、Spider 目录结构、item 定义等而本文的runspider方式适合快速试验单个 Spider 文件深入架构若想了解数据流细节阅读 Architecture overview其中给出了 Engine、Scheduler、Downloader、Spider、Item Pipeline 及各类中间件之间的完整交互说明。这样从“一个 15 行的小 Spider 一条命令行”到“完整项目 自定义中间件/管道/扩展”的成长路径就清晰了。【免费下载链接】scrapyScrapy, a fast high-level web crawling scraping framework for Python.项目地址: https://gitcode.com/GitHub_Trending/sc/scrapy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价