爬虫框架Scrapy(4)Spider的用法

news/2024/7/19 10:50:19 标签: python, 爬虫

文章目录

    • 一. Spider 的用法
        • 1. Spider 运行流程
        • 2. Spider 类分析
    • 二. 请求与响应
        • 1. Request 对象
        • 2. Response 对象

一. Spider 的用法

在 Scrapy 中,要抓取网站的链接配置、抓取逻辑、解析逻辑里其实都是在 Spider 中配置的。本节我们就专门了解一下 Spider 的基本用法。

1. Spider 运行流程

在实现 Scrapy 爬虫项目时,最核心的类便是 Spider 类了,它定义了如何爬取某个网站的流程和解析方式。简单来讲,Spider 要做的事就是如下两件:

  • 定义爬取网站的动作
  • 分析爬取下来的网页

对于 Spider 类来说,整个爬取循环如下所述:

  • 以初始的 URL 初始化 Request,并设置回调函数。当该 Request 成功请求并返回时,将生成 Response,并作为参数传给该回调函数;
  • 在回调函数内分析返回的网页内容。返回结果可以有两种形式,一种是解析到的有效结果返回字典或 Item 对象。下一步可经过处理后(或直接)保存,另一种是解析的下一个(如下一页)链接,可以利用此链接构造 Request 并设置新的回调函数,返回 Request;
  • 如果返回的是字典或 Item 对象,可通过 Feed Exports 等形式存入到文件,如果设置了 Pipeline 的话,可以经由 Pipeline 处理(如过滤、修正等)并保存;
  • 如果返回的是 Reqeust,那么 Request 执行成功得到 Response 之后会再次传递给 Request 中定义的回调函数,可以再次使用选择器来分析新得到的网页内容,并根据分析的数据生成 Item。

通过以上几步循环往复进行,便完成了站点的爬取。

2. Spider 类分析

在前面的例子中我们定义的 Spider 是继承自 scrapy.spiders.Spider,这个类是最简单最基本的 Spider 类,每个其他的 Spider 必须继承这个类,还有其他一些特殊 Spider 类也都是继承自它。 这个类里提供了 start_requests () 方法的默认实现,读取并请求 start_urls 属性,并根据返回的结果调用 parse () 方法解析结果。另外它还有一些基础属性,下面对其进行讲解:

  • name:爬虫名称,是定义 Spider 名字的字符串。Spider 的名字定义了 Scrapy 如何定位并初始化 Spider,所以其必须是唯一的。 不过我们可以生成多个相同的 Spider 实例,这没有任何限制。 name 是 Spider 最重要的属性,而且是必须的。如果该 Spider 爬取单个网站,一个常见的做法是以该网站的域名名称来命名 Spider。 例如,如果 Spider 爬取 mywebsite.com ,该 Spider 通常会被命名为 mywebsite ;
  • allowed_domains:允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取;
  • start_urls:起始 URL 列表,当我们没有实现 start_requests () 方法时,默认会从这个列表开始抓取;
  • custom_settings:这是一个字典,是专属于本 Spider 的配置,此设置会覆盖项目全局的设置,而且此设置必须在初始化前被更新,所以它必须定义成类变量;
  • crawler:此属性是由 from_crawler () 方法设置的,代表的是本 Spider 类对应的 Crawler 对象,Crawler 对象中包含了很多项目组件,利用它我们可以获取项目的一些配置信息,如最常见的就是获取项目的设置信息,即 Settings;
  • settings:是一个 Settings 对象,利用它我们可以直接获取项目的全局设置变量。

除了一些基础属性,Spider 还有一些常用的方法,在此介绍如下:

  • start_requests ():此方法用于生成初始请求,它必须返回一个可迭代对象,此方法会默认使用 start_urls 里面的 URL 来构造 Request,而且 Request 是 GET 请求方式。如果我们想在启动时以 POST 方式访问某个站点,可以直接重写这个方法,发送 POST 请求时我们使用 FormRequest 即可。
  • parse ():当 Response 没有指定回调函数时,该方法会默认被调用,它负责处理 Response,处理返回结果,并从中提取出想要的数据和下一步的请求,然后返回。该方法需要返回一个包含 Request 或 Item 的可迭代对象。
  • closed ():当 Spider 关闭时,该方法会被调用,在这里一般会定义释放资源的一些操作或其他收尾操作。

Scrapy 除了提供了 Spider 类作为基类进行拓展,还提供了 CrawlSpider、XMLFeedSpider、CSVFeedSpider 和 SitemapSpider 等类来实现不同的爬虫任务。

二. 请求与响应

在编写 Spider 模块中接触最紧密的是请求和响应。

1. Request 对象

一个 Request 对象代表着一个 HTTP 请求,通常在 Spider 类中产生,然后传递给下载器,最后返回一个响应。类原型:

python">class scrapy.http.Request(url,callback,method='GET',headers,body,cookies,meta,encoding='utf-8',priority=0,dont_filter=False,errback)

构造参数说明:

参数类型功能
urlstring请求的链接
callbackcallable指定用于解析请求响应的方法。如果没有指定,默认使用 spider 的 parse() 方法
methodstringHTTP 请求方式,默认为 GET
metadict可以用来初始化 Request.meta 属性
bodystr or unicode请求的 body
headersdict请求头;如果传入的是 None,请求头不会被发送
cookiesdict or list请求的 cookie 信息
encodingstring请求的编码,默认为 UTF-8
priorityint请求的优先级,默认为0
dont_filterboolean表明该请求不应由调度器过滤,默认为 False
errbackcallable如果在处理请求的过程中出现异常,指定的方法将会被调用

cookies 参数的设置有两种方式:

  • 使用字典发送:

    python">request_with_cookies = Request(url="http://www.example.com",
                                   cookies={'currency': 'USD', 'country': 'UY'})
    
  • 使用字典列表发送

    python">request_with_cookies = Request(url="http://www.example.com",
                                   cookies=[{'name': 'currency',
                                             'value': 'USD',
                                             'domain': 'example.com',
                                             'path': '/currency'}]
                                  )
    

后一种形式允许定制 cookie 的属性 domain 和 path 属性。这只有在保存Cookie 用于以后的请求时才有用。

下面我们着重介绍一下 FormRequest 类,这是 Request 的子类,专门用来处理 HTML 表单,尤其对隐藏表单的处理非常方便,适合用来完成登录操作。类原型:

python">class scrapy.http.FormRequest(url[, formdata, ...])

其中构造参数 formdata 可以是字典,也可以是可迭代的 (key,value) 元组,代表着需要提交的表单数据,如下示例:

python">return FormRequest(url="http://www.example.com/post/action",
                  formdata={'name': 'John Doe', 'age': '27'},
                  callback=self.after_login)

通常网站通过 <input type='hidden'> 实现对某些表单字段的预填充,如何处理这种隐藏表单呢?FormRequest 类提供了一个类方法 from_response,方法原型如下:

python">from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, ...])

参数说明如下:

参数类型功能
responseResponseobject包含将用于预填充表单字段的 HTML 表单的响应
formnamestring如果不为 None,将使用 name 属性设置为此值的形式
formidstring如果给定,将使用 id 属性设置为此值的形式
formxpathstring如果给定,将使用匹配 xpath 的第一个表单
formcssstring如果给定,将使用匹配 css 选择器的第一个形式
formnumberinteger当响应包含多个表单时,该参数指定使用第几个表单,第一个表单数字(也是默认)是0
formdatadict该参数填充表单中属性的值;如果响应 <form> 元素中已存在字段,则参数中传递的值将会覆盖预填充的值
clickdatadict查找控件被点击的属性;如果没有提供,表单数据将被提交,模拟第一个可点击元素的点击
dont_clickboolean如果为 True,表单数据将在不点击任何元素的情况下提交

2. Response 对象

Response 对象代表着 HTTP 响应,Response 通常是从下载器获取然后交给爬虫进行处理。类原型:

python">scrapy.http.Response(url[, status=200, headers=None, body=b'', flags=None, request=None])

构造参数说明如下:

参数类型功能
urlstring响应的 URL
headersdict响应头信息
statusinteger响应码,默认为 200
bodystring响应体
metadict用来初始化 Request.meta
flagslist用来初始化 Request.flags

Response 有一个子类 TextResponse,TextResponse 在 Response 的基础上添加了智能编码的功能。类原型:

python">scrapy.http.TextResponse(url[, encoding[, ...]])

构造参数 encoding 是一个包含编码的字符串。如果使用一个 unicode 编码的 body 构造出 TextResponse 实例,那 body 属性会使用 encoding 进行编码。

TextResponse 类除了具有 Response 的属性,还拥有自己的属性和方法:

参数功能
encoding包含编码的字符串
selector以当前响应为目标的选择器实例
body_as_unicode返回 unicode 编码的响应体内容
xpath(query)等价于 TextResponse.selector.xpath(query)
css(query)等价于 TextResponse.selector.css(query)

TextResponse 还有两个子类 HtmlResponse 和 XmlResponse ,用法大同小异,不再赘述。


http://www.niftyadmin.cn/n/1190202.html

相关文章

爬虫框架Scrapy(5)DownLoader Middleware 的用法

文章目录四. DownLoader Middleware 的用法1. 使用说明2. 核心方法3. 项目实战四. DownLoader Middleware 的用法 Downloader Middleware 即下载中间件&#xff0c;它是处于 Scrapy 的 Request 和 Response 之间的处理模块。Scheduler 从队列中拿出一个 Request 发送给 Downlo…

隐藏Tengine的版本信息

http {.....server_tokens on;server_info on;server_tag bass;reset_timedout_connection on;keepalive_timeout 120;keepalive_requests 100;sendfile on;tcp_nodelay on;tcp_nopush off;..... }当网页不存在时会显示如下图: 修改为: serv…

爬虫框架Scrapy(6)Spider Middleware 的用法

文章目录五. Spider Middleware 的用法1. 使用说明2. 核心方法五. Spider Middleware 的用法 Spider Middleware 是介入到 Scrapy 的 Spider 处理机制的钩子框架。当 Downloader 生成 Response 之后&#xff0c;Response 会被发送给 Spider&#xff0c;在发送给 Spider 之前&a…

android graphic(15)—fence

为何须要fence fence怎样使用 软件实现的opengl 硬件实现的opengl 上层使用canvas画图 上层使用opengl画图 下层合成 updateTexImage doComposeSurfaces DisplayDevice和FramebufferSurface 关于fence。不错的參考文章http://blog.csdn.net/jinzhuojun/article/details/…

爬虫框架Scrapy(7)Itme Pipeline 的用法

文章目录一. Itme Pipeline 的用法1. 实现 Item Pipeline2. 核心方法&#xff08;1&#xff09;process_item(item, spider)&#xff08;2&#xff09;open_spider(self, spider)&#xff08;3&#xff09;close_spider(spider)&#xff08;4&#xff09;from_crawler(cls, cra…

Vue.js 基础指令实例讲解(各种数据绑定、表单渲染大总结)——新手入门、高手进阶第一篇...

Vue.js 是一套构建用户界面的渐进式框架。他自身不是一个全能框架——只聚焦于视图层。因此它非常容易学习&#xff0c;非常容易与其它库或已有项目整合。在与相关工具和支持库一起使用时&#xff0c;Vue.js 也能完美地驱动复杂的单页应用。他的语法和 AngularJS特别相像&#…

爬虫框架Scrapy(8)使用 LinkExtractor 提取链接

文章目录使用 LinkExtractor 提取链接1. 提取链接的方法&#xff08;1&#xff09;使用Selector&#xff08;2&#xff09;使用LinkExtractor2. LinkExtractor 提取链接的规则&#xff08;1&#xff09;allow&#xff08;2&#xff09;deny&#xff08;3&#xff09;allow_doma…

百度编辑器图片在线流量返回url改动

百度编辑器中返回的是我们server中的url&#xff0c;有时并非我们须要的&#xff0c;比方图文编辑中。我想在线浏览上传过的图片 &#xff0c;那么我返回的应该是腾讯server上面的url。这样才不会被腾讯的过滤器过来掉&#xff0c;全部我们就须要改动在线管理的图片获取路径详细…