3请求报401_Python爬⾍进阶(九):httpscrapy请求与响应前⾔
在写系列教程的时候,很多时候我会以为⾃⼰写了⼀些东西,最后回头去看才发现完全没写到,就只能像这样赶紧补上⼀节。总的来说这都是因为我写东西不拉⼤纲(也许以后⽼板让我拉⼤纲我就会拉了),还有⼀点是写教程的时候我也在学习,如果我中间断了⼀会或者写的时间太长了,确实会发⽣最后回看教程发现少写东西的情况。这还不是最丢⼈的,看上去总有⼀天我会在结束⼀个教程,说完“我就讲到这⾥为⽌”之后再发现⾃⼰少写了东西,那会⼦才是丢⼈丢⼤发。
⾔归正传,在本节中我们介绍⼀下scrapy中的请求与响应,也介绍⼀下http中的请求与响应。
scrapy中的请求与响应
在scrapy中,表⽰请求与响应的是两个类,其全写分别是scrapy.http.Request和scrapy.http.Response。
1 Request
通过上⾯的部分我们可以得知,Request代表着⼀个http请求,它由爬⾍⽣成并且最后会⽣成⼀个Response。它的参数如下:
-url:本次请求的链接。
-callback:本次请求的回调函数。
-method:本次请求的⽅法,默认为GET。
-meta:本次请求的metadata,为字典。
-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:此响应的头部
-**我们可⽤(str)获取字段名为str的第⼀个值,⽤list(str)获取字段名为str的列表。
-body:此响应的响应体,为⼀个字节串。要将其作为字符串解析,请使⽤scrapy.http.TextResponse(下⽂有关于这个类的解析)。
-ip_address:发送此相应的服务器的地址
除此之外,它还有部分属性我们未提及到。它的三个函数urljoin、follow、follow_all在上⼀节有讲解。
5 TextResponseurl编码和utf8区别
相⽐于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 www.abc/xxx/yyy举例,其传参形式为www.abc/xxx/yyy?
attr1=mmm&其中?隔开参数与url,&隔开每个参数。
对于POST⽽⾔,其通常⽤于表单的提交(表单也可以采⽤GET提交)。POST⽅式的参数在请求体中。
3 请求体/响应体
对于爬⾍⽽⾔,我们主要需要解析响应体,构造请求体。各种链接的响应体需要具体的分析,很难详细的讲出。我们还是⽤Fiddler截取响应作为例⼦,⽐如我们访问微博⾸页时的响应体:
可以看到其返回了⼀个html⽂件。
⾄于ajax请求的响应体,可以查看本系列的进阶(⼋)。
最后
都看到这了,不来个点赞评论转发关注吗~关注我,不定时更新各种关于编程的⽂章,⼀起做个冲浪⾼⼿吧~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论