Scrapy 网络爬虫框架

Scrapy 是Python 开发的开源、异步网页爬虫框架,专门用于批量抓取网页数据,自带请求调度、下载、解析、数据持久化、反爬基础处理,不用手写大量请求、队列逻辑,适合大规模爬虫项目。

  1. 核心五大组件(架构)
组件 作用
Spider(爬虫) 写解析逻辑,定义爬取规则、url,提取需要的数据
Item(数据容器) 定义要抓取的数据字段,类似数据模型,规范输出格式
Item Pipeline(管道) 拿到解析后的数据,做保存:存 json/csv、存数据库、清洗过滤数据
Downloader(下载器) 负责发送 http 请求,下载网页源码,处理请求头、代理、重试
Scheduler(调度器) 管理待爬取 url 队列,去重、调度请求顺序,实现异步并发

中间件:

Downloader Middleware:处理请求 / 响应,设置代理、Cookie、UA、处理异常

Spider Middleware:处理 spider 输出的数据、请求

  1. 安装

pip install scrapy

  1. 基础命令

创建爬虫项目

scrapy startproject myspider

#进入项目文件夹

cd myspider

#生成爬虫文件 爬虫名 爬取域名

scrapy genspider demo_spider example.com

#运行爬虫

scrapy crawl demo_spider

#导出数据

scrapy crawl demo_spider -o data.json

scrapy crawl demo_spider -o data.csv

  1. 项目目录结构

plaintext

myspider/

├─myspider/

│ ├─init.py

│ ├─items.py #定义数据字段

│ ├─middlewares.py #中间件

│ ├─pipelines.py #数据处理管道

│ ├─settings.py #爬虫全局配置

│ └─spiders/ #存放各个爬虫文件

│ └─demo_spider.py

└─scrapy.cfg

  1. 最简示例

spiders/demo_spider.py

import scrapy

class DemoSpider(scrapy.Spider):

name = "demo_spider" #爬虫唯一名字,crawl命令用这个

allowed_domains = "example.com"

start_urls = "https://example.com" #初始url

def parse(self, response):

response 网页响应对象

title = response.xpath("//title/text()").get() #xpath提取

yield {"title":title} #产出数据交给pipeline

parse():默认回调函数,拿到网页 response,做 xpath/css 选择器解析,yield产出数据 / 新请求。

yield scrapy.Request(url,callback=xxx) 生成下一页请求。

xpath /css 选择器

python

运行

#xpath

response.xpath('//div@class="title"/text()').get() #取第一条

response.xpath('//div@class="title"/text()').getall() #全部结果

#css选择器

response.css('div.title::text').get()

  1. settings.py 常用配置

是否遵守robots协议,正式爬虫关闭

ROBOTSTXT_OBEY = False

#并发请求数,调大爬的快,容易封IP

CONCURRENT_REQUESTS = 16

#请求间隔,防反爬,单位秒

DOWNLOAD_DELAY = 1

#请求头,伪装浏览器

DEFAULT_REQUEST_HEADERS = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"

}

#开启pipeline

ITEM_PIPELINES = {

'myspider.pipelines.MyspiderPipeline': 300, #数字代表执行优先级,越小越先执行

}

  1. Item & Pipeline 示例

items.py

python

运行

import scrapy

class DemoItem(scrapy.Item):

title = scrapy.Field()

pipelines.py

python

运行

class MyspiderPipeline:

def process_item(self, item, spider):

#每条数据进来执行,可以写入库逻辑

print(item)

return item

  1. 优缺点

✅优点

异步架构,并发高,速度远高于 requests 循环

自带 url 去重、重试、调度队列,不用自己写队列

xpath/css 解析开箱即用,完整组件化,适合大批量爬虫

支持导出 json、csv,对接数据库方便

❌缺点

JS 渲染动态页面拿不到数据(需要搭配 Selenium/Playwright)

学习成本高于简单 requests 脚本

调试不如普通脚本直观

如果页面是 JS 渲染:使用 scrapy‑playwright 插件,集成浏览器渲染。

  1. 常见坑

403 被拦截:需要设置 UA、Cookie、代理、加大 DOWNLOAD_DELAY

中文乱码:scrapy 内部自动处理编码,输出文件乱码在导出时设置编码

url 没有被爬取:检查allowed_domains会过滤域外链接;url 去重机制导致重复 url 不会再次请求

动态网页拿不到内容:scrapy 默认不执行 JS,需要浏览器渲染组件。

相关推荐
Sakura_j_h_42 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰1 小时前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境1 小时前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530141 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
hhcgchpspk2 小时前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事2 小时前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python
vipxieliang2 小时前
Python collections:高效容器与实战案例
后端·python
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
特创数字科技2 小时前
写了个 Windows 下载器:一键拉 GitHub / Gitee 源码,带 SHA256 校验
python·github
郝学胜-神的一滴3 小时前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn