Python爬虫基础之Scrapy框架详解

目录

  • 1. 简介
  • 2. Scrapy的安装
  • 3. Scrapy的架构
  • 4. Scrapy的数据流程
  • 5. Scrapy开发流程
    • 5.1 创建项目
    • 5.2 创建Spider
    • 5.3 创建Item
    • 5.4 编写Spider
    • 5.5 运行Spider
  • 参考文献

原文地址:https://program-park.top/2023/12/01/reptile_5/

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

1. 简介

  Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架,是目前 Python 中最受欢迎的爬虫框架之一,简单、方便、易上手。 它的应用领域很多,比如网络爬虫开发、数据挖掘、数据监测、自动化测试等。
  Scrapy 吸引人的地方在于它是一个框架,将 request (异步调度和处理)、下载器(多线程的 Downloader)、解析器(selector)和 twisted(异步处理)等封装在一起,任何人都可以根据需求方便的修改项目。它也提供了多种类型爬虫的基类,如 BaseSpider、sitemap 爬虫等,最新版本又提供了 Web2.0 爬虫的支持。
  官方网址是 https://scrapy.org/

2. Scrapy的安装

  使用 pip 直接安装:

pip install scrapy

  Scrapy 依赖的库比较多,比如 lxml、Twisted、pyOpenSSL 等等,我这边的建议是,先执行pip install scrapy命令,查看安装提示是否报错,如报错就根据报错信息将缺少的依赖用 pip 安装即可,这些对于开发人员是属于最基本的东西,所以我就不放详细过程了。

3. Scrapy的架构

  架构组件:

  • Engine(引擎): 处理整个系统的数据流处理、触发事务,是整个框架的核心、调度中心,相当于爬虫的 “大脑”。
  • Item(项目): 它定义了爬取结果的数据结构,爬取的数据会被赋值成该 Item 对象,也就是我们对数据进行后期过滤或存储的地方。
  • Scheduler(调度器): 简单来说就是一个队列,接受引擎发过来的请求并将其加入队列中,在引擎再次请求的时候将请求提供给引擎。
  • Downloader(下载器): 负责下载引擎发送过来的所有 request 请求,并将获得的 response 内容返回给引擎,再由引擎将 response 交管给 Spiders 来进行解析。
  • Spiders(爬虫): 负责处理所有的 response,从中解析数据,其内定义了爬取的逻辑和网页的解析规则 ,并将需要跟进的 URL 提交给引擎,再次进入 Scheduler。
  • Item Pipeline(项目管道): 就是我们封装去重类、存储类的地方,负责处理 Spiders 中获取到的数据并且进行后期的处理,过滤或者存储等等,当页面被爬虫解析所需的数据存入 Item 后,将被发送到 Pipeline,并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。
  • Downloader Middlewares(下载器中间件): 可以当做是一个可自定义扩展下载功能的组件,是在引擎及下载器之间的特定钩子(specific hook),主要处理引擎与下载器之间的请求及响应。通过设置下载器中间件可以实现爬虫自动更换 user-agent、IP 等功能。
  • Spider Middlewares(爬虫中间件): 在引擎及 Spider 之间的特定钩子(specific hook),主要处理 Spider 的输入(response)和输出(items 及 requests)。自定义扩展、引擎和 Spider 之间通信功能的组件,通过插入自定义代码来扩展 Scrapy 功能。

  注意:所有模块(除引擎外)之间是相互独立的,只跟引擎进行交互,并不能直接互相交互。即各大组件(除引擎)之间一定是不能够直接进行交流的。

4. Scrapy的数据流程

  1. Engine 首先打开一个网站,找到处理该网站的 Spider ,并向该 Spider 获取第一个要爬取的 URL。
  2. Engine 从 Spider 处获取到第一个要爬取的 URL ,并通过 Scheduler 以 Request 的形式调度。
  3. Engine 向 Scheduler 请求下一个要爬取的 URL。
  4. Scheduler 返回下一个要爬取的 URL 给 Engine,Engine 将 URL 通过 Downloader Middlewares 转发给 Downloader下载。
  5. 一旦页面下载完毕, Downloader 生成该页面的 Response,并将其通过 Downloader Middlewares 发送给 Engine。
  6. Engine 从下载器中接收到 Response,并将其通过 Spider Middlewares 发送给 Spider 处理。
  7. Spider 处理 Response ,并返回爬取到的 Item 及新的 Request 给 Engine。
  8. Engine 将 Spider 返回的 Item 给 Item Pipeline,将新的 Request 给 Scheduler。
  9. 重复第2步到第8步,直到 Scheduler 中没有更多的 Request,Engine 关闭该网站,爬取结束。

  用户只需要将自己的爬取请求输入到对应的 Spider 中,同时将自己对文件的加工请求写入到对应的 Item Pipeline 中,所以一般使用 Scrapy 框架都只修改 Spider 和 Item Pipeline。

5. Scrapy开发流程

  下面以爬取慕课网免费课程(https://www.imooc.com/course/list)第一页信息为例概述开发 Scrapy 项目的流程。

5.1 创建项目

  进入待创建项目所在的文件夹下,执行scrapy startproject MyReptile命令创建项目,MyReptile是项目名称。

  在 PyCharm 中点击File,选择Open,找到刚刚创建的项目并打开:

  打开项目之后可以看到,我们创建的项目目录结构如下:

5.2 创建Spider

  Spider 是自定义的类,Scrapy 用它从网页中抓取数据,并解析抓取的结果。这个类必须继承 Scrapy 提供的 Spider 类scrapy.Spider,并定义 Spider 的名称和起始请求,以及怎样处理爬取结果的方法,
  进入刚刚创建的文件夹,执行命令scrapy genspider myspider www.imooc.com创建一个 Spider,myspider是 Spider 名称,www.imooc.com是网站域名。


  执行完毕之后,spiders文件夹下就生成了一个myspider.py文件:

  文件代码中有三个属性和一个方法:

  • name: 每个 spider 的名字,用来区分不同的 spider;
  • allowed_domains: 允许爬取的域名,如果初始或后续的请求链接不是这个域名下的就会被过滤掉;
  • start_urls: Spider 在启动时进行爬取的 URL 列表,也就是爬虫的起始地址,可以是多个 URL,一般是一个,后续的 URL 则从初始的 URL 获取到的 response 中提取;
  • parse(): 被调用时,每个初始 URL 完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据,提取数据(生成 item)以及生成需要进一步处理的 URL 的 Request 对象。

5.3 创建Item

  创建完 Spider 文件之后,接着定义一个容器来保存要爬取的数据,我们对items.py文件进行更改或者创建一个新的文件来定义 item 都行。
  创建 Item 需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 的字段。例如我们要爬取慕课网站课程的信息,包括课程名称,课程 URL,课程图片 URL,课程描述,学习人数。

import scrapyclass MyreptileItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 课程名称title = scrapy.Field()# 课程urlurl = scrapy.Field()# 课程标题图片urlimage_url = scrapy.Field()# 课程描述introduction = scrapy.Field()# 学习人数student = scrapy.Field()

5.4 编写Spider

  之后编写 Spider 中parse()的内容,parse()方法的参数 response 是 start_urls里 URL 爬取后的结果,所以在parse()中,我们可以直接对 response 的内容进行解析:

import scrapy# 引入容器
from MyReptile.items import MyreptileItemclass MyspiderSpider(scrapy.Spider):name = 'myspider'allowed_domains = ['www.imooc.com']start_urls = ['https://www.imooc.com/course/list']# 填写爬写方法def parse(self, response):# 实例化一个容器保存爬取信息item = MyreptileItem()# 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定# 先获取每个课程的divfor box in response.xpath('//div[@class="course-card-container"]/a[@target="_blank"]'):# 获取div中的课程标题# strip() 方法用于移除字符串头尾指定的字符(默认为空格)# extract()返回的所有数据,存在一个list里。extract_first()返回的是一个string,是extract()结果中第一个值。item['title'] = box.xpath('.//h3/text()').extract()[0].strip()# 获取每个div中的课程路径item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]# 获取div中的标题图片地址item['image_url'] = 'http:'+box.xpath('.//img[@data-original]').extract()[0]# 获取div中的课程简介#item['introduction'] = box.xpath('.//p[@class="course-card-desc"]/text()').extract()[0].strip()item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()# 获取div中的学生人数item['student'] = box.xpath('.//div[@class="course-card-info"]/span[2]/text()').extract()[0].strip()# 返回信息yield item

5.5 运行Spider

  执行完以上步骤后,我们可以执行命令scrapy crawl myspider运行爬虫,控制台就会给出爬取的数据。
  运行完 Scrapy 后,我们只在控制台看到了输出结果,我们可以利用 Scrapy 提供的 Feed Exports 轻松抓取输出的结果。 例如,我们想将结果保存成 csv 文件,可以在 Pycharm 的 Terminal 窗口中执行如下命令:crawl myspider -o myspider.csv
  输出格式还支持很多种,例如 json、 xml 、 pickle 、 marshal 等。 下面命令对应的输出分别为 json 、 xml 、 pickle 、 marshal 格式以及远程输出。

scrapy crawl myspider -o myspider.json
scrapy crawl myspider -o myspider.xml 
scrapy crawl myspider -o myspider.pickle 
scrapy crawl myspider -o myspider.marshal 
scrapy crawl myspider -o ftp://user:pass@ftp.example.com/myspider.csv

  其中, ftp 输出需要正确配置用户名、密码、地址、输出路径,否则会报错。

参考文献

  【1】https://zhuanlan.zhihu.com/p/598764670
  【2】https://zhuanlan.zhihu.com/p/431078183?utm_id=0
  【3】https://blog.csdn.net/weixin_52245535/article/details/128695051
  【4】https://www.cnblogs.com/hsiang/p/15139627.html
  【5】https://m.biancheng.net/view/2027.html
  【6】https://www.zhihu.com/question/439914883/answer/2607880092
  【7】https://www.jianshu.com/p/063026368b3c
  【8】https://www.coonote.com/python-note/python-scrapy-intro.html
  【9】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=90

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

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

相关文章

0Ω电阻最大过流能力及作用用途

0Ω电阻最大过流能力及作用用途 0Ω电阻过流能力0Ω电阻的作用 0Ω电阻过流能力 0Ω电阻不一定是真正的0Ω电阻,0Ω电阻存在一定的阻值偏差,主要看生产电阻厂商做哪种了。厂商都是根据电阻标准文件 EN60115-2, 里头0Ω电阻实际最大阻值有 10…

JAVA全栈开发 day15_集合(Set接口、增强For循环、Map体系)

一、增加for遍历集合 语法: for(数据类型 变量名: 数组名或集合){​ }//集合遍历 ,推荐使用增加for 1.静态导入 注意事项: 方法必须是静态注意不要和本类的方法同名,如果同名,记得加前缀,由此可…

Git——分支应用进阶

主要内容包括以下几个方面: 长期分支和短期分支的类型以及用途。多种分支模型,其中包括基于工作流的主题分支。不同分支模型的发布流程。在多个预览版程序中使用分支修复安全问题。远程跟踪分支和refspecs规范,以及默认远程版本库配置。拉取…

Mongodb 开启oplog,java监听oplog并写入关系型数据库

开启Oplog windows mongodb bin目录下找到配置文件/bin/mongod.cfg,配置如下: replication:replSetName: localoplogSizeMB: 1024双击mongo.exe 执行 rs.initiate({_id: "local", members: [{_id: 0, host: "localhost:27017"}]})若出现如…

深入理解前端路由:构建现代 Web 应用的基石(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

多线程(初阶六:单例模式)

一、单例模式的简单介绍 二、饿汉模式 三、懒汉模式 四、饿汉模式和懒汉模式的线程安全问题分析 一、单例模式的简单介绍 单例模式是一种设计模式,其中设计模式是软性的规定,与它关联的框架是硬性的规定,这些都是大佬已经设计好了的&…

QT线程的使用 循环中程序的等待

QT线程的使用 循环中程序的等待 先看效果1 pro文件2 头文件3 源文件4 ui文件先看效果 1 pro文件 QT += concurrent2 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H

简述MyBatis、MyBatis-Plus、以及MyBatis-Plus的简单运用

什么是MyBatis MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置…

集成开发环境PyCharm的使用【侯小啾python领航计划系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python领航计划系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范,需要使用eslintstylelintprettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范(即统一提交信息),需要使用pre…

Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)

文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 01 简介 在使用python开发的过程中,有时需要一些简单的数据库操作,而Peewee正是理想的选择,它是一个小巧而灵活的 Python ORM(对…

hadoop-3.3.5安装过程

准备资源三台虚拟机: 1)准备3台服务器(关闭防火墙、静态IP、主机名称) 2)安装JDK 3)配置环境变量 4)安装Hadoop 5)配置环境变量 安装虚拟机(略)--1台即…

如何删除mac苹果电脑上面的流氓软件?

在使用苹果电脑的过程中,有时候我们也会遇到一些不需要的软件。无论是因为不再需要,或者是为了释放磁盘空间,删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件! CleanMyMac X全新版下载如下: https://wm.make…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求: 默认一行展示4个卡片;当屏幕小于某个大小的时候,一行展示3个卡片;再小就展示2个;以此类推,最小就展示1个。 效果卡片样式如下图: 默认一行4个 屏幕缩小到某个阈值,一行展示…

Linux:vim的简单使用

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

iOS Class Guard 成功了,但无法区分差异

iOS Class Guard 成功了,但无法区分差异 我正在开发一个静态库,并使用 Polidea 的 iOS Class Guard 来混淆我的静态库。我按照步骤在项目的根路径中下载 obfuscate_project,更改其中所需的名称,最后在终端中运行 bash obfuscate_p…

算法通关村第六关—二叉树的层次遍历经典问题(白银)

二叉树的层次遍历经典问题 一、层次遍历简介 广度优先遍历又称层次遍历,过程如下:  层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,图里就是从左到右一层一层的去遍历二叉树&#xff0c…

学习笔记8——JUC入门基础知识

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/199561.html 进程和线程:进程是资源分配的最小单位,线程是CPU调度的最小单位 进程和线程的主要区别(总结)_进程和线程的区别-CSDN博客进程…

Flink的部署模式和运行模式

集群角色 Flink提交作业和执行任务,需要几个关键组件: 客户端:代码由客户端获取并作转换,之后提交给Jobmanager Jobmanager就是Flink集群的管事人,对作业进行中央调度管理;当从客户端获取到转换过的作业后…

NRF24L01 无线收发模块与 Arduino 的应用

NRF24L01 是一款常用的无线收发模块,与 Arduino 兼容性良好,可以用于实现无线通信和数据传输。本文将介绍如何将 NRF24L01 模块与 Arduino 配合使用,包括硬件的连接和配置,以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.…