Python爬虫之scrapy框架介绍
一.什么是Scrapy?
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。
二.scrapy安装
Linux:
``pip3 install scrapy
**Windows:**
``a. pip3 install wheel
``b. 下载twisted http:``/``/``www.lfd.uci.edu``/``~gohlke``/``pythonlibs``/``#twisted
``c. 进入下载目录,执行 pip3 install Twisted‑``17.1``.``0``‑cp35‑cp35m‑win_amd64.whl
``d. pip3 install pywin32
``e. ``pip3 install scrapy
强调:如果windows10安装pip3 install Twisted‑``17.1``.``0``‑cp35‑cp35m‑win_amd64.whl失败,请自行换成32位的即可解决,网上乱七八槽的答案请绕过,本人以亲测没什么卵用!!!
提示:如果在pycharm中安装scrapy失败,两种解决办法:
1、把pycharm中的虚拟环境模式改成直接指向现在的python安装环境!
2、把python环境中的scrapy,twisted等直接复制到pycharm工程所在的虚拟环境中去!
三.基础使用
1.创建项目(cmd):scrapy startproject 项目名称
项目结构:
2.创建爬虫应用程序(cmd):
cd project_name(进入项目目录)
scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider qiubai www.qiushibaike.com)
3.编写爬虫文件:在步骤2执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:
4.设置修改settings.py配置文件相关配置:
5.执行爬虫程序(cmd):scrapy crawl 应用名称
在cmd中执行爬虫程序时要先将目录切换到我们创建的scrapy项目目录下,否则就会报:Unknown command: crawl错误!!!!!!!
小试牛刀:将糗百首页中段子的内容和标题进行爬取
执行爬虫程序:
四.scrapy持久化操作:将爬取到糗百数据存储写入到文本文件中进行存储
注意:上述代码表示的持久化操作是我们自己通过IO操作将数据进行的文件存储。在scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:
小试牛刀:将糗事百科首页中的段子和作者数据爬取下来,然后进行持久化存储
爬虫文件:qiubaiDemo.py
items文件:items.py
管道文件:pipelines.py
配置文件:settings.py
Scrapy递归爬取多页数据:
需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储
Scrapy组件:

-
-
引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心) -
调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 -
下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) -
爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 -
项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
-
-
解释:引擎首先会将爬虫文件中的起始url获取,并且提交到调度器中。如果需要从url中下载数据,则调度器会将url通过引擎提交给下载器,下载器根据url去下载指定内容(响应体)。下载好的数据会通过引擎移交给爬虫文件,爬虫文件可以将下载的数据进行指定格式的解析。如果解析出的数据需要进行持久化存储,则爬虫文件会将解析好的数据通过引擎移交给管道进行持久化存储。
面试题:如果最终需要将爬取到的数据值一份存储到磁盘文件,一份存储到数据库中,则应该如何操作scrapy?
答:
管道文件中的代码为:
在settings.py开启管道操作代码为:
五.Scrapy发起post请求:
- 问题:在之前代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢?
- 解答:其实是因为爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法就可以对start_urls列表中的url发起请求:
【注意】该方法默认的实现,是对起始的url发起get请求,如果想发起post请求,则需要子类重写该方法。
- 重写start_requests方法,让其发起post请求:
