一文了解常见的Python爬虫框架Scrapy

简介: 爬虫框架:Scrapy

image.png


#01、爬虫框架:Scrapy

按照官方的说法,Scrapy是一个“为了爬取网站数据,提取结构性数据而编写的Python应用框架,可以应用在包括数据挖掘、信息处理或存储历史数据等各种程序中”。Scrapy最初是为了网页抓取而设计的,也可以应用在获取API所返回的数据或者通用的网络爬虫开发之中。作为一个爬虫框架,可以根据自己的需求十分方便地使用Scrapy编写出自己的爬虫程序。毕竟要从使用Requests(请求)访问URL开始编写,把网页解析、元素定位等功能一行行写进去,再编写爬虫的循环抓取策略和数据处理机制等其他功能,这些流程做下来,工作量其实也是不小的。使用特定的框架有助于更高效地定制爬虫程序。作为可能是最流行的Python爬虫框架,掌握Scrapy爬虫编写是在爬虫开发中迈出的重要一步。从构件上看,Scrapy这个爬虫框架主要由以下组件组成。

① 引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务,是框架的核心。

② 调度器(Scheduler): 用来接收引擎发过来的请求, 将请求放入队列中, 并在引擎再次请求的时候返回。它决定下一个要抓取的网址, 同时担负着网址去重这一项重要工作。

③ 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给爬虫。下载器的基础是twisted,一个Python网络引擎框架。

④ 爬虫(Spiders): 用于从特定的网页中提取自己需要的信息, 即Scrapy中所谓的实体(Item)。也可以从中提取出链接,让Scrapy继续抓取下一个页面。

⑤ 管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化信息、验证实体的有效性、清洗信息等。

⑥ 下载器中间件(Downloader Middlewares): Scrapy引擎和下载器之间的框架,主要处理Scrapy引擎与下载器之间的请求及响应。

⑦ 爬虫中间件(Spider Middlewares): Scrapy引擎和爬虫之间的框架,主要工作是处理爬虫的响应输入和请求输出。

⑧ 调度中间件(Scheduler Middewares): Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

它们之间的关系示意如图1所示。

image.png


■ 图1 Scrapy架构

可以通过pip十分轻松地安装Scrapy,安装Scrapy首先要使用以下命令安装lxml库:pip install lxml。

如果已经安装lxml,那就可以直接安装Scrapy:pip install scrapy。

在终端中执行命令(后面的网址可以是其他域名,如www.baidu.com):scrapy shell www.douban.com。

可以看到Scrapy shell的反馈,如图2所示。

image.png


■ 图2 Scrapy shell的反馈

为了在终端中创建一个Scrapy项目,首先进入自己想要存放项目的目录下,也可以直接新建一个目录(文件夹),这里在终端中使用命令创建一个新目录并进入:

mkdir newcrawler
cd newcrawler/

之后执行Scrapy框架的对应命令:

scrapy startproject newcrawler

会发现目录下多出了一个新的名为newcrawler的目录。其中items.py定义了爬虫的“实体”类,middlewares.py是中间件文件,pipelines.py是管道文件,spiders文件夹下是具体的爬虫,scrapy.cfg则是爬虫的配置文件。然后执行新建爬虫的命令:

scrapy genspider DoubanSpider douban.com

输出为:

Created spider'DoubanSpider'using template basic

不难发现,genspider命令就是创建一个名为DoubanSpider的新爬虫脚本,这个爬虫对应的域名为douban.com。在输出中发现了一个名为basic的模板,这其实是Scrapy的爬虫模板。进入DoubanSpider.py中查看(见图3)。

image.png


■ 图3 DoubanSpider.py

可见它继承了 scrapy.Spider 类,其中还有一些类属性和方法。name用来标识爬虫。它在项目中是唯一的,每一个爬虫有一个独特的name。parse是一个处理 response 的方法,在Scrapy中,response 由每个 request 下载生成。作为parse方法的参数,response是一个 TextResponse 的实例,其中保存了页面的内容。start_urls列表是一个代替start_requests()方法的捷径,所谓的start_requests方法,顾名思义,其任务就是从 url生成 scrapy.Request 对象,作为爬虫的初始请求。之后会遇到的Scrapy爬虫基本都有着类似这样的结构。

为了定制Scrapy爬虫,要根据自己的需求定义不同的Item,例如,创建一个针对页面中所有正文文字的爬虫,将Items.py中的内容改写为:

class TextItem( scrapy.Item):
# define the fields for your item here like:text = scrapy.Field()

之后编写DoubanSpider.py:

# 一*一coding: utf-8 --
import scrapy
from scrapy.selector import Selectorfrom ..items import TextItem
class DoubanspiderSpider( scrapy.Spider):name = 'DoubanSpiderallowed domains = douban.com']start_urls =['https://www.douban.com/']
def parse( self,response):item = TextItem()hltext = response.xpath( '//a/text()').extract()print("Text is"+.join(hltext))item['text'] = hltext
return item

这个爬虫会先进入start_urls列表中的页面(在这个例子中就是豆瓣网的首页),收集信息完毕后就会停止。response.xpath('//a/text()').extract()这行语句将从response(其中保存着网页信息)中使用xpath语句抽取出所有“a”标签的文字内容(text)。下一句会将它们逐一打印。

运行爬虫的命令是:

scrapy crawl spidername

其中,spidername是爬虫的名称,即爬虫类中的name属性。

程序运行并进行爬取后,可以看到Scrapy爬取时的Log输出,通过Log内容可以看到爬取的进度以及结果。由于爬取目标网站的一些反爬措施,如限制USER_AGENT,因此在允信之前可能还需要在setting.py中修改一些配置,如USER_AGENT等。

值得一提的是,除了简单的scrapy.Spider,Scrapy还提供了诸如CrawlSpider、csvfeed等爬虫模板,其中CrawlSpider是最为常用的。另外,Scrapy的Pipeline和Middleware都支持扩展,配合主爬虫类使用将取得很流畅的抓取和调试体验。

当然,Python爬虫框架当然不止Scrapy一种,在其他诸多爬虫框架中,还值得一提的是PySpider、Portia等。PySpider是一个“国产”的框架,由国内开发者编写,拥有一个可视化的Web界面来编写调试脚本,使得用户可以进行诸多其他操作,如执行或停止程序、监控执行状态、查看活动历史等。除了Python,Java语言也常常用于爬虫的开发,比较常见的爬虫框架包括Nutch、Heritrix、WebMagic、Gecco等。爬虫框架流行的原因,就在于开发者需要“多、快、好、省”地完成一些任务,如爬虫的URL管理、线程池之类的模块,如果自己从零做起,势必需要一段时间的实验、调试和修改。爬虫框架将一些“底层”的事务预先做好,开发者只需要将注意力放在爬虫本身的业务逻辑和功能开发上。大家感兴趣的话可以继续了解如PySpider这样的新框架。

目录
相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
364 1
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
293 0
|
2月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
472 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
198 0
|
5月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
135 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
5月前
|
JSON 监控 BI
拼多多批量下单工具,拼多多买家批量下单软件,低价下单python框架分享
使用Selenium实现自动化操作流程多线程订单处理提升效率
|
5月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
3月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
115 1
|
3月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
194 0
|
5月前
|
JSON 数据安全/隐私保护 数据格式
拼多多批量下单软件,拼多多无限账号下单软件,python框架仅供学习参考
完整的拼多多自动化下单框架,包含登录、搜索商品、获取商品列表、下单等功能。

推荐镜像

更多