阁下如此厉害,那鄙人只好入门“Scrapy“了!!!!

Scrapy 简介

Scrapy 是用纯 Python 实现一个为了爬取网站数据、提取结构性数据而编写的应用框架, 用途非常广泛。
框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 内容以及各种图片,非常之方便。
Scrapy 使用了 Twisted(其主要对手是 Tornado)异步网络框架来处理网络通讯,可以加快 我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成 各种需求。

Scrapy 架构图

(一)Scrapy 架构图

如下所示:绿线是数据流向
在这里插入图片描述

  • Scrapy Engine(引擎):负责 spider、ItemPipeline、Downloader、Scheduler 中间的通讯, 信号、数据传递等。 
  • Scheduler(调度器):它负责接受引擎发送过来的 Request 请求,并按照一定的方式进 行整理排列,入队,当引擎需要时,交还给引擎。 
  • Downloader(下载器):负责下载 Scrapy Engine(引擎)发送的所有 Requests 请求,并将 其获取到的 Responses 交还给 Scrapy Engine(引擎),由引擎交给 spider 来处理。 
  • spider(爬虫):它负责处理所有 Responses,从中分析提取数据,获取 Item 字段需要 的数据,并将需要跟进的 URL 提交给引擎,再次进入 Scheduler(调度器)。 
  • Item Pipeline(管道):它负责处理 spider 中获取到的 Item,并进行后期处理(详细分析、 过滤、存储等)。
  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能 的组件。 
  • SpiderMiddlewares(spider 中间件):你可以理解为是一个可以自定义扩展和操作引擎 和 spider 中间通信的功能组件(比如进入 spider 的 Response 和从 spider 出去的 Requests)

(二)Scrapy 的运作流程

代码写好,程序开始运行…
以下是各组件之间的对话:

  • 引擎:Hi!spider,你要处理哪一个网站?
  • spider:老大要我处理 xxxx.com。
  • 引擎:你把第一个需要处理的 URL 给我吧。
  • spider:给你,第一个 URL 是 xxxxxxx.com。
  • 引擎:Hi!调度器,我这有 request 请求你帮我排序入队一下。 
  • 调度器:好的,正在处理你等一下。 
  • 引擎:Hi!调度器,把你处理好的 request 请求给我。
  • 调度器:给你,这是我处理好的 request。
  • 引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个 request 请求
  • 下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个 request 下载失败了。 然后引擎告诉调度器,这个 request 下载失败了,你记录一下,我们待会儿再下载) 
  • 引擎:Hi!spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你 自己处理一下(注意!这儿 responses 默认是交给 def parse()这个函数处理的)
  • spider:(处理完毕数据之后对于需要跟进的 URL),Hi!引擎,我这里有两个结果,这 个是我需要跟进的 URL,还有这个是我获取到的 Item 数据。
  • 引擎:Hi!管道我这儿有个 item 你帮我处理一下!调度器!这是需要跟进 URL 你帮我 处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
  • 管道:好的,现在就做! 注意:只有当调度器中不存在任何 request 了,整个程序才会停止(也就是说,对于下载 失败的 URL,Scrapy 也会重新下载。)

(三)Scrapy 爬虫步骤

一共需要 4 步:

  • 新建项目(Scrapy startproject xxx):新建一个新的爬虫项目
  • 明确目标(编写 items.py):明确你想要抓取的目标
  • 制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页
  • 存储内容(pipelines.py):设计管道存储爬取内容

Scrapy 源码分析

(一)spider

spider 类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接) 以及如何从网页的内容中提取结构化数据(爬取 item)。换句话说,spider 就是您定义爬取 的动作及分析某个网页的地方。
class Scrapy .spider 是最基本的类,所有编写的爬虫必须继承这个类。
主要用到的函数及调用顺序为:

  • __ init __():初始化爬虫名字和 start_urls 列表
  • start_requests():调用 make_requests_from url()生成 Requests 对象交给 Scrapy 下载并返 回 response
  • parse():解析 response,并返回 Item 或 Request(s 需指定回调函数)。Item 传给 Item pipline 持久化,而 Requests 交由 Scrapy 下载,并由指定的回调函数处理(默认 parse()),一直进 行循环,直到处理完所有的数据为止。

主要属性和方法

  • name
    定义 spider 名字的字符串。 例如:如果 spider 爬取 mywebsite.com,该 spider 通常会被命名为 mywebsite 
  • allowed_domains
    包含了 spider 允许爬取的域名(domain)的列表,可选。 
  • start_urls
    初始 URL 列表。当没有制定特定的 URL 时,spider 将从该列表中开始进行 爬取。 
  • start_requests(self)
    该方法必须返回一个可迭代对象(iterable)。该对象包含了 spider 用于爬取 (默认实现是使用 start_urls 的 url)的第一个 Request。 
  • parse(self,response)
    当请求 url 返回网页没有指定回调函数时,默认的 Request 对象回调函数。 用来处理网页返回的 response,以及生成 Item 或者 Request 对象。

(二)Parse()方法的工作机制

因为使用的 yield,而不是 return。parse 函数将会被当做一个生成器使用。Scrapy 会逐 一获取 parse 方法中生成的结果,并判断该结果是一个什么样的类型。
如果是 request 则加入爬取队列,如果是 item 类型则使用 pipeline 处理,其他类型则返 回错误信息。
Scrapy 取到第一部分的 request 不会立马就去发送这个 request,只是把这个 request 放 到队列里,然后接着从生成器里获取。
取尽第一部分的 request,然后再获取第二部分的 item,取到 item 了,就会放到对应的 pipeline 里处理。
parse()方法作为回调函数(callback)赋值给了 Request,指定 parse()方法来处理这些请 求 Scrapy .Request(url,callback=self.parse) 。
Request 对象经过调度,执行生成 Scrapy .http.response()的响应对象,并送回给 parse() 方法,直到调度器中没有 Request(递归的思路) 。
取尽之后,parse()工作结束,引擎再根据队列和 pipelines 中的内容去执行相应的操作。
程序在取得各个页面的 items 前,会先处理完之前所有的 request 队列里的请求,然后再 提取 items。
这一切的一切,Scrapy 引擎和调度器将负责到底。

(三)Logging

Scrapy 提供了 log 功能,可以通过 logging 模块使用。可以修改配置文件 settings.py,任 意位置添加下面两行,效果会清爽很多。
LOG_FILE = “boss.log”
LOG_LEVEL = “INFO”

(1)Log levels

Scrapy 提供 5 层 logging 级别:

  • CRITICAL - 严重错误(critical)
  • ERROR - 一般错误(regular errors)
  • WARNING - 警告信息(warning messages)
  • INFO - 一般信息(informational messages) 
  • DEBUG - 调试信息(debugging messages)

(2)logging 设置

通过在 settings.py 中进行以下设置可以配置 logging:。 LOG_ENABLED 默认: True,启用 logging。

  • LOG_ENCODING 默认: ‘utf-8’,logging 使用的编码。
  • LOG_FILE 默认: None,在当前目录里创建 logging 输出文件的文件名。
  • LOG_LEVEL 默认: ‘DEBUG’,log 的最低级别。
  • LOG_STDOUT 默认: False 如果为 True,进程所有的标准输出(及错误)将会被重定 向到 log 中。例如,执行 print (“hello”),其将会在 Scrapy log 中显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值