【Python爬虫实战】深入解析 Scrapy 爬虫框架:高效抓取与实战搭建全指南

news2024/11/22 8:34:09

  🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、Srapy简介

(一)什么是Srapy

(二)Scrapy 的设计目标

二、Scrapy 的核心架构

(一)Spider爬虫

(二)Scrapy Engine引擎

(三)Downloader下载器

(四)Scheduler调度器

(五)Middleware中间件

(六)Item Pipeline数据管道

三、Scrapy框架的搭建

(一)环境准备

(二)安装Scrapy

(三)创建 Scrapy 项目

(四)编写第一个爬虫

(五)配置 Scrapy

(六)运行爬虫

(七)高级配置

四、总结


前言

在大数据时代,网络爬虫已经成为数据收集的重要工具。而 Scrapy 作为一个功能强大且高效的 Python 爬虫框架,以其模块化、异步处理和高度可扩展性,广泛应用于数据挖掘、监控和分析等领域。本指南将从 Scrapy 的基础概念到项目实践,带你全面了解如何搭建和优化一个 Scrapy 爬虫项目,不论是新手还是经验丰富的开发者,都能从中获益。


一、Srapy简介

Scrapy 是一个广泛使用的 Python 爬虫框架,专为高效抓取和处理网络数据而设计。

(一)什么是Srapy

Scrapy 是一个开源的 Python 爬虫框架,用于快速、简单地抓取和提取网页中的数据。它特别适合以下场景:

  • 抓取动态生成或复杂结构化的网页数据。

  • 实现高性能的并发爬取。

  • 清洗和存储提取到的数据。

(二)Scrapy 的设计目标

  • 高性能:通过非阻塞的异步 I/O 模型,Scrapy 能够同时处理大量网络请求。

  • 模块化:框架组件分工明确,用户可以轻松扩展或替换任意模块。

  • 易用性:提供了强大的抽象层,开发者只需关注如何提取数据,Scrapy 会处理底层网络通信和调度。


二、Scrapy 的核心架构

Scrapy 框架的整体架构分为六个模块:Spider爬虫、Scrapy Engine引擎、Downloader下载器、

Scheduler调度器、Middleware中间件和Item Pipeline数据管道,详细如下:

(一)Spider爬虫

爬虫是 Scrapy 的核心组件之一,用于定义如何抓取数据。它主要负责以下任务:

  • 生成 HTTP 请求。

  • 定义起始 URL(start_urls)。

  • 编写数据提取逻辑(parse() 方法)。

示例:

import scrapy

class MySpider(scrapy.Spider):
    name = "example"
    start_urls = ["https://example.com"]

    def parse(self, response):
        # 提取标题和链接
        for link in response.css('a'):
            yield {
                'title': link.css('::text').get(),
                'url': link.attrib['href']
            }

(二)Scrapy Engine引擎

Scrapy 的引擎负责框架的主逻辑控制。它的任务包括:

  • 调度请求并将其交给下载器。

  • 接收下载器返回的响应。

  • 将响应传递给 Spider 进行解析。

  • 通过调度器维护请求队列。

数据流:

  1. Spider 定义的起始请求被发送到 Scheduler(调度器)。

  2. 调度器从请求队列中取出请求,交给 Downloader(下载器)。

  3. 下载器获取页面内容并返回 Response。

  4. Response 被传递到 Spider 的 parse 方法处理。

  5. Spider 生成新的请求或提取的数据。

(三)Downloader下载器

Scrapy 下载器专为高性能网页下载设计,支持以下功能:

  • 处理 HTTP/HTTPS 请求。

  • 自动处理 Cookies。

  • 支持用户代理 和 HTTP Headers 定制。

自定义Headers示例:

def start_requests(self):
    yield scrapy.Request(
        url="https://example.com",
        headers={"User-Agent": "CustomUserAgent/1.0"}
    )

(四)Scheduler调度器

调度器管理爬虫的请求队列,确保请求按优先级处理并避免重复访问。

  • 默认支持 去重机制,确保每个 URL 只被请求一次。

  • 自定义优先级:可以通过设置请求的 priority 字段调整请求顺序。

(五)Middleware中间件

中间件是 Scrapy 的扩展机制,位于引擎、下载器和 Spider 之间。

下载中间件

  • 修改请求或响应内容。

  • 动态设置代理、用户代理等。

示例:动态代理设置

class ProxyMiddleware:
    def process_request(self, request, spider):
        request.meta['proxy'] = "http://proxy_ip:proxy_port"

爬虫中间件

  • 负责处理 Spider 输入和输出。

示例:过滤掉特定类型的响应

class FilterMiddleware:
    def process_spider_output(self, response, result, spider):
        for item in result:
            if "unwanted" not in item['title']:
                yield item

(六)Item Pipeline数据管道

管道处理 Spider 提取的数据,包括:

  • 数据清洗:格式化提取的数据。

  • 数据验证:检查提取的数据是否完整或符合规范。

  • 数据存储:将清洗后的数据存入数据库或文件。

示例:

class CleanPipeline:
    def process_item(self, item, spider):
        item['title'] = item['title'].strip()
        return item

三、Scrapy框架的搭建

(一)环境准备

Scrapy 是一个 Python 框架,因此需要提前准备好运行环境:

1.1 安装 Python

  • 下载最新稳定版 Python(推荐 3.7 或更高版本)。

  • 从 Python 官网 安装,并确保勾选“Add Python to PATH”。

1.2 安装依赖工具

  • Windows 用户需安装 Visual Studio 的 C++ 构建工具以支持依赖包编译。

  • Linux 和 macOS 用户需确保系统安装了开发工具(如 gcclibxml2-dev)。

(二)安装Scrapy

使用 pip 安装

Scrapy 可以通过 pip 一键安装:

pip install scrapy

安装完成后,检查是否成功:

scrapy --version

输出示例:

Scrapy 2.x.x

可能遇到的安装问题及解决办法

  • Windows 下安装失败

    • 确保安装了 C++ 构建工具,并安装最新版本。

  • macOS SSL 错误

确保更新 OpenSSL 库:

brew install openssl

然后重新安装 Scrapy。

(三)创建 Scrapy 项目

创建项目是使用 Scrapy 的第一步。假设项目名为 myproject

创建项目

运行以下命令创建项目:

scrapy startproject myproject

执行后,项目结构如下:

myproject/
    scrapy.cfg         # Scrapy 配置文件
    myproject/         # 项目代码目录
        __init__.py
        items.py       # 定义数据结构
        middlewares.py # 中间件
        pipelines.py   # 数据管道
        settings.py    # 项目配置
        spiders/       # 存放爬虫代码
            __init__.py

(四)编写第一个爬虫

进入项目目录

cd myproject

创建爬虫

使用以下命令创建一个名为 example 的爬虫:

scrapy genspider example example.com

执行后,会在 spiders/ 文件夹中生成爬虫代码:

myproject/spiders/example.py

编辑爬虫代码

spiders/example.py 中,定义爬取逻辑,例如抓取 example.com 的标题:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'  # 爬虫名称
    start_urls = ['https://example.com']  # 起始 URL

    def parse(self, response):
        # 提取标题并打印
        title = response.xpath('//title/text()').get()
        yield {'title': title}

(五)配置 Scrapy

Scrapy 的行为可以通过 settings.py 文件进行配置:

基础配置

打开 settings.py,设置常用参数:

  • 日志级别:
LOG_LEVEL = 'INFO'
  • 下载延迟: 防止被目标站点屏蔽:

DOWNLOAD_DELAY = 2  # 每次请求间隔 2 秒
  • User-Agent: 模拟浏览器行为:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

数据存储

配置数据导出格式和位置。例如,导出到 JSON 文件:

scrapy crawl example -o output.json

(六)运行爬虫

启动爬虫

在项目目录下运行爬虫:

scrapy crawl example

运行结果: 如果爬虫正常运行,你将在终端看到标题等提取的数据。

调试爬虫

使用 scrapy shell 测试提取逻辑:

scrapy shell 'https://example.com'

进入交互环境后,可以测试 XPath 或 CSS 提取规则:

response.xpath('//title/text()').get()
response.css('title::text').get()

(七)高级配置

启用管道

pipelines.py 中定义数据存储逻辑,例如将数据存储到 MongoDB:

import pymongo

class MongoPipeline:
    def open_spider(self, spider):
        self.client = pymongo.MongoClient("localhost", 27017)
        self.db = self.client["scrapy_db"]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db["scrapy_collection"].insert_one(dict(item))
        return item

启用管道:

ITEM_PIPELINES = {
    'myproject.pipelines.MongoPipeline': 300,
}

 动态页面支持

Scrapy 原生不支持动态 JavaScript 渲染,但可以结合 Selenium 实现:

  1. 安装 scrapy-selenium

pip install scrapy-selenium

     2.配置 Selenium: 修改 settings.py

from shutil import which

SELENIUM_DRIVER_NAME = 'firefox'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('geckodriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless']

    3.使用 SeleniumRequest:

from scrapy_selenium import SeleniumRequest

class JSExampleSpider(scrapy.Spider):
    name = "js_example"

    def start_requests(self):
        yield SeleniumRequest(url="https://example.com", callback=self.parse)

    def parse(self, response):
        # 解析动态渲染后的页面
        title = response.css('title::text').get()
        yield {'title': title}

四、总结

Scrapy 凭借其高效的异步架构、灵活的扩展机制和丰富的功能,成为处理网络数据的强大工具。本文从 Scrapy 的核心架构到搭建项目的每一步,都做了详细的说明,为开发者快速掌握该框架提供了清晰的路径。在未来,结合动态渲染支持和分布式扩展,Scrapy 的应用场景将更加广泛。无论你是为了抓取数据还是构建数据驱动型应用,Scrapy 都是一个值得深入学习的框架。

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

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

相关文章

编程之路,从0开始:动态内存管理

Hello,大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理? 2、malloc和free (1)malloc函数 &…

初始Python篇(4)—— 元组、字典

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 元组 相关概念 元组的创建与删除 元组的遍历 元组生成式 字典 相关概念 字典的创建与删除 字典的遍历与访问 字典…

d3-ease 的各种方法和示例

D3.js中的d3-ease模块提供了多种缓动函数,用于实现平滑的动画过渡效果。这些缓动函数通过扭曲时间控制动画中运动的方法,使得动画更加自然和流畅。以下是D3中常见的一些ease方法和示例代码: 线性缓动(linear)&#xff…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子🌰 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API,简化了拖放操作的实现。以下是拖拽API的基本使用指南: 拖拽…

Throwable、IO流、Java虚拟机

Error和Exception stream结尾都是字节流,reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一…

lanqiao OJ 364 跳石头

这个题目的条件是移动的石头数量给定,但是最小移动距离的最大值我们不知道,所以要通过mid来“猜测”。如果当前的mid需要移动的最小石头数量超过给定数,则mid不成立,需要缩小,反之则增大mid,直至找到一个最…

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

Shell基础(7)

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团…

音视频pts/dts

现在的视频流有两个非常重要的时间戳,pts和dts,其中pts是显示的时候用,dts在解码的时候用。 pts很好理解,按照pts的顺序以及duration不间断的display就可以了。 dts在解码的时候用,那么这句话怎么理解,解…

sql server怎样用sql profiler捕获带变量值的慢sql

一 新建跟踪 点击工具-SQL Server Profiler: 点击文件-新建跟踪的按钮: 在‘事件选择’选项卡只选择如下两项内容(RPC:Completed,SQL:BatchCompleted),把多余的取消勾选: 然后勾选上面截图中右下方的‘显示…

二叉树——输出叶子到根节点的路径

目录 代码 算法思想 例子 思维拓展 代码 int LeaveBit(Bitree T,int flag,int g) {if (!T) {return 0;}if (T->rchild NULL && T->lchild NULL) {//cout << "empty:" << T->data << endl;s.push(T->data);while (!s.emp…

深入理解Spring(三)

目录 2.1.3、Spring配置非自定义Bean 1)配置Druid数据源交由Spring管理 2)配置Connection交由Spring管理 3)配置日期对象交由Spring管理 4)配置MyBatis的SqlSessionFactory交由Spring管理 2.1.4、Bean实例化的基本流程 1)Bean信息定义对象-BeanDefinition 2)DefaultLi…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

SpringBoot,IOC,DI,分层解耦,统一响应

目录 详细参考day05 web请求 1、BS架构流程 2、RequestParam注解 完成参数名和形参的映射 3、controller接收json对象&#xff0c;使用RequestBody注解 4、PathVariable注解传递路径参数 5、ResponseBody&#xff08;return 响应数据&#xff09; RestController源码 6、统一响…

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题

原文地址Linux&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…

线程池的实现与应用

一、线程池 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用&#xff0c…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…

优先级队列PriorityQueue(堆)

1. 优先级队列 队列是一种先进先出的数据结构,而如果我们操作的数据带有优先级,我们出队的时候就会先出队优先级最高的元素.比如打游戏的时候有人给你打电话,操作系统看来有俩个进程,优先会处理打电话. 主要功能 1> 返回最高优先级对象 2> 添加新的对象 2. 堆的概念 2.1 …

【AI】人工智能报告解读——中国人工智能的发展

自 2016 年 AlphaGo 与世界顶级围棋选手对战后&#xff0c;AI 概念和技术从此走入大众视野。2017 年&#xff0c;国务院颁布《新一代人工智能发展规划》&#xff0c;这是中国在人工智能领域第一个部署文件&#xff0c;确定了人工智能产业发展的总体思路、战略目标和任务。技术和…