返回介绍

2.2 Request 和 Response 对象

发布于 2024-02-05 21:13:20 字数 3724 浏览 0 评论 0 收藏 0

通过上述讲解,大家已经了解了Request和Response对象在Scrapy框架中的重要性,下面详细介绍这两个对象。

2.2.1 Request对象

Request对象用来描述一个HTTP请求,下面是其构造器方法的参数列表:

Request(url[, callback, method='GET', headers, body, cookies, meta,
       encoding='utf-8', priority=0, dont_filter=False, errback])

下面依次介绍这些参数。

url(必选)

请求页面的url地址,bytes或str类型,如'http://www.python.org/doc'。

callback

页面解析函数, Callable类型,Request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递该参数,默认调用Spider的parse方法。

method

HTTP请求的方法,默认为'GET'。

headers

HTTP请求的头部字典,dict类型,例如{'Accept': 'text/html', 'User-Agent':Mozilla/5.0'}。如果其中某项的值为None,就表示不发送该项HTTP头部,例如{'Cookie': None},禁止发送Cookie。

body

HTTP请求的正文,bytes或str类型。

cookies

Cookie信息字典,dict类型,例如{'currency': 'USD', 'country': 'UY'}。

meta

Request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件Item Pipeline。其他组件可以使用Request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,详见Response的meta属性。

encoding

url和body参数的编码默认为'utf-8'。如果传入的url或body参数是str类型,就使用该参数进行编码。

priority

请求的优先级默认值为0,优先级高的请求优先下载。

dont_filter

默认情况下(dont_filter=False),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为True,可以使请求避免被过滤,强制下载。例如,在多次爬取一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为True。

errback

请求出现异常或者出现HTTP错误时(如404页面不存在)的回调函数。

虽然参数很多,但除了url参数外,其他都带有默认值。在构造Request对象时,通常我们只需传递一个url参数或再加一个callback参数,其他使用默认值即可,代码如下:

>>> import scrapy
>>> request = scrapy.Request('http://books.toscrape.com/')
>>> request2 = scrapy.Request('http://quotes.toscrape.com/', callback=self.parseItem)

在实际应用中,我们几乎只调用Request的构造器创建对象,但也可以根据需求访问Request对象的属性,常用的有以下几个:

url

method

headers

body

meta

这些属性和构造器参数相对应,这里不再重复解释。

2.2.2 Response对象

Response对象用来描述一个HTTP响应,Response只是一个基类,根据响应内容的不同有如下子类:

TextResponse

HtmlResponse

XmlResponse

当一个页面下载完成时,下载器依据HTTP响应头部中的Content-Type信息创建某个Response的子类对象。我们通常爬取的网页,其内容是HTML文本,创建的便是HtmlResponse对象,其中HtmlResponse和XmlResponse是TextResponse的子类。实际上,这3个子类只有细微的差别,这里以HtmlResponse为例进行讲解。

下面介绍HtmlResponse对象的属性及方法。

url

HTTP响应的url地址,str类型。

status

HTTP响应的状态码,int类型,例如200,404。

headers

HTTP响应的头头部,类字典类型,可以调用get或getlist方法对其进行访问,例如:

response.headers.get('Content-Type')
response.headers.getlist('Set-Cookie')

body

HTTP响应正文,bytes类型。

text

文本形式的HTTP响应正文,str类型,它是由response.body使用response.encoding解码得到的,即

reponse.text = response.body.decode(response.encoding)

encoding

HTTP响应正文的编码,它的值可能是从HTTP响应头部或正文中解析出来的。

request

产生该HTTP响应的Request对象。

meta

即response.request.meta,在构造Request对象时,可将要传递给响应处理函数的信息通过meta参数传入;响应处理函数处理响应时,通过response.meta将信息取出。

selector

Selector对象用于在Response中提取数据(选择器相关话题在后面章节详细讲解)。

xpath(query)

使用XPath选择器在Response中提取数据,实际上它是response.selector.xpath方法的快捷方式(选择器相关话题在后面章节详细讲解)。

css(query)

使用CSS选择器在Response中提取数据,实际上它是response.selector.css方法的快捷方式(选择器相关话题在后面章节详细讲解)。

urljoin(url)

用于构造绝对url。当传入的url参数是一个相对地址时,根据response.url计算出相应的绝对url。例如,response.url为http://www.example.com/a,url为b/index.html,调用response.urljoin(url)的结果为http://www.example.com/a/b/index.html。

虽然HtmlResponse对象有很多属性,但最常用的是以下的3个方法:

xpath(query)

css(query)

urljoin(url)

前两个方法用于提取数据,后一个方法用于构造绝对url。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文