龙空技术网

Python爬虫进阶(九):http&scrapy请求与响应

AugustTheo 130

前言:

今天同学们对“scrapy发送ajax请求”都比较注意,大家都想要剖析一些“scrapy发送ajax请求”的相关资讯。那么小编在网络上网罗了一些关于“scrapy发送ajax请求””的相关知识,希望同学们能喜欢,姐妹们一起来学习一下吧!

前言

在写系列教程的时候,很多时候我会以为自己写了一些东西,最后回头去看才发现完全没写到,就只能像这样赶紧补上一节。总的来说这都是因为我写东西不拉大纲(也许以后老板让我拉大纲我就会拉了),还有一点是写教程的时候我也在学习,如果我中间断了一会或者写的时间太长了,确实会发生最后回看教程发现少写东西的情况。这还不是最丢人的,看上去总有一天我会在结束一个教程,说完“我就讲到这里为止”之后再发现自己少写了东西,那会子才是丢人丢大发。

言归正传,在本节中我们介绍一下scrapy中的请求与响应,也介绍一下http中的请求与响应。

scrapy中的请求与响应

在scrapy中,表示请求与响应的是两个类,其全写分别是scrapy.http.Request和scrapy.http.Response。

1 Request

通过上面的部分我们可以得知,Request代表着一个http请求,它由爬虫生成并且最后会生成一个Response。它的参数如下:

-url:本次请求的链接。

-callback:本次请求的回调函数。

-method:本次请求的方法,默认为GET。

-meta:本次请求的metadata,为字典。

-**此metadata中可以附加一些能被scrapy单独识别的项,具体请参照

-body:本次请求的主体,是一个bytes(字节串),或者一个字符串。

-headers:本次请求的请求头,是一个字典。

-cookies:本次请求携带的cookies,它可以是一个字典,也可以是一个字典的列表。

-encoding:本次请求的编码,默认为utf8。

-priority:本次请求的优先级,是一个数字,默认为0,数字越高执行越优先。

-dont_filter:为一个布尔值,默认为false。这个开关打开时让管道不会对其进行查重。

-cb_kwargs:为一个字典,在请求返回时作为参数发送到其回调函数。

除此之外,它还有两个可选参数,用于报错处理和日志。

2 FormRequest

顾名思义,FormReuqest是一个用于提交表单的请求,它的全写为scrapy.http.FormRequest。它的参数为(url[,formrequest,]),其中formdata为要提交的表单的数据,是一个字典或者元组。并且,它适用上节介绍的Request类中的可选参数,例如callback。

除此之外,FormRequest还有方法from_response,它可以用一个响应填写表单。其具体参数和用法请参考官方文档。

3 JsonRequest

顾名思义,这个类用于提交JSON请求。其全写为scrapy.http.JsonRequest。其具体参数和用法请参考官方文档。

4 Response

Response代表着一个响应。在scrapy中,它由下载器下载并发送给爬虫处理(也就是其对应请求的回调函数)。因此,我们并不用手动实例化Response。Response含有以下属性:

-url:发送响应的url

-status:此响应的状态值

-headers:此响应的头部

-**我们可用Response.headers.get(str)获取字段名为str的第一个值,用Response.headers.getlist(str)获取字段名为str的列表。

-body:此响应的响应体,为一个字节串。要将其作为字符串解析,请使用scrapy.http.TextResponse(下文有关于这个类的解析)。

-ip_address:发送此相应的服务器的地址

除此之外,它还有部分属性我们未提及到。它的三个函数urljoin、follow、follow_all在上一节有讲解。

5 TextResponse

相比于Response类,TextResponse类添加了编码功能。它的属性如下:

-text:响应体的字符串形式

-encoding:响应的编码形式

-selector:一个用于此响应的选择器。A Selector instance using the response as target. The selector is lazily instantiated on first access.(摘自官方文档)

TextResponse支持XPath和css解析器。由于其为Response的子类,它也支持上文中提到的三个方法urljoin等。

http中的请求与响应

十分惭愧到现在我才发现没有介绍这一部分。

读者在阅读上文时,是否会对“请求头”、“请求体”、“响应头”等名词产生疑惑?这是因为它们是针对http中的请求与响应而言的。

关于请求与响应的构成,我们以Fiddler作为素材举例:

1 请求头/响应头

请求头/响应头是一类metadata,类似于字典,储存着浏览器与服务器之间需要约定的信息。

为了让读者对请求头有更清晰的认识,我截取了一个更加详细的请求头,它包含了cookies和referer:

对于爬虫而言,需要注意的请求头有UA、referer与cookies(session本质上也是cookies)。常用的响应头字段请自行查询。

2 状态码

状态码描述本次请求的响应的状态,为一个三位数字,其中:

-1**:表示请求已被接受,需要进一步处理。一般情况下不会收到此类状态码。

-2**:表示请求已被接受并处理。其中,200为请求已成功,期望的响应已返回。为一般正常情况下返回的状态码。

-3**:表示此请求需要客户端的进一步操作,通常被用于重定向。

-4**:表示此请求遭到了一个错误。其中401为需要用户验证,403为拒绝访问,404为找不到所请求的资源。

-5**/6**:表示此请求的服务器发生了错误。

对于爬虫而言,我们期望得到200状态码。

3 请求方式

也就是上文中提到的请求方法,作为爬虫我们基本上只用GET于POST。这两种方式的区别在于请求体是否为空。

对于GET而言,如果其带参会显式的出现在链接上。以url 举例,其传参形式为......其中?隔开参数与url,&隔开每个参数。

对于POST而言,其通常用于表单的提交(表单也可以采用GET提交)。POST方式的参数在请求体中。

3 请求体/响应体

对于爬虫而言,我们主要需要解析响应体,构造请求体。各种链接的响应体需要具体的分析,很难详细的讲出。我们还是用Fiddler截取响应作为例子,比如我们访问微博首页时的响应体:

可以看到其返回了一个html文件。

至于ajax请求的响应体,可以查看本系列的进阶(八)。

最后

都看到这了,不来个点赞评论转发关注吗~关注我,不定时更新各种关于编程的文章,一起做个冲浪高手吧~

标签: #scrapy发送ajax请求 #scrapy post请求