美文网首页Scrapy
scrapy理论部分

scrapy理论部分

作者: 叶扬风起 | 来源:发表于2019-07-28 09:43 被阅读0次

    一、第一步.....先把咱学习方向定一下....

    scrapy

    二、开撸

    啥都不说,先来一张经典图.....


    Scrapy
    1. 架构

    引擎(Scrapy Engine)
      引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。同时,它也是程序的入口。

    调度器(Scheduler)
      调度器从引擎接受爬取请求(Request)并将它们入列,以便之佛引擎请求它们时提供给引擎,它是由Scrapy主进程进行自动控制的

    下载器(Downloader)
      下载器负责获取页面数据并提供给引擎,而后将网站的响应结果对象提供个蜘蛛(Spider),具体点说,下载器负责处理产生最终发出的请求对象Requet并返回的响应生Response对象传递给蜘蛛

    蜘蛛(Spiders)
      Spider是用户编写用于分析响应(Response)结果并从中提取Item(即获取Item)或额外跟进的URL的类。

    数据管道(Item Pipeline)
      Item Pipeline负责处理被Spider提取出来的Item,典型的处理有清理、验证及持久化。

    下载器中间件(Downloader middlewares)
      下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的Reponse.其提供一个简单的机制,通过插入自定义代码来扩展Scrapy的功能

    Spider中间件(Spider middlewares)
      Spider中间件是在引擎及Spiser之间的特定钩子(specific hook),处理Spider的输入(Response)和输出(Item 及 Requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy的功能

    2. 流程

    1). 引擎打开一个网站,找到处理该网站的Spider冰箱该Spider请求第一个要爬取的URL

    2). 引擎从Spider中获取第一个要爬取的URL并在调度器中一Request调度

    3). 引擎向调度器请求下一个要爬取的URL。

    4). 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求reuqest方向)转发给下载器(Downloader)。

    5). 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回Response方向)发送给引擎

    6). 引擎从下载器中接受Response并通过Spider中间件(输入方向)发送给Spider给引擎

    7). Spider处理Response并返回到的Item及(跟进的)新的Request给引擎

    8). 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器

    9). (从第二步)重复直到调度器中没有更多的Request,引擎关闭对该网站的执行进程

    三、Request和Response对象

    1. Request对象

    Request对象用来描述一个HTTP请求
    Request(url[, callback, method='GET', headers, body, cookies, meta,encoding='utf-8', priority=0, dont_filter=False, errback])

    • url(必选)
      请求页面的url地址,bytes或str类型
    • callback
      页面解析函数, Callable类型,Request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递该参数,默认调用Spider的parse方法。
    • method
      HTTP请求的方法,默认为'GET'。
    • headers
      HTTP请求的头部字典,dict类型,例如{'Accept': 'text/html', 'User-Agent':Mozilla/5.0'}。如果其中某项的值为None,就表示不发送该项HTTP头部,例如{'Cookie': None},禁止发送Cookie。
    • body
      HTTP请求的正文,bytes或str类型。
    • cookies
      Cookie信息字典,dict类型,例如{'currency': 'USD', 'country': 'UY'}。
    • meta
      Request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件Item Pipeline。其他组件可以使用Request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,详见Response的meta属性。
    • encoding
      url和body参数的编码默认为'utf-8'。如果传入的url或body参数是str类型,就使用该参数进行编码。
    • priority
      请求的优先级默认值为0,优先级高的请求优先下载。
    • dont_filter
      默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如,在多次爬取一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为True。
    • errback
      请求出现异常或者出现HTTP错误时(如404页面不存在)的回调函数。

    2. Response对象

    Response对象用来描述一个HTTP响应,Response只是一个基类,根据响应内容的不同有如下子类:
    ● TextResponse
    ● HtmlResponse
    ● XmlResponse
      当一个页面下载完成时,下载器依据HTTP响应头部中的Content-Type信息创建某个Response的子类对象。我们通常爬取的网页,其内容是HTML文本,创建的便是HtmlResponse对象,其中HtmlResponse和XmlResponse是TextResponse的子类。实际上,这3个子类只有细微的差别,这里以HtmlResponse为例进行讲解。

    • url
      HTTP响应的url地址,str类型。
    • status
      HTTP响应的状态码,int类型,例如200,404。
    • headers
      HTTP响应的头头部,类字典类型,可以调用get或getlist方法对其进行访问,例如:
    response.headers.get('Content-Type')
    response.headers.getlist('Set-Cookie')
    
    • body
      HTTP响应正文,bytes类型。
    • text
      文本形式的HTTP响应正文,str类型,它是由response.body使用response.encoding解码得到的,即
    reponse.text = response.body.decode(response.encoding)
    
    • encoding
      HTTP响应正文的编码,它的值可能是从HTTP响应头部或正文中解析出来的。

    • request
      产生该HTTP响应的Request对象。

    • meta
      即response.request.meta,在构造Request对象时,可将要传递给响应处理函数的信息通过meta参数传入;响应处理函数处理响应时,通过response.meta将信息取出。

    • selector
      Selector对象用于在Response中提取数据(选择器相关话题在后面章节详细讲解)。

    • xpath(query)
      使用XPath选择器在Response中提取数据,实际上它是response.selector.xpath方法的快捷方式(选择器相关话题在后面章节详细讲解)。

    • css(query)
      使用CSS选择器在Response中提取数据,实际上它是response.selector.css方法的快捷方式(选择器相关话题在后面章节详细讲解)。

    • urljoin(url)
      用于构造绝对url。当传入的url参数是一个相对地址时,根据response.url计算出相应的绝对url。例如,response.url为http://www.example.com/a,url为b/index.html,调用response.urljoin(url)的结果为http://www.example.com/a/b/index.html

    四、安装

    1. 安装xml和html解析库lxml
    pip install lxml
    
    2. 安装解析数字证书库pyOpenSSL
    pip install pyOpenSSL
    
    3. 安装网络传输及应用层协议库Twisted
    pip install Twisted
    
    4. 安装调用Windows API库pywin32
    pip install pywin32
    
    5. 安装scrapy
    pip install scrapy
    
    6.安装对JS的渲染库scrapy-splash

    推荐一篇安装文章:Scrapy Splash

    #配置貌似需要docker
    pip install scrapy-splash
    
    7. redis实现分布式队列爬虫scrapy-redis

    推荐安装文章:scrapy-redis

    pip install scrapy-redis
    

    五、常用命令

    #创建项目
    scrapy startproject project_name
    #使用模板创建爬虫
    scrapy genspider spider_name URL
    #运行spider_name蜘蛛
    scrapy crawl spider_name
    #调试网站
    scrapy shell URL
    #获取settings内属性名称
    scrapy settings --get 属性名称
    #手动运行单个爬虫
    scrapy runspider scrapy_cn.py
    #查看创建爬虫
    scrapy list
    #保存到外部文件格式
    scrapy crawl spider_name -o 文件名.json/.csv/.xml/.pickle/.marshal
    ...
    

    相关文章

      网友评论

        本文标题:scrapy理论部分

        本文链接:https://www.haomeiwen.com/subject/mklurctx.html