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

目录

前言

scrapy中的请求与响应

1 Request

2 FormRequest

3 JsonRequest

4 Response

5 TextResponse

http中的请求与响应

1 请求头/响应头

2 状态码

3 请求方式

3 请求体/响应体


前言

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

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

scrapy中的请求与响应

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

1 Request

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

-url:本次请求的链接。

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

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

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

-**此metadata中可以附加一些能被scrapy单独识别的项,具体请参照https://docs.scrapy.org/en/2.4/topics/request-response.html#request-meta-special-keys

-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 www.abc.com/xxx/yyy举例,其传参形式为www.abc.com/xxx/yyy?attr1=mmm&attr2=nnn......其中?隔开参数与url,&隔开每个参数。

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

3 请求体/响应体

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫进阶涉及到一些高级技术和技巧,以下是一些你可以学习和探索的主题: 1. 多线程和多进程:使用多线程或多进程可以提高爬虫的效率,同时处理多个请求或任务。 2. 使用代理:在爬取网页时,你可能会被网站封禁IP,使用代理可以轮流切换IP地址来规避封禁。 3. 反反爬虫策略:有些网站会采取一些手段防止爬虫,你需要学习如何识别和应对这些策略,比如验证码、页面解密等。 4. 使用Cookie和Session:有些网站会使用Cookie和Session来验证用户身份,你需要学习如何在爬虫中模拟登录和保持会话状态。 5. 使用数据库:将爬取到的数据存储到数据库中可以方便后续的数据分析和处理。 6. 使用框架和库:学习使用一些流行的爬虫框架和库,比如Scrapy、BeautifulSoup、Requests等,可以大大简化爬虫的开发和管理。 7. 高级数据解析和提取:学习使用正则表达式、XPath、CSS选择器等高级技术来解析和提取网页中的数据。 8. 动态网页爬取:学习使用Selenium等工具来爬取动态生成的网页内容,比如通过JavaScript异步加载的数据。 9. 分布式爬虫:学习如何构建分布式爬虫系统,可以提高爬取效率和可靠性。 10. 爬虫的合法性和道德问题:学习了解相关法律法规和伦理道德,确保你的爬虫行为合法合规。 这些都是Python爬虫进阶的一些方向,你可以根据自己的兴趣和需求选择学习的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值