• 爬虫框架scrapy的基本内容


    Scrapy介绍

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以帮助用户简单快速的部署一个专业的网络爬虫。如果说前面我们写的定制bs4爬虫是”手动挡“,那Scrapy就相当于”半自动档“的车。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
    所谓网络爬虫,就是抓取特定网站网页的HTML数据。抓取网页的一般方法是,定义一个入口页面,然后一般一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。

    整体架构

    • 引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。这个模块相当于整个框架的控制中心,他控制着所有模块的数据流交换,并根据不同的条件触发相对应的事件,同样,这个模块也是不需要我们编写的。
    • 调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。这个模块对所有的爬取请求,进行调度管理,同样也是不需要我们写的模块。通过简单的配置就能达到更加多线程,并发处理等等强大功能。
    • 下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。这个模块,是Scrapy帮我们做好的,不需要我们自己编写,直接拿来用就行,其主要功能就是从网上获取网页内容,类似于我们写的get_html函数,当然,比我们自己写的这个简单的函数要强大很多.
    • 蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
    • 项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。这个模块是需要我们手动实现的,他的主要功能是将我们爬取筛选完毕的数据写入文本,数据库等等。总之就是一个“本地化”的过程。
    • 下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
    • 蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。
    • 调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

    爬取流程

    上图绿线是数据流向,首先从初始URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回Scheduler;另一种是需要保存的数据,它们则被送到Item Pipeline那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。

    数据流

    Scrapy中的数据流由执行引擎控制,其过程如下:

    • 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。
    • 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。
    • 引擎向调度器请求下一个要爬取的URL。
    • 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。
    • 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。
    • 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。
    • Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。
    • 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。
    • (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。
    有关scrapy详细介绍,请查看官方文档中文文档
    下面上一个简单不能再简单的例子,我们以爬取zimuku.net为例,有利于进一步了解scrapy整个操作过程。
    第一步:打开电脑终端,cd到想要建立项目到文件夹,输入scrapy startproject zimuku(zimuku可以任意定义)
    我们来看一下框架
    ├── zimuku                  #外层目录
    │   ├── __init__.py         #初始化脚本    
    │   ├── __pycache__         #Python缓存文件。暂时无视
    │   ├── items.py            #Items代码模板,继承类自scrapy.Item
    │   ├── middlewares.py      #Middlewares代码模板(继承类)
    │   ├── pipelines.py        #Pipelines代码模板(继承类)
    │   ├── settings.py         #Scrapy爬虫的配置文件
    │   └── spiders             #Spiders代码模板目录 我们写爬虫的地方
    │       ├── __init__.py
    │       └── __pycache__
    └── scrapy.cfg              #部署爬虫的配置文件

    第二步:cd zimuku

    第三步:我们用命令行创建第一个Spider:scrapy genspider demo zimuku.net(demo可以任意定义,zimuku.net为要爬取到开始url)

    我们来看看demo.py

    1 # -*- coding: utf-8 -*-
    2 import scrapy
    3 
    4 class DemoSpider(scrapy.Spider):
    5     name = "demo"
    6     allowed_domains = ["zimuku.net"]
    7     start_urls = ['http://zimuku.net/']
    8     def parse(self, response):
    9         pass

    可以看到Scrapy已经帮我们把爬虫的框架写好了,我们只要在这个框架的基础上进行进一步的定制就可以了。

    下面我们定制属于自己到内容:

    编写demo.py
    # -*- coding: utf-8 -*-
    import scrapy
    
    class DemoSpider(scrapy.Spider):
        name = "demo"
        allowed_domains = ["zimuku.net"]
        start_urls = ['http://zimuku.net/']
    
        def parse(self, response):
            '''
            parse()函数接收Response参数,就是网页爬取后返回的数据
            用于处理响应,他负责解析爬取的内容
            生成解析结果的字典,并返回新的需要爬取的请求
            '''
            name = response.xpath('//b/text()').extract()[1]
            items = {'name':name}
            with open('name.txt','w') as f:
                f.write(str(items))

    好了,下面我们在终端运行,scrapy crawl demo

    终端出现

    INFO: Spider closed (finished)

    表示爬取结束,我们打开项目文件夹,可以查看到name.txt文件,打开可以看到里面爬取到内容了。

    OK,通过这个super简单的小例子,我们知道了Scrapy框架到底是如何运作的,
    大家一定要跟着敲一遍才能更加熟悉哦。

     

    参考资料:
    链接:http://www.jianshu.com/p/a8aad3bf4dc4
         https://zhuanlan.zhihu.com/p/26854842
  • 相关阅读:
    nova 注入adminpass 添加用户等设置
    mysql 集群 avc error
    openstack novnc console haproxy mitaka
    NFS金陵科技学院
    windows下命令行格式化U盘
    linux下安装mysql
    连表查询
    查询语句
    索引
    插入,更新与删除数据
  • 原文地址:https://www.cnblogs.com/freeman818/p/7211448.html
Copyright © 2020-2023  润新知