Scrapy是一个应用程序框架,用于抓取web站点和提取结构化数据,这些数据可以用于广泛的应用,如数据挖掘、信息处理。尽管Scrapy最初是为web抓取而设计的,但它也可以使用api(比如Amazon Associates的web服务)或作为一个通用的web爬虫程序来提取数据。

1 环境安装

最初Scrapy是不支持python3的,现在已经支持了,所以我们主要还是使用python3来实现。

1.1Ubuntu 14.04 或以上版本安装

主要注意相关依赖包其它linux版本基本相似(会玩linux,这个都是小菜一碟,不多讲解)

sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

sudo apt-get install python3 python3-dev

pip install scrapy

1.2 windows上安装

windows上安装稍微复杂一点,首先要安装Anaconda,Anaconda下载地址:
百度网盘下载 密码:3kjd 官网下载地址
Anaconda安装很简单,就是下一步,下一步即可,安装完后一定要记得配置环境变量,不然也会出错,配置步骤如下:
运维学python之爬虫高级篇(一)Scrapy框架入门_第1张图片
按照箭头方向配置即可,注意Anaconda安装的路径要与你的安装路径对应。配置完成后直接cmd,后运行命令:

conda install  scrapy

如下图:
运维学python之爬虫高级篇(一)Scrapy框架入门_第2张图片
选择Y回车
运维学python之爬虫高级篇(一)Scrapy框架入门_第3张图片
Scrapy就安装完成了。

2 Scrapy使用

2.1 创建一个项目

在开始爬取之前,您必须创建一个新的Scrapy项目。 进入你打算存储代码的目录中,运行下列命令:

scrapy startproject tutorial

如图:
运维学python之爬虫高级篇(一)Scrapy框架入门_第4张图片
创建完成后的目录结构如下:
运维学python之爬虫高级篇(一)Scrapy框架入门_第5张图片

2.2 pycharm中调试scrapy代码

如果在pycharm中调试scrapy,需要安装scrapy,在安装scrapy之前还有几个依赖文件也要安装,如下:

  • zope.interface
  • pyOpenSSL
  • twisted 我下载的版本地址 更多版本地址
  • liblxml2dom
  • lxml

twisted报错
这些包都可以用pycharm插件工具安装,但其中安装twisted时候会出现报错,报错内容大概如下:

building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

twisted报错解决办法如下:

下载twisted对应版本的whl文件(如我的Twisted‑17.5.0‑cp36‑cp36m‑win_amd64.whl)下载地址上文已经给出,cp后面是python版本,amd64代表64位,运行命令,注意Twisted文件的路径:
pip install Twisted-17.5.0-cp36-cp36m-win_amd64.whl

解决上面报错后在pip install scrapy就OK了。

pycharm无法直接调试scrapy
pycharm是无法直接调试scrapy的,需要我们在项目中做一些配置,配置如下图:
运维学python之爬虫高级篇(一)Scrapy框架入门_第6张图片
图一
图一中quotes_spider.py名称是你自己定义的,类中的name = "quotes"名称也是自定义的
运维学python之爬虫高级篇(一)Scrapy框架入门_第7张图片
图二
然后在scrapy.cfg的同级目录下创建一个main.py文件,内容如上图,这里要注意cmdline.execute("scrapy crawl quotes".split())中的quotes要与图一中的name=“quotes”是对应的。每次执行main.py就可以了。
quotes_spider.py代码如下:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如上代码,我们的爬虫子类scrapy.Spider并定义了一些属性和方法:
name:标识爬虫。它必须在一个项目中是唯一的,不能为不同的爬虫设置相同的名称。
start_requests():必须返回一个可重复的请求(您可以返回一个请求列表,或者编写一个生成器函数),这将使爬虫开始爬行。后续请求将依次从这些初始请求中生成。
parse():将调用一个方法来处理每个请求所下载的响应。响应参数是保存页面内容的TextResponse的一个实例,并且有进一步的帮助方法来处理它。parse()方法通常解析响应,提取解析的数据,并找到新的url来跟踪和创建新的请求。
win32api报错
按照上面配置完成后,你会发现提示no module name win32api错误,这是因为没有安装win32的模块造成的
win32api报错解决办法
安装win32模块,安装有两种方式:
1.pycharm安装工具直接安装
2.下载win32包用pip install 包名 方式安装我下载的包 更多版本包
我这边pycharm直接安装是失败的,所以我用的第二种安装方式

pip install pywin32-222-cp36-cp36m-win_amd64.whl 

安装完之后问题解决,运行main.py后结果如下:
运维学python之爬虫高级篇(一)Scrapy框架入门_第8张图片

3 开始scrapy

3.1 scrapy流程及总体架构

执行完main.py后,检查当前目录中的文件,你应该注意到已经创建了两个新文件:quotes-1.html和quotes-2.html,并且带有相应的url的内容。那通过scrapy是如何工作的呢?接下来我们讲一下scrapy的工作流程及总体架构。下图描述了scrapy的架构及它的组件是如何交互的:
运维学python之爬虫高级篇(一)Scrapy框架入门_第9张图片

从上图可以看出scrapy中的数据流由执行引擎控制,流程如下:

  • 1.引擎(Engine)得到最初初始的请求,通过spiders去爬取;
  • 2.引擎(Engine)在调度器(Scheduler)中调度请求,并寻找下一个请求去爬取;
  • 3.调度程序(Scheduler)将下一个请求返回给引擎(Engine);
  • 4.引擎(Engine)将请求发送给下载器(Downloader),通过下载器(Downloader)中间件(请参阅proce***equest());
  • 5.一旦页面完成下载后,下载器(Downloader)会生成一个响应(使用该页面)并将其通过Downloader中间件发送到引擎;
  • 6.引擎(Engine)接收来自下载器(Downloader)的响应,并将其发送给spiders进行处理,通过spiders中间件;
  • 7.spiders处理响应并返回提取的items 和新请求返回到引擎,通过爬行器spider中间件;
  • 8.引擎(Engine)将处理过的项目发送到项目管道(Item Pipelines),然后将处理过的请求发送到调度程序(Scheduler),并请求下一个可能要爬取的请求;
  • 9.这个过程重复(从步骤1)直到不再有来自调度程序(Scheduler)的请求。

3.2 scrapy各组件功能

Scrapy引擎(Engine)
引擎负责控制系统的所有组件之间的数据流,当某些动作发生时触发事件
调度程序(Scheduler)
调度程序接收来自引擎的请求,并在引擎请求时对它们进行排队,以便在稍后(也对引擎)请求时提供它们
下载器(Downloader)
下载器负责获取web页面,并将它们提供给引擎,而引擎又将它们提供给spiders
Spiders
Spiders是类,它定义了一个特定的站点(或一组站点)如何被抓取,包括如何执行爬取(也就是跟踪链接)以及如何从它们的页面中提取结构化数据(例如抓取项目)。换句话说,Spiders是定义为特定站点爬行和解析页面的定制行为(或者,在某些情况下,是一组站点)的定制行为。
Item Pipeline
Item Pipeline负责处理由spiders提取出来的item,典型的处理有清理、 验证及持久化(例如存取到数据库中)。
下载器中间件(Downloader middlewares)
Downloader中间件是一种特定的钩子,它位于引擎和Downloader之间,当请求从引擎传递到Downloader时,以及从Downloader传递到引擎的响应。
Spider middlewares
Spider middlewares是位于引擎和spiders之间的特定钩子,能够处理spiders输入(响应)和输出(items和requests)。
事件驱动网络
scrapy是用Twisted编写的,它是一种流行的、用于Python的事件驱动的网络框架。因此,它是使用非阻塞(又称为异步)的并发性来实现的。

scrapy入门,这一篇就结束了,欢迎批评指正~!