请求是Request对象,响应是Responses对象。请求是通过程序访问URL,URL封装在Request对象内,URL所在的服务器接收到URL请求后,会返回与URL相关的内容,返回的内容封装在Responses对象内。

1、 Request对象
Request对象封装了爬虫要爬取的URL,Request对象被放置在Scrpy调度器内,Scrpy调度器实际上是一个队列管理器,负责管理Request对象的入队与出队。

equest对象有两个方向入队:一个方向是种子URL,Scrapy引擎会把种子URL封装为Request对象,加入到Request对象队列;一个方向是爬虫程序解析出的URL,爬虫程序会把解析出的URL封装为Request对象,提交给Scrapy引擎,Scrapy引擎将Request对象加入队列。
Request对象的出队来自于Scrapy引擎的请求,Scrapy引擎会向Scrapy调度器发送Request对象出队请求,Scrapy调度器从队列头部获取Request对象提交给Scrapy引擎,并从队列中移除该Request对象。
如何创建一个Request对象?
Request对象是Request类的实例化,Request类提供了Request()构造方法创建一个Request对象,或者说实例化一个Request对象。
构造方法声明如下:
class scrapy.http.Request( url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
从构造方法的声明可以看出,Request类的构造方法是在scrapy框架的http模块内定义的,构造方法会返回一个实例化的Request对象。
参数url是请求的URL。
callback是可选参数,该参数是一个回调函数。当Scrapy下载管理器发送Request请求并返回Responses对象后,会调用该回调函数并传入Responses对象。若没有提供该回调函数,Scrapy下载管理器会调用Spider的parse()方法。
method是可选参数,设置HTTP的请求方法,默认是GET请求方式。
headers是可选参数,设置HTTP的请求头,该参数是字典类型的数据,关于HTTP请求头请查阅相关参考资料。
body是可选参数,设置HTTP的请求主体,当请求方式为POST时,用于存储post的参数和参数数据。详细内容请查阅相关参考资料。
cookies是可选参数,设置HTTP的请求cookies,cookies存储了客户端访问服务器的信息。详细内容请查阅相关参考资料。
meta是可选参数,设置HTTP的请求meta,该参数是字典类型的数据,关于HTTP请求meta请查阅相关参考资料。另外,通过设置meta数据,可以在管道类的不同方法中传递额外的数据。
encoding是可选参数,用于设置请求URL及返回内容的编码方式,默认值是utf-8,可以设置其它编码方式。
priority是可选参数,默认值是0,用于设置Request对象的优先级,Scrapy调度器会根据Request对象的优先级调整队列顺序。该参数的数值越大,优先级越高。
dont_filter是可选参数,用于设置Scrapy调度器对Request对象的去重,若多个Request对象的URL地址相同,Scrapy调度器会过滤重复的Request对象。dont_filter默认值是False,允许Scrapy调度器过滤重复的Request对象。若设置为True,该Request对象不参与Scrapy调度器的过滤。
errback是可选参数,该参数是一个回调函数,该函数处理请求发生的异常。当执行Request请求发生异常时(如404 HTTP等异常),该函数被调用,并传入Responses实例Twisted Failure实例对象。
2、 Response对象
Response对象封装了Request请求返回的内容。Scrapy下载管理器会把对应Request请求下载的内容封装到Response对象,并调用Request对象设置的回调函数,Response对象作为回调函数传入的实参。若Request对象没有设置回调函数,Scrapy下载管理器会调用Spider默认的parse()方法,来解析下载的网页内容。
Response对象是Response类的实例化,Response类下有TextResponse 、 HtmlResponse 、XmlResponse子类。

Response对象是由Scrapy下载管理器实例化的,一般不需要程序对其实例化。下面主要介绍Response类及其子类的属性和方法,这些属性和方法对解析下载的网页内容是非常必要的。
Response类
Response类是TextResponse 、 HtmlResponse 、XmlResponse类的基类。
Response类的主要属性如下表所示:

TextResponse类
TextResponse继承于Response类,用于处理文本和bytes数据,如文本文件、图像、音视频等内容。
TextResponse类的主要属性如下表所示:

TextResponse类的主要方法如下表所示:

HtmlResponse类
HtmlResponse类是TextResponse类的子类,HtmlResponse类根据返回的网页内容中的http-equiv,来确定网页内容采用的字符集,然后将网页内容转换为unicode编码。
HtmlResponse类的主要方法如下表所示:

XmlResponse类
XmlResponse类是TextResponse类的子类,HtmlResponse类根据返回的XML内容的声明行,来确定XML采用的字符集,然后将XML内容转换为unicode编码。