Python爬虫自动化从入门到精通第10天(Scrapy框架的基本使用)

news/2024/7/19 12:32:09 标签: python, 爬虫, 自动化

Scrapy框架的基本使用

  • Scrapy框架简介
  • Scrapy框架的运作流程
  • 安装Scrapy框架
  • Scrapy框架的基本操作
  • Scrapy常用命令

Scrapy框架简介

Scrapy框架主要包含以下组件:

  • Scrapy Engine(引擎):负责Spiders、Item Pipeline、Downloader、Scheduler之间的通信,包括信号和数据的传递等。
  • Scheduler(调度器):负责接受引擎发过来的Request请求,并按照一定的方式进行整理排队和入队,当引擎需要时,交还给引擎。
  • Downloader(下载器):负责下载Scrapy Engine发送的所有Request(请求),并将获取到的Responses(响应)交还给Scrapy Engine,由Scrapy Engine交给Spider来处理。
  • Spider(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler。
  • Item Pipline(管道):负责处理Spider中获取到的Item数据,并进行后期处理(详细分析、过滤、存储等)。
  • Downloader Middlewares(下载中间件):是一个可以自定义扩展下载功能的组件。
  • Spider Middlewares(Spider中间件):是一个可以自定义扩展Scrapy Engine和Spiders中间通信的功能组件(例如:进入Spiders的Responses和从Spiders出去的Requsets)。

这些组件的合作,共同完成整个爬取任务。

Scrapy框架的运作流程

Scrapy的运作流程由引擎控制,其过程如下:
1)引擎向Spiders请求一个或多个要爬取的URL
2)引擎从Spiders中获取到第一个要爬取的URL,封装成Request并给调度器
3)引擎向调度器请求第一个要爬取的Request
4)调度器返回第一个要爬取的Request给引擎,引擎将Request通过下载中间件转发给下载器
5)一旦页面下载完毕,下载器便会生成一个该页面的Response,并通过下载中间件发送给引擎,如果这个Request下载失败,下载器将失败的信号返回给引擎,然后引擎告诉调度器,待会再进行下载
6)引擎从下载中间件中接受到Response并通过Spider中间件发送给Spider处理
7)Spider处理Response并返回爬取到的Item及新的Request给调度器
8)引擎将爬取到的Item给Item Pipline进行处理,并将这个Requset发送给调度器进行处理
9)从第2步开始重复,直到调度器中没有更多的Request

安装Scrapy框架

直接通过命令进行安装:pip install scrapy -i https://pypi.douban.com/simple后面加的时豆瓣源,安装的速度可以快一点。

输入【scrapy】显示如下界面就说明安装成功了

在这里插入图片描述

此时为了更加方便的使用我们的Scrapy框架,使下载速度更加流畅通顺,我们还需要安装【Twisted】异步网络框架来处理网络通信。

Twisted异步网络框架的下载安装

在这里插入图片描述

将Twisted安装文件下载到本地后,复制我们需要安装的版本的名字,在下载的Twisted文件夹中进入终端输入:pip install Twisted‑20.3.0‑cp39‑cp39‑win_amd64.whl

在这里插入图片描述

当显示这个界面时说明已经安装完成了

在这里插入图片描述

此时我们还需要安装【itemadapter】这个在我们创建框架的时候能用上,直接使用:pip install itemadapter -i https://pypi.douban.com/simple命令进行安装

在这里插入图片描述

Scrapy框架的基本操作

使用Scrapy框架制作爬虫一般需要一下步骤:
1)新建项目(Scrapy startproject xxx):创建一个新的爬虫项目
2)明确目标(编写items.py):明确想要爬取的目标
3)制作爬虫(spiders/xxspiser.py):制作爬虫,开始爬取网页
4)存储数据(pipelines.py):存储爬取内容(一般通过管道进行)

  • 新建项目
    新建一个文件夹,右击打开终端输入scrapy startproject testScrapy(这是项目名称)显示以下界面说明成功了
    在这里插入图片描述
    此时我们打开文件夹会出现下面这些.py文件

在这里插入图片描述
下面简单介绍以下这些文件的作用:
1) spiders:存储爬虫代码的目录
2) items.py:实体文件,用于定义项目的目标实体
3) middlewares.py:中间文件,用于定义Spider中间件
4) pipelines.py:管道文件,用于定义项目使用的管道
5) settings.py:设置文件,用于存储项目的设置信息

  • 明确爬取目标
    下面以知乎网页为例,爬取用户的名字和简介:

在这里插入图片描述

Scrapy使用Item(实体)来表示要爬取的数据。Item定义结构化数据字段,类似于Python中的字典dict,但是提供了一些额外的保护以减少错误。

Scrapy框架提供了基类scrapy.Item用来表示实体数据,一般需要创建一个继承自scrapy.Item的子类,并为该子类添加类型为scrapy.Field的类属性来表示爬虫项目的实体数据(可以理解成类似于ORM的映射关系)。

在Pycharm中打开mySpider目录下的items.py文件,可以看到Scrapy框架已经在items.py文件中自动生成了继承自scrapy.Item的MyspiderItem类。用户只需要修改MyspiderItem类的定义,为他添加属性即可。代码如下:

import scrapy

class TestscrapyItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    
    # 创建属性name,为用户名
    name = scrapy.Field
    
    # 创建属性title,为简介
    title = scrapy.Field
  • 制作Spiders爬取网页

使用Scrapy框架制作爬虫的第三步就是制作Spiders,也就是负责爬取和提取数据的爬虫。通常把制作Spiders分为3个步骤实现,分别是创建爬虫、运行爬虫以爬取网页和提取数据。

1)创建爬虫
首先要在项目中创建一个爬虫,创建爬虫的命令格式如下:

scrapy genspider 爬虫名称“爬虫域”

在创建爬虫的命令,需要为爬虫起一个名称,并规定该爬虫要爬取的网页域范围,也就是爬取域。

打开终端,来到当前目录的子目录spiders中,使用创建爬虫的命令创建一个名为itcast的爬虫,并指定爬取域的范围为zhihu.com代码如下:

scrapy genspider zhihui “zhihui.com”

在这里插入图片描述

这是执行完命令后的反馈

在这里插入图片描述

此时spiders文件中会增加一个刚刚命名的 zhihui.py文件

在这里插入图片描述

我们可以自己创建zhihui.py文件中的代码,只是使用命令可以免去编写固定代码的麻烦,从代码中可以看到自动创建的爬虫类名称ZhihuiSpider,它继承自scrapy.Spider类。scrapy.Spider是Scrapy提供的爬虫基类,用户创建的爬虫类都需要从该类继承,爬虫类中需要定义三个属性(name、allowed_domains、start_urls)和一个方法(parse)

1)name属性:表示这个爬虫的识别名称。爬虫的名称必须是唯一的,不同的爬虫需要定义不同的名称。
2)allow_domains属性:表示爬虫搜索的域名范围,也就是爬虫的约束区域。该属性规定爬虫只能爬取这个域名下的网页,不在该域名下的URL会被忽略。
3)start_urls属性:表示爬取的起始URL元组或列表。爬虫第一次下载的数据将会从这个URL开始,其他URL将会从这些起始URL中继承性的生成。
4)parse(self,response)方法:用于解析网络响应。该方法在每个初始URL完成下载后被调用,调用时传入从该URL返回的Response对象作为唯一的参数。

parse()方法主要有解析返回的网页数据(response.body),提取结构化数据(生成item)和生成访问下一页数据的URL请求。

下面对生成的ZhihuiSpider类进行自定义修改,首先将start_urls的值修改为需要爬取的第一个URL:

python"># 这是个元组,括号的逗号不能省略,列表也可以

start_urls = ("https://www.zhihu.com/question/594331966/answer/2980422269",)

然后我们修改parse()方法,在该方法中将响应信息转换成文本,保存在test.html文件中:

在这里插入图片描述
2)运行爬虫
ZhihuiSpider类的代码修改完成后,就可以运行zhihui爬虫来爬取网页。运行爬虫的命令格式如下:

scrapy crawl 爬虫名称

在终端中进入zhihui.py文件所在的目录,输入scrapy crawl zhihui,这里的zhihui就是使用scrapy genspider命令时确定的爬虫名称。

在这里插入图片描述
显示以下界面说明成功了

在这里插入图片描述

  • 提取数据
    前面两个步骤已经成功爬取到了网页源码,下面就可以从源代码中提取数据,要提取数据首先需要观察页面源代码,定位目标数据,分析和了解目标数据的展示结构,之后,我们就可以使用我们的Scrapy支持的Xpath解析方式进行数据提取,这时需要修改parse()方法,修改完成之后,在命令行使用scrapy crawl zhihui再次运行爬虫,就可以看到控制台打印出获取到的讲师的信息。

  • 永久性存储数据
    使用Scrapy框架制作爬虫的最后一步就是将获取到的目标数据进行永久性的存储,Scrapy保存数据最简单的方法有四种:

python"># 输出JSON格式,默认为Unicode编码
scrapy crawl 项目名 -o 文件名.json

# 输出JSON Lines格式,默认为Unicode编码
scrapy crawl 项目名 -o 文件名.jsonl

# 输出CSV格式,使用逗号表达式,可用Excel打开
scrapy crawl 项目名 -o 文件名.csv

# 输出XML格式
scrapy crawl 项目名 -o 文件名.xml

如果要对导出数据的编码格式进行设置,可以在Scrapy的管道(Item Pipeline)中进行。

Scrapy常用命令

命令用途命令格式
创建项目scrapy startproject 项目名称
创建爬虫scrapy genspider 爬虫
运行爬虫scrapy crawl 爬虫名称
保存数据scrapy crawl 爬虫名称 -o 文件名.格式

http://www.niftyadmin.cn/n/220780.html

相关文章

“微天气” - 一个基于微信小程序的智能天气预报体验

“微天气” - 一个基于微信小程序的智能天气预报体验 一、引言 微信小程序是一种不用下载就能使用的应用,也是一项创新,经过将近两年的发展,已经构造了新的微信小程序开发环境和开发者生态。微信小程序也是这么多年来中国IT行业里一个真正能…

类中的那点事

c入门必看类类的基本介绍类的实例化类的6个默认成员函数构造函数析构函数拷贝构造函数赋值重载静态成员友元类 类的基本介绍 class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类…

adaboost单步预测数据分析

前言 LSTM 航空乘客预测单步预测的两种情况。 简单运用LSTM 模型进行预测分析。加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制,将两者进行结合预测。多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模型进行预测分析。双向LSTM 对航空乘…

StorageManagerService.java中的mVold.mount

android源码:android-11.0.0_r21(网址:Search (aospxref.com)) 一、问题 2243行mVold.mount执行的是哪个mount函数? 2239 private void mount(VolumeInfo vol) { 2240 try { 2241 // TOD…

基于Chatbot UI 实现ChatGPT对话-V1.0

基于Chatbot UI 实现ChatGPT对话-V1.0 前端基于开源项目:chatbot-ui进行二次开发,感兴趣的小伙伴可以自行研究。 本项目搭建初衷:在无法科学上网的情况下,实现ChatGPT对话。还有规避官方聊天时,长时间无链接导致的问题…

数据结构-排序3(终章)

前言: 上一章,对交换排序的冒牌和快排做了复盘,这一章对,归并排序以及非比较排序中的计数排序做一个复盘。 目录 2.4归并排序 2.4.1规定递归 2.4.2归并非递归 2.5非比较排序 2.5.1计数排序 2.6排序的稳定性分析 2.6.1冒…

谷歌云服务器centos9的docker部署chat-web,实现自己的ChatGPT

谷歌云服务器centos9的docker部署chat-web,实现自己的ChatGPT 前提条件:准备一个境外服务器和chatgpt的key。(网上教程很多) 1.更新yum yum update2.下载docker-ce的repo curl https://download.docker.com/linux/centos/dock…

Java基础(八)异常处理

1. 异常概述 1.1 什么是生活的异常 男主角小明每天开车上班,正常车程1小时。但是,不出意外的话,可能会出现意外。 出现意外,即为异常情况。我们会做相应的处理。如果不处理,到不了公司。处理完了,就可以…