Python爬虫(六):Scrapy框架

"Scrapy到底该怎么学?"今天,我将用这篇万字长文,带你从零开始掌握Scrapy框架的核心用法,并分享我在实际项目中的实战经验!建议收藏⭐!

一、Scrapy简介:为什么选择它?

1.1 Scrapy vs Requests+BeautifulSoup

很多新手会问:“我已经会用Requests+BeautifulSoup了,为什么还要学Scrapy?”

对比项Requests+BS4Scrapy
性能同步请求,速度慢异步IO,高性能
扩展性需要手动实现内置中间件、管道系统
功能完整性仅基础爬取自带去重、队列管理、异常处理
适用场景小规模数据采集企业级爬虫项目

👉 结论:如果是小型项目,Requests够用;但如果是商业级爬虫,Scrapy是更好的选择!

1.2 Scrapy核心架构

(图解Scrapy架构,建议配合流程图理解)

生成Request
发送请求
排队
返回Response
生成Item
Spider
Engine
Scheduler
Downloader
Item Pipeline

二、手把手实战:开发你的第一个Scrapy爬虫

2.1 环境准备

# 推荐使用虚拟环境
python -m venv scrapy_env
source scrapy_env/bin/activate  # Linux/Mac
scrapy_env\Scripts\activate  # Windowspip install scrapy

2.2 创建项目

scrapy startproject book_crawler
cd book_crawler
scrapy genspider books books.toscrape.com

2.3 编写爬虫代码

# spiders/books.py
import scrapyclass BooksSpider(scrapy.Spider):name = "books"def start_requests(self):urls = ['http://books.toscrape.com/']for url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):# 提取书籍信息for book in response.css('article.product_pod'):yield {'title': book.css('h3 a::attr(title)').get(),'price': book.css('p.price_color::text').get(),'rating': book.css('p.star-rating::attr(class)').get().split()[-1]}# 翻页逻辑next_page = response.css('li.next a::attr(href)').get()if next_page:yield response.follow(next_page, callback=self.parse)

2.4 运行爬虫

scrapy crawl books -o books.csv

三、Scrapy高级技巧(企业级应用)

3.1 突破反爬:随机UserAgent+代理IP

# middlewares.py
from fake_useragent import UserAgent
import randomclass RandomUserAgentMiddleware:def process_request(self, request, spider):request.headers['User-Agent'] = UserAgent().randomclass ProxyMiddleware:PROXY_LIST = ['http://proxy1.example.com:8080','http://proxy2.example.com:8080']def process_request(self, request, spider):proxy = random.choice(self.PROXY_LIST)request.meta['proxy'] = proxy

settings.py中启用:

DOWNLOADER_MIDDLEWARES = {'book_crawler.middlewares.RandomUserAgentMiddleware': 543,'book_crawler.middlewares.ProxyMiddleware': 544,
}

3.2 数据存储:MySQL+Pipeline

# pipelines.py
import pymysqlclass MySQLPipeline:def __init__(self):self.conn = pymysql.connect(host='localhost',user='root',password='123456',db='scrapy_data',charset='utf8mb4')self.cursor = self.conn.cursor()def process_item(self, item, spider):sql = """INSERT INTO books(title, price, rating) VALUES (%s, %s, %s)"""self.cursor.execute(sql, (item['title'],item['price'],item['rating']))self.conn.commit()return itemdef close_spider(self, spider):self.conn.close()

四、常见问题Q&A

Q1:如何爬取JavaScript渲染的页面?

方案一:Scrapy+Splash

# 安装:docker run -p 8050:8050 scrapinghub/splash
yield scrapy.Request(url,self.parse,meta={'splash': {'args': {'wait': 2.5}}}
)

方案二:Scrapy+Playwright(推荐)

# settings.py
DOWNLOAD_HANDLERS = {"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler","https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

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

使用scrapy-redis

# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://:password@localhost:6379/0'

五、性能优化技巧

  1. 并发控制

    # settings.py
    CONCURRENT_REQUESTS = 32  # 默认16
    DOWNLOAD_DELAY = 0.25  # 防止被封
    
  2. 缓存请求

    HTTPCACHE_ENABLED = True
    HTTPCACHE_EXPIRATION_SECS = 86400  # 缓存1天
    
  3. 自动限速

    AUTOTHROTTLE_ENABLED = True
    AUTOTHROTTLE_START_DELAY = 5.0
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84652.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中关闭swap分区

在 Linux 系统中关闭 swap 分区(或交换文件)的步骤如下,请务必在操作前保存所有数据,以免丢失: 📌 完整操作步骤: 1. 查看当前 swap 使用情况 free -h swapon --show # 查看活跃的 swap 设…

RPGMZ游戏引擎之如何设计每小时开启一次的副本

本文知识点 1. 获取时间 2. 时间格式要正确 3. 事件内如何设计 正文开始 1. 获取时间 首先获取当前时间 然后保存在 事件内的变量里面 后需要判断时间是否相等 function 获取当前日期(){const now new Date();return now.toISOString();}; 2. 时间格式要正确 now.toI…

学习路之uniapp--uniapp扩展uni-ui

这里写目录标题 一、新建项目二、下载导入插件三、直接创建uni-ui项目 一、新建项目 二、下载导入插件 三、直接创建uni-ui项目 创建uniapp项目时,直接创建uni-ui项目

Kotlin 2.6 猜数小游戏

本次实战通过开发猜数小游戏,深入学习了 Kotlin 编程的循环控制和条件判断。游戏要求计算机随机生成一个数字,用户通过输入猜测,程序根据猜测结果给出提示,直到猜中为止。通过实现这一过程,我们掌握了如何使用 while 循…

RNN工作原理和架构

## 1. 什么是 RNN? * **全称:** Recurrent Neural Network(循环神经网络) * **核心特点:** 它是一种专门设计用来处理**序列数据**的神经网络。 * **核心能力:** 拥有“记忆”能力,能够利用**…

智能计算模拟:第一性原理+分子动力学+机器学习

第一性原理分子动力学机器学习”三位一体的综合手段,已经成为模拟计算的一个前沿方向,为解决传统计算化学方法面临的挑战提供了新的解决方案。国内外已有科研团队在深化第一性原理与分子动力学的研究与应用拓展,利用机器学习优化大规模计算、…

基于Attention机制的模型。这使得它摆脱了RNN模型顺序读取序列的缺点,可以实现高度的并行化的理解

这句话的核心意思是:​​该模型完全基于注意力机制(Attention Mechanism),不再依赖传统的循环神经网络(RNN)结构,因此避免了 RNN 的顺序计算问题,能够实现高效的并行化计算​​。我们可以从以下几个方面深入理解: 1. ​​"仅基于 Attention 机制"​​ ​​传…

解决虚拟机 Kali 系统安装了VMware Tools 不能拖入文件问题

进入终端,这里我是root模式下,不是root模式在命令前加一个sudo即可,命令如下: apt install open-vm-tools open-vm-tools-desktop 执行成功后输入 reboot 重启后即可

GitHub OAuth 认证示例

GitHub链接:github_auth 流程图 功能特性 ✅ GitHub OAuth 认证✅ 获取用户基本信息✅ 显示用户的 GitHub 仓库列表✅ 安全的会话管理✅ 响应式用户界面 技术栈 后端 Flask - Python Web 框架Flask-CORS - 跨域资源共享Requests - HTTP 库Session - 会话管理 …

百度萝卜快跑携4颗禾赛激光雷达进军迪拜,千辆L4无人车开启全球化战略

3月28日,百度旗下自动驾驶出行服务平台“萝卜快跑”宣布在迪拜市区启动无人驾驶规模化测试及服务,计划部署超1000辆L4级全无人驾驶汽车。此次出海不仅是萝卜快跑首次在中国以外地区实现规模化落地,更以“单车搭载4颗禾赛激光雷达”的硬件配置引发行业关注,标志着中国自动驾…

湖北师范大学人工智能与计算机学院电子信息研究生课程《随机过程》第六次作业

一. 计算题(共10题,100分) 1. (计算题, 10分)随机信号 的实测样本函数如题图(a)与(b)所示, ,期中X为随机变量, ,试说明它们可能是均值各态历经的吗?(写明道理&#xff…

解决Windows Server打开DNS提示“拒绝访问”和“RPC服务器不可用”

问题背景 在一个活动目录域xyzz.internal中,有两台域控制器(Domain Controller),各位于一个站点。 问题 当我们在其中一台域控制器上的服务器管理器中打开DNS管理工具时,却看到类似如下错误,提示拒绝访问…

Python中字符串常用的操作方法

在Python中,字符串是不可变序列类型,提供了丰富的内置方法。以下是常用的字符串操作方法及示例: 1. 大小写转换 lower() 转小写 upper() 转大写 capitalize() 首字母大写 title() 每个单词首字母大写 swapcase() 大小写互换 print(&q…

利用百度/高德地图API实现车辆轨迹跟踪系统

利用百度/高德地图API实现车辆轨迹跟踪系统 摘要: 本文详细阐述了如何利用百度地图API或高德地图API构建一套完整的车辆轨迹跟踪系统。内容涵盖系统架构设计、数据采集与传输、地图API核心功能实现(地图展示、轨迹绘制、实时定位、历史轨迹回放)、关键优化技术(轨迹纠偏、…

解锁K-近邻算法:数据挖掘的秘密武器

目录 一、K - 近邻算法是什么二、算法原理深度剖析2.1 核心思想2.2 距离度量方式2.3 K 值的选择2.4 分类决策规则 三、K - 近邻算法实践3.1 准备数据集3.2 代码实现步骤3.3 结果分析与评估 四、K - 近邻算法优缺点4.1 优点阐述4.2 缺点分析 五、应用案例展示5.1 图像识别领域5.…

华为OD机试_2025 B卷_构成正方形数量(Python,100分)(附详细解题思路)

题目描述 输入N个互不相同的二维整数坐标&#xff0c;求这N个坐标可以构成的正方形数量。[内积为零的的两个向量垂直] 输入描述 第一行输入为N&#xff0c;N代表坐标数量&#xff0c;N为正整数。N < 100 之后的 K 行输入为坐标x y以空格分隔&#xff0c;x&#xff0c;y为整…

Qt:智能指针QScopedPointer使用

QScopedPointer和C中的智能指针std::unique_ptr其概念是一样的&#xff0c;它包装了new操作符在堆上分配的动态对象&#xff0c;能够保证动态创建的对象在任何时候都可以被正确地删除。但它有更严格的所有权&#xff0c;并且不能转让&#xff0c;一旦获取了对象的管理权&#x…

TensorFlow基础之理解计算图

Tensor Flow TensorFlow 本章介绍TensorFlow的基础。特别地&#xff0c;你将学习如何用TensorFlow进行基础计算。在开始使用 TensorFlow之前,你必须理解它背后的哲学。 这个库基于计算图的概念&#xff0c;如果你不理解计算图是如何工作的&#xff0c;你就不能理解如何使用这…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十五) -> 配置构建(二)

目录 1 -> 定制HAP多目标构建产物 1.1 -> 定义产物的HAP包名 1.2 -> 定义产物的deviceType 1.3 -> 定义产物的distributionFilter 1.4 -> 定义产物preloads的分包 1.5 -> 定义产物的source源码集-pages 1.6 -> 定义产物的source源码集-sourceRoots…

[muduo] ThreadPool | TcpClient | 异步任务 | 通信测试

第九章&#xff1a;线程池&#xff08;ThreadPool&#xff09; 在第八章《TcpServer》中&#xff0c;我们了解到muduo::net::TcpServer通过EventLoop线程池处理入站连接。 这些EventLoop线程主要负责网络I/O&#xff1a;套接字读写和定时器处理&#xff0c;由Poller和Channel…