美文网首页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