带你读《从零开始学Scrapy网络爬虫》之三:Scrapy框架介绍

简介: 本书共13章。其中,第1~4章为基础篇,介绍了Python基础、网络爬虫基础、Scrapy框架及基本的爬虫功能。第5~10章为进阶篇,介绍了如何将爬虫数据存储于MySQL、MongoDB和Redis数据库中;如何实现异步AJAX数据的爬取;如何使用Selenium和Splash实现动态网站的爬取;如何实现模拟登录功能;如何突破反爬虫技术,以及如何实现文件和图片的下载。第11~13章为高级篇,介绍了使用Scrapy-Redis实现分布式爬虫;使用Scrapyd和Docker部署分布式爬虫;使用Gerapy管理分布式爬虫,并实现了一个抢票软件的综合项目。

点击查看第一章
点击查看第二章

第3章 Scrapy框架介绍

  Scrapy是一个为了爬取网站信息,提取结构性数据而编写的应用框架。Scrapy用途广泛,可用于数据挖掘、监测和自动化测试等。

3.1 网络爬虫原理

  网络爬虫的英文为Web Spider,又称做网络蜘蛛或网络机器人。如果把互联网比喻成一张巨大的蜘蛛网,数据便是存放于蜘蛛网中的各个节点,爬虫就是网中爬行的蜘蛛,沿着网络抓取自己的猎物(数据)。
  网络爬虫简单来说就是一种按照一定规则,自动地抓取互联网中信息的程序或脚本。

3.1.1 爬虫执行的流程

  我们知道,网络爬虫执行的基本流程是:模拟用户使用浏览器向网站发送请求,网站响应请求后将网页文档发送过来,爬虫对网页做信息提取和存储。具体流程如图3-1所示。
image.png

图3-1 爬虫执行流程

  图3-1中的爬虫执行流程,介绍如下:
  (1)发送请求。
  爬虫设定一个URL,模拟浏览器使用HTTP协议向网站服务器发送访问请求。
  (2)获取HTML文档。
  服务器接收到请求后,将HTML文档(或者图片、视频等其他资源)发送给爬虫。
  (3)抽取数据。
  爬虫使用XPath或BeautifulSoup从HTML文档中抽取出有用的数据。
  (4)保存数据。
  将抽取到的数据保存到文件(CSV、JSON、TXT等)或数据库(MySQL、MongoDB等)中,实现数据的持久化存储。
  上面流程中的每一步,看似简单,但实现起来着实不易。如何伪装成浏览器?如何构造一个HTTP请求发送给网站服务器?如何获取网站服务器发送的HTML文档?如何抽取HTML数据?如何将每一个步骤关联起来?种种问题,在学习Scrapy爬虫框架后,都能轻松解决。还等什么呢?下面开始我们的Scrapy学习之旅吧!

3.2 Scrapy框架结构及执行流程

  Scrapy框架结构和流程设计遵循网络爬虫的基本原理。通过组件封装不同的功能模块;通过请求和响应类封装数据流;通过引擎指挥整个系统协调运行。

3.2.1 Scrapy框架结构

  理解了HTTP和爬虫的基本原理,就不难理解Scrapy的框架结构了。如图3-2所示为Scrapy的框架结构,包含了不同功能的组件、系统中发生的数据流及执行流程。
  1.组件
  下面简单介绍一下Scrapy框架结构中包含的组件。

  • 引擎(Engine)
      引擎犹如总指挥,是整个系统的“大脑”,指挥其他组件协同工作。
  • 调度器(Scheduler)
      调度器接收引擎发过来的请求,按照先后顺序,压入队列中,同时去除重复的请求。
  • 下载器(Downloader)
      下载器用于下载网页内容,并将网页内容返回给爬虫(Scrapy下载器是建立在twisted这个高效的异步模型上的)。
  • 爬虫(Spiders)
      爬虫作为最核心的组件,用于从特定的网页中提取需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
    image.png

图3-2 Scrapy框架结构

  • 项目管道(Item Pipelines)
      项目管道负责处理爬虫从网页中抽取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息等。
  • 下载器中间件(Downloader Middlewares)
      下载器中间件介于引擎和下载器之间,主要处理Scrapy引擎与下载器之间的请求及响应。
  • 爬虫中间件(Spider Middlewares)
      爬虫中间件介于引擎和爬虫之间,主要工作是处理爬虫的响应输入和请求输出。
      2.数据流
      Scrapy框架结构中传递和处理的数据主要有以下3种:
  • 向网站服务器发送的请求数据(请求的内容见2.1.3节);
  • 网站服务器返回的响应数据(响应的内容见2.1.4节);
  • 解析后的结构数据(类似于字典)。
      Scrapy中定义的Request和Response类,用于保存请求和响应数据;Item类保存解析后的结构数据。它们分别对应于图3-2中标识的Requests、Response和Items。

    3.2.2 Scrapy执行流程

      下面从数据流的角度介绍Scrapy框架的执行流程。
      图3-2中第①、②、③、④步,执行的是HTTP请求,传递和处理的是向网站服务器发送的请求数据。
      第①步:爬虫(Spider)使用URL(要爬取页面的网址)构造一个请求(Request)对象,提交给引擎(Engine)。如果请求要伪装成浏览器,或者设置代理IP,可以先在爬虫中间件中设置,再发送给引擎。
      第②步:引擎将请求安排给调度器,调度器根据请求的优先级确定执行顺序。
      第③步:引擎从调度器获取即将要执行的请求。
      第④步:引擎通过下载器中间件,将请求发送给下载器下载页面。
      图3-2中第⑤、⑥、⑦、⑧步,执行的是HTTP响应,传递和处理的是网站服务器返回的响应数据。
      第⑤步:页面完成下载后,下载器会生成一个响应(Response)对象并将其发送给引擎。下载后的数据会保存于响应对象中。
      第⑥步:引擎接收来自下载器的响应对象后,通过爬虫中间件,将其发送给爬虫(Spider)进行处理。
      第⑦步:爬虫将抽取到的一条数据实体(Item)和新的请求(如下一页的链接)发送给引擎。
      第⑧步:引擎将从爬虫获取到的Item发送给项目管道(Item Pipelines),项目管道实现数据持久化等功能。同时将新的请求发送给调度器,再从第②步开始重复执行,直到调度器中没有更多的请求,引擎关闭该网站。

    3.3 Scrapy安装

      Scrapy作为一个强大的爬虫框架,需要依赖于很多库。幸运的是,前面我们安装了Anaconda,它已经帮我们安装好了Scrapy所有的依赖库。因此,无论在哪个操作系统,安装Scrapy就非常简单了。

    3.3.1 使用pip安装Scrapy

      这里还是使用pip安装Scrapy框架,命令如下:
      
      >pip install scrapy

    3.3.2 常见安装错误

      因为系统环境的差异,在安装Scrapy时,有时会出现各种意想不到的错误。例如,使用pip安装Scrapy时遇到Microsoft Visual C++14.0 is required错误,如图3-3所示。
    image.png

图3-3 Scrapy安装时出现的错误

  解决方法1
  如果使用pip安装失败,可以试着使用Conda安装Scrapy,执行如下命令:
  
  >conda install -c scrapinghub scrapy
  
  安装过程中,可能会有升级Conda的提示,根据提示选择y就可以了,如图3-4所示。
image.png

图3-4 使用Conda安装Scrapy

  解决方法2
  根据提示可知,错误是由安装Twisted导致的,所以需要先安装Twisted。如图3-5所示。根据Python和操作系统的版本,选择对应的whl下载文件即可。其中,cp后面的数字是依赖的Python版本,amd64表示64位操作系统。下载完后,定位到Twisted安装包所在路径,执行以下命令安装Twisted。
  
  >pip install Twisted-19.2.0-cp35-cp35m-win_amd64.whl
image.png

图3-5 Twisted下载页


  成功安装Twisted后,就可以使用pip命令安装Scrapy了。
###3.3.3 验证安装
  Scrapy安装完成后,需要验证安装是否成功。在Python解释器界面,输入如下代码:
  
  >import scrapy
  
  运行代码后,如果没有错误提示信息,说明Scrapy已经安装成功。
##3.4 第一个网络爬虫
  正确安装Scrapy框架后,就可以创建Scrapy项目,实现第一个网络爬虫了。
###3.4.1 需求分析
  现要获取起点中文网中小说热销榜的数据(网址为 https://www.qidian.com/rank/ hotsales?style=1&page=1),如图3-6所示。每部小说提取内容为:小说名称、作者、类型和形式。
image.png

图3-6 起点中文网中24小时热销榜

3.4.2 创建项目

  首先,创建一个爬取起点中文网小说热销榜的Scrapy项目步骤如下:
  (1)通过命令行定位到存放项目的目录(如D盘的scrapyProject文件夹)。
  
  >d:
  >cd d:\scrapyProject
  
  (2)创建一个名为qidian_hot的项目,命令如下:
  
  >scrapy startproject qidian_hot
  
  回车,得到如图3-7所示的创建成功信息。
image.png

图3-7 生成Scrapy项目

  (3)查看项目结构。
  在D盘的scrapyProject目录下,自动生成了qidian_hot项目。使用PyCharm打开项目,如图3-8所示为Scrapy项目的目录结构,它对应于图3-2中Scrapy的框架结构。
image.png

图3-8 Scrapy项目框架


  Scrapy中组件的本质是一个个Python源文件,只要在源文件中实现各自的功能,爬虫功能就能自动实现了。
###3.4.3 分析页面
  通过Chrome浏览器的“开发者工具”,分析页面的HTML代码,确定数据解析的XPath方法步骤如下:
  (1)在Chrome浏览器中,按F12键,显示“开发者工具”栏。
  (2)输入网址 https://www.qidian.com/rank/hotsales?style=1&page=1,回车。
  (3)此时将显示24小时热销榜页面。选择“开发者工具”栏,单击最左边的元素选择按钮,将光标移动到任一部小说内容上并选中,对应的HTML代码
就会被高亮显示,具体操作如图3-9所示。
  (4)分析页面结构。
  不难发现,每部小说都包裹在
元素中,逐层展开,就能定位到小说名称、作者、类型和形式。
小说名称:div(class=" book-mid-info ") → h4 → a → 文本。 作者:div(class=" book-mid-info ") → p(第1个)→ a(第1个)→ 文本。
类型:div(class=" book-mid-info ") → p(第1个)→ a(第2个)→ 文本。 形式:div(class=" book-mid-info ") → p(第1个)→ span → 文本。
  使用XPath获取小说内容,语法如下:
小说名称:div[@class=" book-mid-info "]/ h4/a/text()。 作者:div[@class=" book-mid-info "]/ p[1]/a[1]/text()。
类型:div[@class=" book-mid-info "]/ p[1]/a[2]/text()。 形式:div[@class=" book-mid-info "]/ p[1]/span/text()。
image.png

图3-9 获取小说内容对应的HTML代码

3.4.4 实现Spider爬虫功能

  下面实现爬虫功能。由图3-8得知,爬虫功能是在spiders目录下实现的。实现的步骤如下:
  (1)在spiders目录下新建爬虫源文件qidian_hot_spider.py。
  (2)在qidian_hot_spider.py文件中定义HotSalesSpider类,实现爬虫功能。
  实现代码如下:
  
  #--coding:utf-8--
  from scrapy import Request
  from scrapy.spiders import Spider
  class HotSalesSpider(Spider):
   #定义爬虫名称
   name = 'hot'
   #起始的URL列表
   start_urls = ["https://www.qidian.com/rank/hotsales?style=1"]
   #解析函数
   def parse(self, response):
   #使用xpath定位到小说内容的div元素,保存到列表中
   list_selector = response.xpath("//div[@class='book-mid-info']")
   #依次读取每部小说的元素,从中获取名称、作者、类型和形式
   for one_selector in list_selector:
   #获取小说名称
   name = one_selector.xpath("h4/a/text()").extract()[0]
   #获取作者
   author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]
   #获取类型
   type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]
   #获取形式(连载/完本)
   form = one_selector.xpath("p[1]/span/text()").extract()[0]
   #将爬取到的一部小说保存到字典中
   hot_dict = {"name":name, #小说名称
   "author":author, #作者
   "type":type, #类型
   "form":form} #形式
   #使用yield返回字典
   yield hot_dict
  
  以上代码虽然添加了不少注释,但相信大家理解起来还是有点困难。不用担心,下一章将会详细讲解,这里先成功运行一个爬虫,建立信心和整体认识即可。
  下面简单说明HotSalesSpider的实现方法。

  • 爬虫所有的功能都是在类HotSalesSpider中实现的,它的基类为Spider。
  • 类中定义了两个属性:name和start_urls。其中,name为爬虫名称,运行爬虫时需要用到;start_urls中存储的是目标网址的列表。如想要爬取两页热销榜的小说信息,可以将start_urls修改为:
      
      start_urls = ["https://www.qidian.com/rank/hotsales?style=1",
       "https://www.qidian.com/rank/hotsales?style=1&page=3"]
      
      类中定义了一个方法parse(),这是爬虫的核心方法,通常完成两个任务:
  • 提取页面中的数据。
  • 提取页面中的链接,并产生对链接页面的下载请求。

    3.4.5 运行爬虫

      代码完成后,就可以使用命令执行爬虫了。
      (1)通过命令行定位到qidian_hot项目目录下(很重要)。
      >d:
      >cd D:\scrapyProject\qidian_hot
      
      (2)输入爬虫执行命令(hot为爬虫名,hot.csv为保存数据的文件名)。
      
      >scrapy crawl hot -o hot.csv
      
      回车,爬虫程序开始执行,命令提示符中会不断显示爬虫执行时的信息。爬虫执行完后,数据会自动保存于hot.csv文件中。打开hot.csv文件查看数据,如图3-10所示。
    image.png

图3-10 生成的CSV文件

 需要特别注意的是,爬虫程序不能频繁执行。因为网站一般都有反爬虫措施,如频繁执行会被认定是爬虫程序,网站就会封掉你的IP,禁止访问。关于这个问题,下一章会给出解决方案。

3.4.6 常见问题

  在生成的CSV文件中,有时会发现数据之间会有空行间隔,如图3-11所示。
image.png

图3-11 有空行的CSV文件


  原因:这是Scrapy框架默认的组织形式,即数据之间以空行间隔。
  解决方法:修改默认的组织形式。在Anaconda中找到exporters.py(笔者的是在C:\Anaconda3\Lib\site-packages\scrapy目录下)。打开源文件,在类CsvItemExporter中添加一行代码,如图3-12所示。保存文件,重新运行爬虫程序。
image.png

图3-12 手动添加换行形式

3.5 本 章 小 结

  本章首先介绍了网络爬虫的原理;接着介绍了Scrapy框架结构、执行流程及安装过程;最后以爬取起点中文网小说24小时热销榜为例,实现了第一个Scrapy爬虫案例,让大家对Scrapy爬虫有个初步的认识。

相关文章
|
8月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
184 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
12月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1315 0
分布式爬虫框架Scrapy-Redis实战指南
|
6月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
163 1
|
6月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
423 0
|
6月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
253 0
|
9月前
|
机器学习/深度学习 API TensorFlow
BayesFlow:基于神经网络的摊销贝叶斯推断框架
BayesFlow 是一个基于 Python 的开源框架,利用摊销神经网络加速贝叶斯推断,解决传统方法计算复杂度高的问题。它通过训练神经网络学习从数据到参数的映射,实现毫秒级实时推断。核心组件包括摘要网络、后验网络和似然网络,支持摊销后验估计、模型比较及错误检测等功能。适用于流行病学、神经科学、地震学等领域,为仿真驱动的科研与工程提供高效解决方案。其模块化设计兼顾易用性与灵活性,推动贝叶斯推断从理论走向实践。
276 7
BayesFlow:基于神经网络的摊销贝叶斯推断框架
|
10月前
|
数据采集 存储 监控
Scrapy框架下地图爬虫的进度监控与优化策略
Scrapy框架下地图爬虫的进度监控与优化策略
|
11月前
|
数据采集 存储 Web App开发
轻量级爬虫框架Feapder入门:快速搭建企业级数据管道
本教程基于Feapder框架,讲解如何构建轻量级爬虫采集豆瓣电影数据。通过配置代理IP、Cookie与User-Agent,实现企业级数据管道能力,包括动态请求与信息提取(如电影名称、导演、演员等)。适合具备Python基础及爬虫原理知识的读者,提供从环境搭建到代码实现的完整流程,并分析常见错误与解决方法,助力高效开发。
504 1
轻量级爬虫框架Feapder入门:快速搭建企业级数据管道
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
371 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
288 10